close three builtin-shadow warning coverage gaps (#746) (#808) (dcf22ba)
Fixed
carve ssh config + known_hosts out of read-denylist (#579 O2) (#805) (badd34a)
2026-07-31
v5.83.7
2026-07-31
Changed
extract two named concerns over the 350-LOC ceiling (#782) (#801) (d7df7ea)
add anthropic-direct query.test.ts for subagentId threading (#634) (#803) (49b8afd)
Fixed
accept common truthy values for TELEGRAM_VERBOSE (#683) (#802) (29b0903)
2026-07-31
v5.83.6
2026-07-31
Fixed
stop a blank environment variable from permanently shadowing the real value in afk.env — a shell profile with export OPENAI_API_KEY="" masked the key in ~/.afk/config/afk.env (dotenv's override: false skip is presence-based, not value-based), so an OpenAI-compatible-only operator was told to "set OPENAI_API_KEY" for a key they had already set, after the auth chain fell through to ~/.codex/auth.json
stop a blank env var from shadowing the real value in afk.env (#800) (91c80ce)
2026-07-31
v5.83.5
2026-07-31
Fixed
keep the hanging indent when a list or blockquote token exceeds the wrap budget (#798) (532f78d)
2026-07-31
v5.83.4
2026-07-31
Fixed
tick the status line on a 30s timer so the quota reset countdown and the stale-reading marker stay true on an idle session instead of freezing at their last event-driven paint
stop the turn footer promising pause-and-auto-resume when the runtime will not deliver it — the promise is now conditional on autoResumeOnUsageLimit and on the reset landing inside the retry layer's two-hour wait ceiling
schedule clock-derived quota repaints and condition the auto-resume promise (#791) (53c90e6)
2026-07-31
v5.83.3
2026-07-31
Fixed
stop the sweep reaping live trees and discarding ignored files (#759) (#770) (16c4cd9)
enforce the per-node tool budget by wind-down, not by killing the node (#772) (71e6560)
2026-07-31
v5.83.2
2026-07-31
Fixed
regenerate the env-registry var count so scan:env:check passes (#792) (6b6b30a)
2026-07-31
v5.83.1
2026-07-31
Fixed
refresh the system-prompt date line when the local day rolls over (#784) (180882f)
kill the unbounded post-first-byte round with a progress-aware stall watchdog (#762) (#763) (219e0b6)
2026-07-31
v5.83.0
2026-07-31
Added
warn in the turn footer once a subscription rolling window passes 80% used, with its reset countdown and the note that AFK pauses and auto-resumes at the cap
make the subscription-usage indicator severity-graded and time-aware (#765) (42a7a13)
Changed
grade the status-line usage indicator by severity — per-window tone, the binding window's reset countdown, a stale-reading marker, and drop-last priority so a critical reading survives a narrow terminal (9d2b28d)
2026-07-31
v5.82.13
2026-07-31
Fixed
block SSRF egress to internal hosts in web_scrape (#575) (#750) (8a9e586)
preserve a failed skill fork's partial output (#767) (e7d8cad)
2026-07-31
v5.82.12
2026-07-31
Fixed
stop the citation contract forcing a nested git dispatch (#726) (#777) (f94cbe7)
2026-07-31
v5.82.11
2026-07-31
Fixed
clamp agent frame head rows to terminal width (#786) (03af774)
2026-07-30
v5.82.10
2026-07-30
Fixed
bound grouped tool summaries to terminal width (#773) (d52dbf2)
2026-07-30
v5.82.9
2026-07-30
Fixed
resolve the default create base at the calling session's anchor (#760) (#769) (b4192bd)
2026-07-30
v5.82.8
2026-07-30
Fixed
follow AFK_HOME in the credential floor + reject overly broad subagent cwd/writeRoots (#753) (2675eaf)
2026-07-30
v5.82.7
2026-07-30
Fixed
classify git worktree add and git clone as mutating in the read-only guard (#768) (e94e631)
2026-07-30
v5.82.6
2026-07-30
Fixed
split ttfb_timeout out of the rate_limit phase (#766) (97d8e3d)
2026-07-29
v5.82.5
2026-07-29
Fixed
send the extended-cache-ttl beta in api-key mode so the 1h TTL is honored (#757) (#758) (a4d973d)
2026-07-29
v5.82.4
2026-07-29
Changed
pin the grow-eviction width-resize defect the #540 guards cannot see (#755) (b673c60)
Fixed
archive eviction paths as logical lines so scrolled-off content reflows (#540) (#756) (f21234b)
2026-07-29
v5.82.3
2026-07-29
Fixed
drain bootstrap warnings after the startup screen clear (#745) (#751) (4f85988)
2026-07-29
v5.82.2
2026-07-29
Fixed
latch launch failures so browser_* stops retrying a cold chromium launch (#722) (#748) (4819481)
2026-07-29
v5.82.1
2026-07-29
Fixed
advertise presence for fresh sessions so Telegram AFK can discover them (#738) (575989a)
re-check domain policy on the URL open() lands on (#576) (#749) (57af639)
floor password-store and browser secret trees for reads (#735) (4c1b3d5)
2026-07-29
v5.82.0
2026-07-29
Added
warn when an agent file shadows a read-only builtin (+ ADR 0002) (#739) (ce5ef4e)
2026-07-28
v5.81.8
2026-07-28
Fixed
stop a skill fork from re-dispatching itself (#737) (963b85f)
2026-07-28
v5.81.7
2026-07-28
Fixed
share the read denylist with the bash surface (#734) (1640f9b)
2026-07-28
v5.81.6
2026-07-28
Fixed
flush logical lines to scrollback so resize reflow stops splitting words and dropping indent (#665) (71e5450)
2026-07-28
v5.81.5
2026-07-28
Fixed
gate witness seal on a purpose-built fork marker, not the output cap (#725) (e3d392d)
2026-07-28
v5.81.4
2026-07-28
Changed
drop no-op fill redaction, correct stale web/browser docs (#727) (6e1ee85)
Fixed
allow reads of ~/.afk/config/mcp.json (exact-file denylist carve-out) (#728) (b2f50c7)
2026-07-28
v5.81.3
2026-07-28
Fixed
reach the chromium-missing install hint (#721) (#729) (dd39451)
2026-07-27
v5.81.2
2026-07-27
Fixed
interleave ◦ progress lines into the live preview chronologically (#719) (4490337)
2026-07-27
v5.81.1
2026-07-27
Fixed
route sub-agent lane and /bgsub width through getTerminalWidth (#720) (c7e5996)
2026-07-27
v5.81.0
2026-07-27
Added
emit a blocked-on-human marker while an elicitation waits (#718) (ad596c8)
2026-07-26
v5.80.2
2026-07-26
Fixed
thread traceWriter into phase forks so they emit lifecycle events (#696) (bb1e3e5)
2026-07-26
v5.80.1
2026-07-26
Fixed
reap shipped worktrees and stop deleting branches that hold commits (#715) (5ac71b0)
2026-07-26
v5.80.0
2026-07-26
Added
pid liveness + heartbeat + schema version on presence records (#716) (062079b)
2026-07-26
v5.79.0
2026-07-26
Added
record stop_reason on subagent terminal rows and flag partial results (#713) (12691e4)
2026-07-26
v5.78.2
2026-07-26
Fixed
emit hook_decision for silently-denied tool calls, attribute blocks to forks (#714) (2ec5df1)
2026-07-26
v5.78.1
2026-07-26
Fixed
support history compaction on the openai-compatible responses wire (#653) (#700) (f9f3eb6)
2026-07-26
v5.78.0
2026-07-26
Added
show subscription quota in the REPL status line (#712) (eb9a79a)
2026-07-26
v5.77.0
2026-07-26
Added
add /usage command for Claude subscription quota (#711) (588d437)
2026-07-26
v5.76.6
2026-07-26
Fixed
humanize live activity (#708) (916a369)
2026-07-26
v5.76.5
2026-07-26
Changed
share AbortCoordinator across both provider query loops (#701) (ad8709d)
2026-07-26
v5.76.4
2026-07-26
Changed
scope the advisory windows leg to push/label/dispatch instead of every PR (#709) (9bc7ee4)
Fixed
bound and latency-gate ◦ tool-progress lines (#702) (c30066f)
2026-07-26
v5.76.3
2026-07-26
Changed
bump react-dom from 19.2.7 to 19.2.8 in /website (#706) (bdd50f6)
bump the fumadocs group across 1 directory with 2 updates (#704) (e29ee44)
bump react from 19.2.7 to 19.2.8 in /website (#705) (d953088)
bump next from 16.2.10 to 16.2.12 in /website (#707) (70d128b)
Fixed
colorize aliased slash commands (e.g. /quit) as brand, not dim (#698) (ca5cd51)
2026-07-25
v5.76.2
2026-07-25
Changed
pin Opus 5 effort/thinking/pricing behavior and correct stale opus comments (#699) (e71fbce)
Fixed
coerce Claude-family child models onto the parent model under openai-compatible routing (#652) (#693) (62df42c)
2026-07-24
v5.76.1
2026-07-24
Fixed
anchor git verbs to subcommand position + wrapper/indirection handling (#577) (#697) (b9973e7)
2026-07-24
v5.76.0
2026-07-24
Added
record resolved agent_type distinctly from the render label (#695) (4b0f726)
back the grep tool with bundled ripgrep for cross-platform support (#690) (3472496)
add Claude Opus 5 as the opus/large default (#694) (43097ce)
2026-07-24
v5.75.3
2026-07-24
Fixed
make ** match zero path segments (root-level files) (#692) (944382f)
2026-07-24
v5.75.2
2026-07-24
Fixed
port diagnose/shadow-verify/devils-advocate refinements from private plugins (#691) (87b6ccf)
2026-07-24
v5.75.1
2026-07-24
Changed
drop dead setOnBackground setter + fix stale doc (#682) (#689) (b69f4ec)
tool-result microcompaction to reclaim context on short-but-full sessions (#671) (9b7b3ec)
Fixed
count commits vs main HEAD when meta has no baseSha (#670) (97b3619)
2026-07-22
v5.61.0
2026-07-22
Added
stamp a provenance header on cross-model subagent results (#656) (71b8601)
notify the model when its provider is swapped mid-session (#655) (39a9ef7)
token-aware keep-window so /compact works on short-but-full sessions (#667) (c5b6354)
2026-07-21
v5.60.0
2026-07-21
Added
additive readRoots param on the agent (subagent-dispatch) tool: grant a forked child READ access to absolute paths outside its repo/worktree (e.g. ~/Downloads, a scratch dir), composed WITH (never replacing) its inherited read scope — writes stay confined, grandchildren must be re-granted. Hardened at parse time (rejects filesystem roots, the home dir / its ancestors, and read-denylisted credential paths — evaluated on symlink-resolved targets, so a symlink to a broad dir can't slip past the lexical check) and, unlike writeRoots, permitted alongside isolation:"worktree". Flows through the distinct AgentConfig.extraReadRoots field so the afk farm read-scope pin is untouched. (#662)
add additive readRoots param to the agent tool (#662) (#664) (aa327ab)
BREAKING: AFK_ALLOW_PROJECT_MCP default flipped from opt-out to opt-in. Previously <cwd>/.mcp.json auto-loaded unless set to 0; it now loads only when the variable is explicitly truthy. Users who relied on auto-loading must set AFK_ALLOW_PROJECT_MCP=1. (#571)
run agent turn detached so mid-turn elicitations don't deadlock the poller (#602) (8146958)
Security
project-local .mcp.json is now opt-in (fail-closed): its MCP servers are no longer auto-spawned on any surface unless AFK_ALLOW_PROJECT_MCP is truthy (1/true/yes/on); when present but not opted in, the skipped server names + commands are listed in a startup warning with the opt-in instruction. A .mcp.json whose real path escapes the working directory (symlink / ..) is refused outright. (#571)
2026-07-14
v5.48.0
2026-07-14
Added
local usage-analytics report (afk insights) (#353) (ff78f72)
C4bash handler now runs a best-effort, advisory-only readRoots/writeRoots path-containment scan before spawning: absolute and home-relative path tokens are extracted from the command and checked against the session's write roots, emitting a one-time [security] warning + tool.bash_path_escape telemetry (counts only, no command string) when one escapes — but never blocking execution (warn-only, to preserve the top-level afk -w bypass workflow). Rationale, threat model, and residual gaps documented in docs/decisions/0001-bash-tool-path-containment.md. Full execFile/sandbox containment remains deferred (tracked C4). (#354)
GPT-5.6 model family support for the openai-compatible provider (reachable via
add GPT-5.6 family support to openai-compatible provider (#474) (068d910)
2026-07-10
v5.25.11
2026-07-10
Fixed
Telegram: don't guillotine long agent turns at 90s — disable Telegraf's default handlerTimeout so the purpose-built streaming.ts inactivity watchdog is the sole timeout authority; fixes the spurious "❌ An unexpected error occurred. Please try again." shown while a turn (sub-agents, web_scrape, long tool calls) was still running and would complete
make witness traces correlatable to sessions via ledger meta (#476) (4a7833f)
disable Telegraf 90s handlerTimeout so long turns aren't guillotined (#475) (1e80771)
2026-07-09
v5.25.10
2026-07-09
Fixed
space out ⚡ glyph and bp tag in bypass prompt caret (#472) (32ea78d)
generalize o-series predicate to reasoning-model contract (#463) (fad5e64)
2026-07-08
v5.25.7
2026-07-08
Changed
negative coverage for flag-like/path-traversal base refs (#398) (#458) (badf06f)
Fixed
surface capped/truncated partials to the parent instead of silent success (#461) (9cfddd0)
2026-07-08
v5.25.6
2026-07-08
Fixed
Witness-trace origin attribution for forked subagents: agent-tool and compose child (and grandchild) sessions were made trace-visible in #466 but recorded origin: "unknown" instead of the owning surface, because the session surface was never threaded into the fork managers (only traceWriter/cwd were). The REPL/chat/Telegram/daemon root managers, the nested depth-2+ child manager, and the compose executor's manager now carry the surface, so forked children inherit the correct origin (cli/telegram/daemon) via forkSubagent's parentSurface fill — mirroring the existing farm.ts pattern. Follow-up to Codex review on #466. (Skill-forked subagents share the same latent gap and are tracked separately.)
thread session surface into fork managers so forked subagents get correct trace origin (#468) (b86fdb5)
2026-07-08
v5.25.5
2026-07-08
Fixed
fix wrap overflow + bound and label the diagnose verifier fan-out (#470) (227a99e)
2026-07-08
v5.25.4
2026-07-08
Fixed
Messages typed during the ESC soft-stop settle window now merge into one next turn instead of last-wins replacement. The #403 coalescing kept only the latest post-ESC message, so a real instruction followed by a "." liveness poke silently dropped the instruction — the "it didn't send" report, round 2. All post-ESC messages now join (newline-separated, attachments concatenated) and run as exactly one next turn; the no-backlog invariant and the pre-ESC queue-preservation contract are unchanged.
merge post-ESC type-ahead instead of last-wins so soft-stop never drops a typed message (#467) (064ea20)
2026-07-07
v5.25.3
2026-07-07
Fixed
tolerate indented fences in isInOpenCodeFence parity check (#464) (ec31016)
2026-07-07
v5.25.2
2026-07-07
Fixed
agent-tool and compose subagents are now visible in the witness trace (afk trace show). Three gaps closed: (1) forkSubagent resolves the trace writer as per-fork config → manager-level writer, so the subagent_lifecycle started/succeeded/failed/cancelled events and the handle's writer no longer silently drop when inheritance came from the manager; (2) the REPL/chat/Telegram root managers and compose executors now carry the session trace writer; (3) the writer chains through nested child managers (depth ≥ 2 agent forks), mirroring the existing cwd chain. Previously a raw agent dispatch produced zero trace events between tool_call started and completed — a stuck child was indistinguishable from a never-started one.
make agent-tool and compose forks visible in the witness trace (#466)do (a41a7d3)
2026-07-07
v5.25.1
2026-07-07
Changed
consolidate o-series detection into one predicate (#457) (db71f16)
Fixed
Forked subagents no longer hang their parent indefinitely: every fork now gets a bounded wall-clock budget by default — 20 min foreground (SUBAGENT_DEFAULT_TIMEOUT_MS), 60 min background (SUBAGENT_BACKGROUND_TIMEOUT_MS) — instead of the unbounded session default. On expiry the child's controller aborts (cascading to descendants) and the parent receives a legible timeout error. Explicit timeoutMs wins; 0 restores unbounded.
Forked subagents now fail fast on OAuth usage-limit pauses (autoResumeOnUsageLimit defaults to false for forks) instead of silently polling for reset — up to 2 h — while the parent looked frozen. The classified usage-limit error surfaces to the parent, which decides whether to retry, reroute, or surface the pause. Callers may opt a child back in with an explicit autoResumeOnUsageLimit: true.
bound fork wall-clock budget + fail fast on usage-limit pauses (#465) (1516e65)
preserve empty-fence label when the safety net strips emphasis (#456) (64ddd04)
thread openaiBaseUrl so OpenAI Telegram sessions reach the configured endpoint (#459) (e674621)
2026-07-07
v5.25.0
2026-07-07
Added
New opt-in AFK_MAX_TOOL_USE_ITERATIONS env var sets a top-level tool-use-round ceiling for both providers (mirrors the maxToolUseIterations config key / max_tool_use_iterations tool param). Unset/<=0 = unlimited (the default — zero behavior change); a positive integer N winds top-level turns down gracefully after N rounds. An explicit config value wins over the env default. Subagent forks are unaffected — they keep their own 50-round anti-hang default regardless of the var. Restores an operator brake for runaway top-level tool loops without reintroducing a default cap or provider drift.
extend tool-loop cap + graceful wind-down to openai-compatible (follow-up to #448) (#454) (b0e85c7)
Changed
The tool-round cap (max_tool_use_iterations) and its graceful wind-down now apply uniformly to both providers. openai-compatible previously ignored the setting and hard-capped every turn at 50 rounds; it now honors maxToolUseIterations like anthropic-direct. Consequence: top-level openai-compatible sessions are now uncapped by default (aligned with anthropic-direct) — the 50-round anti-hang default still applies to subagent forks of either provider. The shared cap/wind-down policy (constants + resolveMaxToolIterations/shouldWindDown) now lives in providers/shared/tool-loop-cap.ts, so the two providers can no longer drift.
extract runIteration concerns into query/ modules (#453) (a04e781)
extract query() concerns into query/ modules (#452) (1c16f81)
dedupe elicitation validators into field-validation module (#451) (a7f2457)
Fixed
openai-compatible now runs the same tools-stripped "wind-down" round as anthropic-direct when the tool-round cap fires (previously it fell through to a possibly-empty final message with no cap signal), and stamps tool_use_loop_capped so the closure classifier reports iteration_cap for openai-compatible turns too.
align getApiKey() default-model resolution with getModel() (#455) (667951e)
2026-07-06
v5.24.0
2026-07-06
Added
uncap turn/tool-use budgets by default; graceful wind-down on cap (#448) (1ba29e7)
persist thinking-ui default via AFK_THINKING_UI + interactive.thinkingUi (#445) (7a1f403)
Changed
agent tool subagents are now uncapped by default and settable per dispatch: max_turns defaults to unlimited (was default 10, hard-clamped to [1,50]) — pass a positive integer to cap. Added a max_tool_use_iterations param and a matching maxToolUseIterations agent-frontmatter field (both default unlimited on the agent-tool path). Skill/compose internal forks keep the 50-round anti-hang default; openai-compatible models retain a provider-internal 50-round cap regardless.
fix stale budget-contract expectations + tool/memory schema mocks (cbb4c32)
add direct unit tests for extracted subagent/ modules (#446) (947739f)
extract execute() into subagent/ modules (#443) (070ded6)
Fixed
Hitting the tool-use iteration cap no longer ends a turn silently (which read as a hang / empty subagent result). The anthropic-direct loop now runs one final tools-stripped "wind-down" round so the model synthesizes a real answer from what it gathered, and the closure classifier maps the capped stop reason to iteration_cap instead of silently sealing it as a clean model_end_turn.
audit grant only on state change to stop session-grants.jsonl bloat (#449) (ed95705)
model-callable exit_plan_mode tool with elicitation picker (#285) (a961ae7)
2026-06-27
v4.45.5
2026-06-27
Fixed
stop the second streamed table from rendering broken (missing header/lines) (#296) (9cb4880)
2026-06-27
v4.45.4
2026-06-27
Fixed
re-point backend on a same-family /model switch to a different endpoint (#297) (38975c1)
2026-06-27
v4.45.3
2026-06-27
Added
add PreCompact hook event (#283) (aa25b10)
Fixed
subset advertised tool schema to permission allowlist (#295) (331ae7b)
2026-06-27
v4.45.2
2026-06-27
Fixed
don't send Chat-Completions max_tokens on the Responses path (#293) (f6ed619)
2026-06-27
v4.45.1
2026-06-27
Fixed
don't fire path-approval prompts in AFK mode (#292) (97dda5e)
2026-06-26
v4.45.0
2026-06-26
Added
afk trace show now surfaces the raw provider stop_reason (stop=…) on the closure line — it was already persisted on the closure event but unrendered, so silent stops (a turn that ends with no output and no error, e.g. a content-safety refusal) were only diagnosable by reading the raw trace.jsonl
surface raw provider stop_reason in afk trace show (#291) (dfa28c5)
2026-06-26
v4.44.3
2026-06-26
Changed
Merge pull request #290 from griffinwork40/fix/surface-model-refusal-stop-reason (21710d6)
Fixed
surface model content-safety refusals (stop_reason "refusal") instead of ending the turn silently — fixes the "it stopped and I can't send anything else" hang when the model declines a request
surface model refusals instead of ending silently (ab84a62)
2026-06-26
v4.44.2
2026-06-26
Changed
Merge pull request #288 from griffinwork40/fix/preserve-redacted-thinking-blocks (fb79fc8)
Fixed
preserve redacted_thinking blocks to prevent session wedge (40984ad)
2026-06-26
v4.44.1
2026-06-26
Changed
Merge pull request #287 from griffinwork40/afk/fix-telegram-message-cutoff (5b66999)
Fixed
stop mid-turn cutoffs, false rate-limit errors, and tool-call spam (be939f5)
2026-06-25
v4.44.0
2026-06-25
Added
add Stop as a harness hook event (ea5ba85)
Changed
Merge pull request #281 from griffinwork40/feat/stop-hook (d6659b8)
Merge pull request #235 from griffinwork40/afk/fix-usage-limit-hang (77b7b3b)
Fixed
terminate query generator on interrupt during usage-limit wait (c462ebd)
2026-06-21
v4.27.1
2026-06-21
Changed
Merge pull request #228 from griffinwork40/fix/compose-cwd-reanchor (c46e4f3)
Fixed
re-anchor compose DAG nodes on cwd change (e3d57f3)
2026-06-21
v4.27.0
2026-06-21
Added
surface hidden REPL features in help, hints & banner (0688398)
add read-only SessionEnd run receipt (611ad70)
Changed
Merge pull request #230 from griffinwork40/feat/tui-discoverability (f630689)
Merge pull request #234 from griffinwork40/feat/session-end-run-receipt (6b21e8e)
2026-06-21
v4.26.1
2026-06-21
Changed
Merge pull request #232 from griffinwork40/fix/tui-context-visibility (46038c4)
Merge pull request #227 from griffinwork40/afk/claude-login-update (d478ae6)
Merge pull request #233 from griffinwork40/chore/tui-remove-dead-repl (19fbe66)
remove dead legacy readline REPL & unused jest devDeps (5e8edea)
use claude login for the OAuth flow in quickstart (6661928)
Fixed
timelier context-usage signal & overlay-safe overflow warning (6e759de)
2026-06-21
v4.26.0
2026-06-21
Added
add cards list --regressed observability view (de0b2d4)
Changed
Merge pull request #226 from griffinwork40/improve/cards-regressed-view (f0c3765)
2026-06-21
v4.25.0
2026-06-21
Added
Shift+Tab cycles permission modes (default → plan → bypass) (0b3e019)
Changed
Shift+Tab now cycles permission modes (default → plan → bypass) instead of toggling plan mode on/off; AFK (autonomous) stays on /afk and, if active, Shift+Tab exits it cleanly to default
Merge pull request #225 from griffinwork40/afk/20260620-194641-1e7273 (b98d443)
Merge pull request #215 from griffinwork40/afk/20260618-180522-9c6c46 (2cb373b)
Merge pull request #219 from griffinwork40/feat/bypass-grant-all (61e9add)
Merge main into afk/20260618-180522-9c6c46 (resolve type-ahead queue conflict) (5d4d70a)
correct stale bypass-by-default claims; document /bypass (bed6aa3)
Fixed
make the live /bypass toggle actually change enforcement (a6de8c7)
keep queued mirror in sync on paste + idle-submit paths (fcbf295)
2026-06-19
v4.21.1
2026-06-19
Changed
Merge pull request #218 from griffinwork40/fix/subagents-non-interactive (3e4f8e8)
Fixed
make forked sub-agents non-interactive (96d7b3a)
2026-06-19
v4.21.0
2026-06-19
Added
interactive usage-limit picker (C) (de2d3be)
make usage-limit pause actionable at the keyboard (A+B) (4ecc2d2)
Changed
Merge pull request #217 from griffinwork40/afk/20260618-163800-fba9fe (80f4e95)
Fixed
guard runPicker promise with .catch() to avoid unhandled REPL rejection (3d92e53)
2026-06-19
v4.20.0
2026-06-19
Added
persist session origin/actor into state artifacts (Stage D) (d71a734)
record origin + actor on routing + skill-invocation rows (Stage B+C) (696953f)
record session origin + actor on witness trace (Stage A) (f5fa3a1)
Changed
Merge pull request #214 from griffinwork40/afk-20260618-123344-8c609e (7ff9ba5)
Merge remote-tracking branch 'origin/main' into afk-20260618-123344-8c609e (de10091)
mark Stage D done (session identity in state artifacts) (4c042c1)
mark Stage B+C done (origin/actor on JSONL telemetry) (5e34188)
session-identity normalization plan (Stage A done; B-D scoped) (abf3797)
Fixed
make v2→v3 actor-column migration concurrency-safe (8f1fed9)
2026-06-19
v4.19.1
2026-06-19
Changed
Merge pull request #216 from griffinwork40/fix/telegram-presence-surface (03629b6)
Merge pull request #213 from griffinwork40/chore/mailmap-attribution (629ae9c)
add .mailmap to re-attribute afk-port port commit (772cf55)
Fixed
tag provider surface as 'telegram' for presence/watch (2162ab5)
2026-06-18
v4.19.0
2026-06-18
Added
render MCP form enum/boolean fields as arrow-key selector (47546b9)
Changed
Merge pull request #212 from griffinwork40/afk/20260618-153242-30da7d (2cff1df)
2026-06-18
v4.18.3
2026-06-18
Changed
Merge pull request #208 from griffinwork40/refactor/extract-resolve-params (2acc9a0)
extract pure param resolvers into resolve-params.ts (c5462c0)
2026-06-18
v4.18.2
2026-06-18
Changed
Merge pull request #211 from griffinwork40/simplify/terminal-compositor-dedup (6da7b60)
centralize committed-band CUP+EL escape into eraseAndPaintRow (57f417e)
2026-06-18
v4.18.1
2026-06-18
Changed
Merge pull request #207 from griffinwork40/refactor/split-diagnose-into-phases (421e4b5)
Merge pull request #210 from griffinwork40/refactor/split-tool-lane-overlay-test (0d9e6d0)
extract overlay-rendering cluster into its own test file (58b90e2)
split diagnose/index.ts into modules (e95ef57)
2026-06-18
v4.18.0
2026-06-18
Added
scope /resume session list to current working directory (3ba3674)
Changed
Merge pull request #209 from griffinwork40/afk/20260618-123959-6040de (e5c19af)
2026-06-18
v4.17.0
2026-06-18
Added
Path-access approval: typed file tools (read_file, write_file, edit_file, list_directory, glob, grep) targeting a path outside the session's granted roots now prompt for approval — once / session / persist / deny — via the REPL or Telegram elicitation surface. Persisted grants are stored in ~/.afk/config/permissions.json and replayed on future sessions
Bash restriction hook: hard-blocks interpreter one-liners (python -c, node -e, ruby -e, perl -e, sh -c, bash -c, lua -e, ...) and restricted-root substrings (~/.ssh, ~/.aws, ...), routing the model back to the prompt-able typed file tools
AFK_DISABLE_BASH_INTERPRETER_GUARD env var — lifts only the bash interpreter-eval denylist while keeping the rest of path-approval enabled
AFK_DISABLE_PATH_APPROVAL env var — disables the path-approval + bash-restriction hooks entirely (for headless flows that need wide-open file access)
AFK_FORCE_BASH_INTERPRETER_GUARD env var — opts headless surfaces back into the interpreter denylist
elicit user approval for restricted-path tool calls (port afk-workshop#477) (42c013f)
Changed
Merge pull request #202 from griffinwork40/afk-port/pr-477 (e443d01)
Merge remote-tracking branch 'origin/main' into afk-port/pr-477 (d3439cb)
Merge pull request #204 from griffinwork40/afk-port/pr-477-review (086ca4e)
add /config and /doctor slash commands (port afk-workshop#702) (#77) (907dc5f)
2026-06-10
v3.92.4
2026-06-10
Fixed
schedule live-sync no longer fails silently: create_schedule/cancel_schedule results now include daemonSynced + syncDetail (and a syncNote when the change will only apply on the next daemon start); transient afk daemon --once runs no longer overwrite-then-delete the service daemon's port-discovery file (new writePortFile option + content-guarded unlink); daemon POST /tasks accepts cronExpression as an alias for cron; creating a disabled schedule no longer live-registers it into the running daemon; afk schedule CLI subcommands (add/remove/enable/disable) now surface live-sync status via the shared http-client instead of failing silently; creating a disabled schedule now sends an idempotent DELETE to unregister any stale live daemon registration; afk schedule add --disabled now matches the tool handler (idempotent DELETE instead of an unconditional POST) so a disabled task is never live-registered into — and fired by — a running daemon; the CLI add/enable live-sync now forwards notifyOn so a (re)registered task keeps its notification setting until the daemon reloads from disk
stop schedule live-sync from failing silently; guard the shared port file (#76) (3c44511)
2026-06-10
v3.92.3
2026-06-10
Fixed
commit content to scrollback in banner sessions — eliminates blank-gap, duplication, and lost-commit regressions when the REPL prints a banner before arming (#74) (2411b88)
never reap a worktree hosting a live session (#73) (6f82cb8)
2026-06-10
v3.92.2
2026-06-10
Changed
Port afk-workshop#756: add fix:pins hash-pin regen + check (#69) (c38a12c)
/plan off saves the plan to a file then implements it (#55) (266249d)
Changed
/plan off now exits plan mode, saves the plan you developed to a markdown file under <cwd>/.afk/plans/, and implements it — replacing the closure-summary ritual (which only emitted a 3-section recap to the transcript). The mode flips to defaultbefore the seeded turn so writes are permitted for the save + implementation. Shift+Tab still exits plan mode without saving or implementing (the manual-takeover escape hatch). The deferred-flip pendingPlanExit machinery is removed.
2026-06-09
v3.90.2
2026-06-09
Added
telegram: configurable outbound notification routing via telegram.notify in afk.config.json (mode, primaryChatId, targets) plus AFK_TELEGRAM_NOTIFY_MODE / AFK_TELEGRAM_PRIMARY_CHAT_ID env overrides. New pure resolver src/telegram/notify-routing.ts.
route outbound notifications to a primary chat, not all allowed chats (#54) (e542bb2)
Changed
telegram: outbound notifications (daemon alerts, send_telegram, OAuth prompts, /review, digests) now default to a single primary chat — the first private/DM chat in AFK_TELEGRAM_ALLOWED_CHAT_IDS — instead of broadcasting to every allowed chat. Separates the inbound allowlist (who may command the bot) from outbound delivery. Single-chat setups are unaffected; multi-chat setups can restore fan-out with mode: "broadcast" (or AFK_TELEGRAM_NOTIFY_MODE=broadcast).
clamp diff body lines to terminal width in nested tool-lane paths (#9) (a3b38b5)
2026-06-06
v3.83.0
2026-06-06
Added
flip default skill execution from fork to load (#7) (0deb564)
Changed
Update SKILL.md (d987a3e)
Add context field to review skill documentation (13a5ae6)
2026-06-05
v3.82.0
2026-06-05
Added
flip gather + parallelize to context: load (#4) (4006c37)
2026-06-05
v3.81.1
2026-06-05
Fixed
anchor flat-leaf tool roots with col-0 ◉ beside a nesting root (#3) (c1d84e0)
2026-06-05
v3.81.0
2026-06-05
Added
add auto-release workflow for automated versioning and publishing (4d93403)
Changed
hermetically lock AFK_INTERNAL tier in audience-gate tests (#1) (aeeaa41)
Update README to simplify API key instructions (02ba5f9)
Revise README for clearer description of Agent AFK (a7da9ce)
Initial public release — Agent AFK (0a23cff)
Fixed
make HOT.md non-fatal — truncation covenant (#2) (0f91a0f)
2026-06-05
v3.80.6
2026-06-05
Fixed
exclude internal-tier skills from the published npm bundle (#713) (952079a3)
2026-06-04
v3.80.5
2026-06-04
Changed
Open-core relicense: Apache-2.0 + DCO + community files (#691) (3e4e4200)
Fixed
emit literal apostrophe in OG meta to stop Reddit double-encoding (#712) (3c634593)
2026-06-04
v3.80.4
2026-06-04
Fixed
ship bundled-plugins (the awa-bundled orchestration skills) in the published npm tarball — build:dist (the publish path) never copied src/bundled-plugins/, so npm install got zero bundled skills; both build paths now route through one shared copy helper, guarded by a unit test and a publish-bundle CI assertion (#703) (00211e3)
emit twitter:url meta tag (last #514 migration parity gap) (#710) (05e24c3)
launchctl-throws test uses telegram, not daemon (b2341b0)
2026-05-21
v3.0.0
2026-05-21
Added
afk service install/uninstall/status — macOS LaunchAgent install for always-on afk telegram / afk daemon (auto-start on login, relaunch on crash). Paired with /service-setup skill that walks the user through install end-to-end. (dc69966, dfcedff, #346)
Pixel-art goblin mascot in the interactive loading screen via half-block renderer (10×10 sprite, pupils + cheek highlights). (#354)
Loading-screen tips + dropdown tooltip hints in the CLI for first-run discoverability. (#294)
Daemon pull-trigger mode with a queue store — daemon can now drain a persisted queue instead of cron-only execution. (issue #337, slice 1)
OpenAI-compatible provider REPL surface parity with anthropic-direct (streaming, tool dispatch, auth diagnose). Closes the GPT/o-series migration off the legacy openai-codex provider. (3e932be)
PLUGIN_ROOT env injected into plugin-skill subagent processes so vendored plugin assets can resolve their own root.
Changed
query.ts decomposed into single-responsibility units: repairOrphanToolUses (5e2de54), SessionState bag (e456201), AbortCoordinator (739d600), RetryLayer for OAuth 401 + 429 (5d2fa8d), and compactHistory handler (95bf4b9). Zero behavior change; the monolith is gone.
Schema-as-source-of-truth for tool classification.SAFE_TOOLS, WRITE_TOOLS, and the read-tool predicate are now derived from AnthropicToolDef.{category, concurrencySafe, riskClass} rather than 6+ drifting hand-maintained lists. (#361)
sumProviderUsage promoted out of a provider-specific location to src/agent/usage.ts so both providers share the same accumulator. (c481852)
Operator-legibility phase 1 polish across the interactive surface. (7fa2773)
Fixed
tools.0.custom.<field>: Extra inputs are not permitted 400 from the Anthropic Messages API — internal tool classification metadata no longer leaks across the wire. (#367)
/review api-compat false positives on dead code — added a reachability pre-check so removed-but-unused exports stop firing the api-compat dimension. (#349)
/ground-state charter drift — read-only contract is now enforced inside SKILL.md so the skill cannot mutate state. (c7321cb)
Plugin sandbox escape via symlink — assertWithinPluginsDir now realpaths both parentDir and dest's dirname before the containment check. (#339)
Skill-frame teardown on child flushSource drain — child-stream completion no longer orphans the parent skill frame. (a6758c0)
Subagent stream-renderer leak on error — throttle entry is now cleaned up on the error path. (bbe85be)
redact credential-shaped strings in resume-swap error reasons (PR #355 H-1/H-2 follow-up) — SDK 401/403 errors during buildSession or waitForInitialization no longer echo Bearer / sk-ant-… to the terminal.
guard stored.startedAt with ?? Date.now() fallback so legacy stored sessions saved before the field existed do not produce NaN status-line durations after /resume.
reset the verdict ledger (terminal-state trajectory rail) on /resume — outgoing session trajectory no longer contaminates the resumed session.
Breaking
SlashContext.session type changed from AgentSession to SessionRef (breaking for external slash-command authors). Update any direct reads of ctx.session.<method> to ctx.session.current.<method>. All built-in handlers have been migrated. Required to make the mid-session swap mechanism transparent to slash commands through a stable pointer. (#355)
Tool schema wire-boundary projection. Internal AnthropicToolDef fields (category, concurrencySafe, riskClass) are now stripped at the wire boundary via a WireToolDef projection; the Messages API call signature is narrower. External code synthesizing tool definitions should target AnthropicToolDef (rich, internal) — the projection happens inside the provider. (#367)
Layering rehome.keychain, tool-category classification, telegram error predicates, and upsertEnvVar moved out of src/cli/ / src/telegram/ to their canonical homes (src/agent/auth/, src/agent/tool-category.ts, src/utils/). Re-export shims preserve backward-compat for known internal callers; deep imports into old paths from external code may need updating. (#361)
Known
/allow-dir filesystem grants persist across /resume — the underlying AnthropicDirectProvider is process-scoped (constructed once at bootstrap, reused by the swap), so its _sharedReadRoots cache survives session boundaries. This is intentional given the current API surface (no resetGrants exists). To revoke grants, exit and restart afk.
2026-05-20
v2.33.0
2026-05-20
Added
unify REPL input surface across user and agent turns (38c1bde)
footer mark + complete Twitter card tags (d4cadb8)
Handoff Arc brand identity — bigger, brand-able mark + favicon family + OG card (cff7409)
unblock npm publish by deflaking /tasks recency-sort test — BackgroundAgentRegistry.register() returns a snapshot copy, so post-register startedAt mutation was a no-op; on fast CI the sort fell back to insertion order. Test now stubs Date.now() before each register() so the live InternalJob.startedAt carries the intended timestamp.
2026-05-20
v2.31.0
2026-05-20
Added
route GPT/o-series to openai-compatible + retire openai-codex (slice 5/5) (8ae2ab9)
close shared MemoryStore on daemon shutdown (36b2cd0)
2026-05-20
v2.28.0
2026-05-20
Added
inline colored diffs for edit_file/write_file (#313) (6fbb370)
Changed
edit_file tool result format — tool_result content for edit_file is now a single-line message (e.g. Replaced 1 occurrence in path/to/file). The diff context previously appended after a double-newline (${resultMsg}\n\n${diffContext}) is no longer included in tool_result content; it is emitted out-of-band as a tool_diff event (CLI-only render channel). Consumers that parsed the multi-line format must update accordingly. (#313)
Shorten hero eyebrow pill so it doesn't wrap on mobile (1b2175c)
async-first hero copy + SEO meta updates (#312) (2dda5f4)
2026-05-19
v2.27.1
2026-05-19
Changed
afk daemon is now invokable without --task or --cron; trigger defaults to sessionstart and task defaults to /forge-friction --auto when neither flag, env var (AFK_DAEMON_TASK), nor afk.config.jsondaemon.task provides a value (closes Daemon Gap B)
afk daemon --cron <expr> (without an explicit --trigger) now auto-selects cron trigger mode, matching the intent of providing a cron expression
afk.config.json.example updated to show the daemon.task / daemon.taskId fields
Fixed
default trigger to sessionstart; pass --cron flag through (Gap B) (#311) (bdf3ef9)
2026-05-19
v2.27.0
2026-05-19
Added
unify /tasks across turn-detach and subagent-job facilities (20b8d2b)
wire BackgroundAgentRegistry into BackgroundStatusBar (8295f2d)
add EventEmitter surface to BackgroundAgentRegistry + BackgroundItem union (8b12d8b)
cap concurrent jobs + TTL eviction + cancel-source attribution (03ae081)
store cancelSource per-job to fix cascade attribution dead code (H-1) (7f6ba33)
add CANCEL_DRAIN_TIMEOUT_MS to cancelAll() to prevent teardown hang (C-2) (05da7f6)
wire setTasksRegistry in repl-loop bootstrap (C-1) (9afd4c9)
2026-05-19
v2.26.7
2026-05-19
Changed
narrow /mint routing trigger and demote from lead bullet (e36a9db)
Fixed
add Dispatch protocol section to enforce parallel sibling dispatch (68e88d5)
2026-05-19
v2.26.6
2026-05-19
Fixed
add Write-step invariants to prevent skill_name="unknown" silent-failure (c303850)
2026-05-19
v2.26.5
2026-05-19
Changed
emit in-flight badge inline via completionWriter (d612533)
Fixed
resolve PR #321 review blockers and majors (95c04dc)
2026-05-19
v2.26.4
2026-05-19
Fixed
distinguish 'nothing-to-summarize' from 'history-too-short' (72e31c2)
resolve session-stuck and malformed-HTML regressions (P0) (352f46d)
2026-05-19
v2.26.3
2026-05-19
Fixed
correct-by-construction fixes for fenced code, ordered lists, hr, blockquote (bab3b09)
2026-05-19
v2.26.2
2026-05-19
Changed
regression tests for ordered-list renumbering + trailing newline (6e0a7ec)
rewrite README for the npm audience; move dev docs under docs/ (de2b70a)
align package metadata with proprietary status (0842463)
memoize disk-tier reads on the cold-start path (fd4e0cc)
Fixed
trailing newline after lists + ordered-list start-number honoring (108a5b6)
2026-05-19
v2.26.1
2026-05-19
Changed
tool-output render registry; memory tools summarized via chunk.display upstream of truncation
Fixed
bash tool-lane no longer leaks truncated raw JSON for commands like gh pr view --json; structured JSON output renders as {key1, key2, …} / [N items] via the render registry
C6--max-budget-usd is now enforced: AgentSession accumulates totalCostUsd from each turn.completed event and aborts the internal AbortController when the ceiling is crossed. The abort reason surfaces as "Budget ceiling reached: $X.XXXX >= $Y.YYYY".
C9 WAL supersede crash window narrowed: supersedeFact() now stores (old_content, old_created_at, new_content, new_created_at) fingerprints in the supersede WAL entry alongside the legacy (old_fact_id, new_fact_id) rowids. replayWAL() resolves fingerprints to current rowids first, falling back to raw rowids for pre-fix WAL entries.
render skill tool children + spinner elapsed time (d4e48b6)
enforce --max-budget-usd via turn.completed cost accumulation (C6) (8e1a223)
Changed
include parentId in fork assertion (9968994)
drop stale "atlas" surface variant (305972c)
add clarifying comments for colon-separator caveat and Telegram permissionMode (6c0ebcf)
fix symlink test — existsSync guard + AFK_WRITE_DENYLIST symlink case (0c6646e)
C5 Telegram SessionManager.getSession() race condition: concurrent calls for the same chatId now share a single in-flight creation Promise via a pendingSessions guard, preventing duplicate session spawns.
C7parseProvider() in shared-helpers.ts now accepts an optional memoryStore parameter and threads it into the constructed AnthropicDirectProvider, ensuring only one SQLite connection is opened when --provider anthropic-direct is passed explicitly. Applied in both chat.ts and interactive/bootstrap.ts.
C8runDAG in dag.ts leaked an AbortSignal listener on the outer signal when the DAG completed normally. Fixed by using a named handler (forwardAbort) removed in a finally block. Per-node listeners are also explicitly removed in finally after each node completes.
idempotent supersedeFact on UNIQUE constraint collision (3419306)
throw BudgetExceededError instead of bare return on budget abort (917f7a9)
add memory tools to interactive REPL allowlist (0a2b2b0)
WAL supersede crash window — store content fingerprints instead of raw rowids (C9) (e9f5fde)
correctness fixes — session-manager race guard, dual MemoryStore, DAG signal leak (C5, C7, C8) (1567f7d)
fix list newline collapse and card border off-by-one (5d8cf8f)
show all rawBody lines in asking verdict card fallback (ee9dad8)
prevent schema mismatch on hypothesis synthesis (a9944de)
wrap blockquote content before prefixing with bar (20b108b)
add newline wrapping for H3+ headings (1aa9aae)
Security
C1 Plugin/marketplace path traversal: validate manifest name with SAFE_PLUGIN_NAME regex and assertWithinPluginsDir() before any join()-based directory creation in src/agent/plugins/install.ts and src/agent/marketplaces/install.ts.
C2permissionMode default changed from 'bypassPermissions' to 'default' in session-setup.ts. Callers that previously relied on the implicit bypass must now pass permissionMode: 'bypassPermissions' explicitly in their AgentConfig.
C3write_file now refuses to write to a built-in denylist of credential/system paths (~/.ssh, ~/.aws, ~/.gnupg, ~/.config/gcloud, /etc, /System, /private/etc, /usr/local/etc). Additional paths can be appended via the AFK_WRITE_DENYLIST env var (colon-separated absolute paths).
C4bash handler now emits a one-time [security] warning to stderr when AFK_PERMISSION_MODE=bypassPermissions, surfacing the shell-injection risk. Full execFile migration is deferred (tracked C4).
C10 Scheduler telemetry (forge-telemetry.jsonl) now runs redactInlineSecrets() over both the command and responseExcerpt fields before writing. INLINE_SECRET_PATTERNS extended to cover OpenAI sk-* keys, Telegram bot tokens, and mixed-case KEY=/TOKEN= patterns.
2026-05-14
v2.3.1
2026-05-14
Fixed
repair release pipeline + dev start scripts (c83ede0)
2026-05-14
v2.3.0
2026-05-14
Added
add /init slash command to scan project and generate AFK.md (af56752)
2026-05-14
v2.2.0
2026-05-14
Added
nest compose-spawned subagents under the compose tool-lane entry (90bea64)
Fixed
resolve review findings on compose subagent nesting (#202) (a627cab)
2026-05-14
v2.1.0
2026-05-14
Added
background tasks — Ctrl+B detach, /bg, persistent status bar (#196)
clipboard failure msg, debug logging, dual-probe
add Ctrl+X to discard clipboard image attachments
auto-discover project-level AFK.md as system prompt source (#186)
background tasks — Ctrl+B detach, /bg, persistent status bar (#196) (0209cb4)
User-scope config at ~/.afk/config/afk.env — Telegram tokens and allowlist stored outside the project tree
afk telegram setup interactive wizard with keychain/file/env token storage options
File-authoritative override for Telegram config keys: ~/.afk/config/afk.env wins over shell env for TELEGRAM_BOT_TOKEN, AFK_TELEGRAM_ALLOWED_CHAT_IDS, TELEGRAM_VERBOSE, TELEGRAM_DATA_DIR
Bot identity validation at startup via getMe before handing token to Telegraf
Fixed
Shell-shadowed bot token: file value now overrides stale shell exports for Telegram-specific keys (inverse of dotenv precedence, intentional for operator-managed config)
2026-05-12
v1.7.0
2026-05-12
Added
cross-session memory system + mint state persistence (#115) (40231c6)
2026-05-12
v1.6.0
2026-05-12
Added
add --dump-prompt debug flag for SDK prompt verification (#34) (c49fb7d)
2026-05-12
v1.5.1
2026-05-12
Fixed
show early tool-use indicator during model generation (#123) (0b91592)
2026-05-12
v1.5.0
2026-05-12
Added
add /changelog page rendered from CHANGELOG.md (#158) (90f413c)
Fixed
improve terminal rendering spacing and wrapping (#156) (72adfa7)
include bundled plugins in system prompt manifest (#153) (7d64db8)
2026-05-12
v1.4.0
2026-05-12
Added
surface parallelize-dispatch failures via discriminated union (#152) (47caa39)
Changed
Enhance routing telemetry with detailed event structure and telemetry emission
phase 1 orchestration pressure — frame main session as coordinator
add orchestration pressure audit (d0a03a3)
Fixed
handle drainQueue rejection in processOne finally (5bc2690)
preserve slash command highlighting after submission (3afa120)
2026-05-12
v1.3.1
2026-05-12
Changed
address review feedback from #151 review (3395c33)
co-locate unit tests with the files they exercise (56a6d36)
add colocate-tests migration helper (3dfd2aa)
Fixed
reset context bar on /clear (1b5f637)
flush tool lane to scrollback on subagent done (ab8dea6)
unify feedback on spinner, kill thinking indicator
add Failure Geometry documentation to outline agent workflow design patterns
centralize last hardcoded ~/.claude/ path in audit-fit
centralize path resolution on AFK_HOME, fix surface tags
opt actions into Node.js 24 (FORCE_JAVASCRIPT_ACTIONS_TO_NODE24)
extract shared utils + add auto-release CI (328ae85)
Fixed
stream subagent content in real time during skill execution — replaces line-buffered rendering with StreamingMarkdownRenderer so users see live markdown output instead of a spinner
harden /changelog flag parsing and improve test mocks
resolve review findings in /changelog command
add 401 retry integration tests and deduplicate concurrent refreshes
persist assistant turns in message history
restore plain bullets in /changelog (PR #145 H-1) (3432991)