All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- MiniMax Code (
mcode) provider with per-terminal authentication and profile isolation, model and MCP configuration, multi-turn TUI orchestration, supervisor/worker E2E coverage, and provider documentation (#624) - Oh My Pi (
omp) provider with additive native configuration, profile MCP extension wiring, lifecycle detection, and supervisor/worker orchestration support (#559) - Add the official xAI Grok Build CLI as the
grok_cliprovider, including isolated per-terminal MCP configuration, native hard tool restrictions, multi-turn TUI support, orchestration e2e coverage, and provider docs.
- tmux listing parse failures are retried once and reported as a distinct condition instead of surfacing as a bare
ValueErrorthat reads like "session not found" one layer up. libtmux 0.53.1+ zipsparse_output's fields withstrict=True, so any short row (a pane or session vanishing mid-listing, or trailing fields tmux omits) raisedValueError: zip() argument 2 is shorter than argument 1— which propagated throughserver.sessions/window.panes, blocked launches outright, and left the pipe-liveness watchdog unable to tell a genuinely-gone session from a transient parse failure. AddsTmuxLookupErrorand routes the listing reads inclients/tmux.pythrough a single retry-and-classify wrapper; a failedcreate_sessionno longer leaves an orphaned tmux session that blocks relaunching the same name. Also capslibtmux<0.53.1, the last release that zips non-strict (caom-anv) - Codex handoff extraction now skips native TUI activity cells without relying on an English verb allowlist, including when the model's reply starts with prose (#545)
list_sessionsownership metadata now persists the effective canonical launch directory, stays stable after panecd, and purges stale terminal rows before same-name session relaunches so reused sessions report the new directory/profile (#497)- make session teardown atomic so tmux and the terminal registry can no longer diverge (#498).
delete_sessionpreviously trusted a pre-loop liveness reading and an unverifiedkill_sessionresult, so a session could survive while its registry rows were deleted (orphaned tmux session) or vice versa (ghost rows that later misattributed a reused session name). Now: session creation and session teardown are mutually exclusive per session name (a concurrent launch can no longer interleave with a teardown of the same name),kill_sessionreturns True only once the session is confirmed gone, and registry rows are deleted only after that confirmation. Error-contract change: a teardown whose tmux kill cannot be confirmed now raises (surfaced as HTTP 500 onDELETE /sessions/{name}) instead of reporting success — the registry rows are left intact and the operation is safe to re-run, which reconciles the survivor. Backend authors:TerminalBackend.kill_sessionmust not return True for a merely-dispatched kill
- force fast-uri 3.1.5 in aidlc-portfolio examples (#551) (#552)
-
bump cryptography from 48.0.1 to 50.0.0 (#548)
-
bump fast-uri from 3.1.4 to 3.1.5 in /docusaurus (#549)
-
bump postcss from 8.5.21 to 8.5.25 in /docusaurus (#550)
- add Phase 0 Kiro engine selection (
v2default;kascapability-probed and rejected before terminal allocation) - Read-only profile HTTP routes for capability search, template discovery and schema retrieval, template-config validation, and rendered previews (#523)
CAO_HOME_DIRenvironment variable to relocate CAO's entire data directory outside~/.aws(#467)- Self-learning loop (opt-in, off by default; see
docs/self-learning.md):- Phase 1 — outcome capture:
memory.learning_enabledsetting (CAO_MEMORY_LEARNING_ENABLED),workflow_outcomestable,report_outcome/list_outcomes/store_lessonMCP tools (the latter targets a named worker profile's agent scope so retrospective lessons reach the worker), scope-gatedPOST/GET /outcomesendpoints, and a built-inretrospectoragent profile that distills session outcomes into worker-scoped memory lessons - Phase 2 — instruction promotion:
memory.instruction_promotion_enabledsetting (CAO_MEMORY_INSTRUCTION_PROMOTION_ENABLED; promotion ⊂ learning ⊂ memory), itemized-delta editing of a delimited## Learned Patternsblock in profile files,cao memory promote <agent>CLI (dry-run by default,--applyto mutate), recall-count promotion gate, content-free audit logging cao-learningshipped skill teaching supervisors/workers the outcome-reporting and lesson-storage habits- Validated by a 20-package controlled A/B experiment: +11 mean points on work items with headroom (6/6 wins, sign test p = 0.016), neutral at the ceiling —
docs/self-learning-validation.md
- Phase 1 — outcome capture:
cao profile find <query>CLI verb andfind_profilesMCP tool for keyword/BM25 profile discovery over metadata (name, description, tags, capabilities); metadata-only, never exposes prompt bodies (#340)- Optional
capabilitiesandtagsarrays in the agent profile frontmatter schema (#340) - Durable workflow run journal — a workflow run's execution history now survives a server restart and is inspectable after the fact (#504):
- append-only
workflow_run_eventtable with a per-runseqas the sole ordering authority; a swallowed append leaves a hole the read path DECLARES as aGapMarker(interior and trailing) rather than renumbering it away, so "nothing happened" is distinguishable from "an event was lost" - read routes over the durable journal, all answered with no in-memory
run_registrydependency:GET /workflows/runs/{id}(enriched inspect),GET .../events(ordered timeline),GET .../compare?against=(per-step comparison),GET .../diagnostics(troubleshooting bundle). All four require acao:read/cao:write/cao:adminscope when auth is enabled - SSE live-follow content-negotiated onto the same
.../eventspath (Accept: text/event-streamor?stream=true): durable replay from a cursor, exactLast-Event-IDreconnect, and a terminal-state guard that closes an already-ended run instead of hanging the follower GET /terminals/{id}/output/rangefor byte-exact reads of a terminal's append-only logDELETE /workflows/runs/{id}(write/admin scope) removing a run and all its retained data, plus an age + run-count retention sweep at startup —0on either bound DISABLES that bound- web: a run list / detail surface with event-timeline playback (transport + ARIA scrubber), declared-gap markers, and a terminal pane synced to the selected event
- output capture is OFF by default (metadata only); when enabled, retained text is size-capped and funnelled through the existing
audit_logsanitizer. Four newmemorysettings — see Configuration
- append-only
- Asynchronous workflow-run lifecycle — runs are now submittable without holding a connection open for their whole duration (#505):
POST /workflows/runs:submitacks202 {run_id, state, links}the instant the run is durably journaled, then drives it in a background task. The blockingPOST /workflows/runsis retained and byte-compatible.GET /workflows/runslists journaled runs newest-first (?state=,?limit=), andGET /workflows/runs/{run_id}/resultreturns the full retained result for a detached, in-flight, or post-restart run- four CLI verbs:
cao workflow runs(list recorded runs),wait(follow an already-submitted run),result(full detail),events(live SSE progress);runnow submits-and-follows by default, with--detachto submit and exit and--waitfor the retained blocking path - six MCP tools:
workflow_start,workflow_status,workflow_result,workflow_list,workflow_wait,workflow_events. Noteworkflow_listlists runs, whereas the CLI'slistlists specs — see the CLI ↔ MCP name mapping indocs/workflows.md GET /workflows/runsandGET /workflows/runs/{run_id}/resultrequire a read scope (cao:read,cao:write, orcao:admin) when auth is enabled
-
BREAKING —
cao workflow run --jsonoutput shape (#505). It previously echoed the completeWorkflowRunResult(run_id,workflow_name,state,steps[], timestamps,kind); because the default path now submits-and-follows rather than blocking, it emits only the stable terminal object{"run_id": ..., "state": ...}. A non-TTY plainrunemits the same JSON. Scripts readingsteps[]orworkflow_nameoffrun --jsonmust change — usecao workflow result <id> --jsonfor full detail, orcao workflow status <id> --jsonfor a mid-run snapshot.run --wait --jsonis unaffected and still returns the completeWorkflowRunResult. Exit codes are unchanged across TTY, non-TTY, and--json -
BREAKING — the run-level
outputfield is no longer returned byGET /workflows/runs/{run_id}/resultor by theworkflow_result/workflow_waitMCP tools (#505). Run-level output is not journaled, so the field was structurally alwaysnullon those journal-assembled surfaces; it is dropped rather than advertised. Per-step outputs are unaffected (steps[].output), and the blockingrun --waitpath still returns run-level output for script-tier runs -
memory + stub providers (#348 B2) (#416)
-
API routes + OKF/Obsidian/GraphML sinks (#348 B3) (#424)
-
add read_session_output tool for typed worker-output readback (#422)
-
Sigma renderer + web graph view + projection cache (#348 B4) (#442)
-
script-tier run surface + author shim — U5+U6 (#312) (#399)
-
runtime inputs + cao-workflow authoring skill (#420) (#450)
-
AG-UI protocol adapter + generative UI — PR #387 Phase-A (reconciled) (#436)
-
add source-aware
cao updatecommand (#26) (#445) -
add profile discovery via cao profile find + find_prof… (#438)
-
validate Markdown links repository-wide (#474)
-
secret scanning + leak-response runbook (#457) (#477)
-
AG-UI Phase 2 — L2 construct library (#458) (#485)
-
modernize integration for herdr 0.7.x (broadcast events, api snapshot, native --env) (#502)
-
add agent profile routing (#486)
-
add an explicit model override to handoff/assign (#501)
-
make CAO_HOME_DIR env-overridable (#467)
-
pass model and initial message when launching sessions (#513)
-
opt-in self-learning loop — outcome capture, retrospection, instruction promotion (#514) (#515)
-
add read-only profile search, template and preview endpoints (#523)
-
add explicit v2/KAS engine selection (#470)
-
add AI-DLC portfolio orchestration example (#521)
-
typed memory relationship store (#511) (#524)
- extract local-store persistence into profile_store (#543)
-
add Simplified Chinese README (#439)
-
add tags and capabilities to aws example profiles (#484)
-
improve README and documentation navigation (#472)
-
reconcile historical implementation records (#499)
-
sync provider lists/tables with all 9 registered providers (#490)
-
add Docusaurus documentation site and interactive courses (#531)
-
link the documentation site from both READMEs (#536)
-
workflow: the background drive's FAILED backstop no longer overwrites an already-settled run (#505). It fired unconditionally on any exception, so a drive that raised after the engine journaled COMPLETED/CANCELLED — during post-settlement bookkeeping — rewrote that terminal state to FAILED, making the durable record misreport the run's outcome. The write is now a conditional
UPDATE ... WHERE state = 'running'in the journal DAL (atomic, so no concurrent settle can interleave), covering both theExceptionandCancelledErrorarms; a run that raises before settling still lands FAILED as before, so no run is left orphaned inrunning -
workflow:
cao workflow eventscloses its streamed SSE response on every exit path (#505). The follower breaks out of its loop on a terminal frame and abandons the generator on each reconnect, so without an explicit close the socket survived until garbage collection and a long follow with repeated reconnects accumulated live file descriptors. The equivalent MCP tool was already hardened -
workflow: a caller-supplied
run_idthat loses a concurrent-submit race now returns409instead of500(#505). The uniqueness pre-check and the durable insert are not one atomic operation, so both submits can pass the pre-check; the loser'sIntegrityErroris now mapped to the same409the serialized case reports -
profile store writes are now atomic and inter-process safe. Both store writes were previously bare
write_textcalls, so a concurrentcao profilewrite and a server-side write could interleave or leave a partial file. Addslocked_atomic_writetoutils/atomic_file.pyas the blind-write sibling oflocked_atomic_rewrite(#492): it shares the same lock, temp file, fsync, mode preservation andos.replace, but skips the read, so a corrupt or non-UTF-8 file in the agent store can still be replaced by the install that would have repaired it instead of failing withUnicodeDecodeError(#543) -
self-healing pipe-pane liveness watchdog for silently-stalled FIFO forwarding (fixes #388) (#397), including detection of a stall that settles into a new static frame before the next poll and of a pipe that never delivers a single byte from terminal creation (cold start, harness-control#93) — see
CAO_PIPE_LIVENESS_COLD_START_GRACE_S/CAO_PIPE_LIVENESS_MAX_COLD_START_ATTEMPTSindocs/configuration.md -
web: attach web terminals through the configured backend so herdr-backed terminals no longer fail to attach (#417)
-
honor profile frontmatter
provider:during install (flag > frontmatter > default) (#414) -
deliver messages with
tmux paste-buffer -pon tmux >= 3.7, which sanitizes pasted buffers through vis(3) and rendered the previously hand-craftedESC [200~/ESC [201~markers as literal^[[200~garbage in the receiving TUI; tmux < 3.7 keeps the hand-crafted wrap so TUIs that never enable DECSET 2004 (e.g. kiro-cli) still receive multi-line messages as a single input (#413) -
handoff workers now inherit the supervisor's working directory server-side in run_agent_step (#423)
-
sync devcontainer feature version with pyproject.toml on release (#419)
-
TOML-escape MCP command/args/env in -c overrides (#404)
-
roll back DB terminal row when create_terminal fails (#421)
-
stop logging full send_keys payloads at INFO (#427)
-
enable Jinja2 autoescape in agent-profile scaffolding (#429)
-
make Jinja2 autoescape safety net real + lock it with a test (#429 follow-up) (#434)
-
stop bump_version clobbering mypy python_version (#435)
-
clear CodeQL clear-text-storage false positive in memory tests (#142) (#440)
-
honor frontmatter provider with flag > frontmatter > default precedence (fixes #414) (#431)
-
attach terminals through configured backend (#417)
-
self-healing pipe-pane liveness watchdog (fixes #388) (#397)
-
allow containerized/wrapped provider agents to initialize (#400) (#428)
-
gate first paste on real input readiness (settle check) (#441)
-
validate MCP server names and env keys in -c override paths (#426)
-
kill orphaned window on init failure for new_session=False (harness-control#186) (#446)
-
isolate wait_until_input_ready in claude_code init-timeout tests (#452)
-
repair metadata projections after database replacement (#449)
-
scrub personal PII from provider fixtures + add recurrence guard (#456)
-
inline select_autoescape so bandit B701 recognizes the autoescape config (#462)
-
inherit supervisor working directory server-side in run_agent_step (#423)
-
colocate CodeQL path-injection guards with filesystem sinks (#166/#167/#168) (#461)
-
exclude own-line effort footer from response-marker detection (#466)
-
content-based staleness guard prevents stale COMPLETED (#407) (#480)
-
detect trust prompt v2 + block delivery into dead terminals (#482)
-
verify deferred-init worker started and re-submit dropped input (#479)
-
oversize pyte screen to 400x200 so taller attached terminals reach IDLE (#478)
-
bottom-anchor dialog detection + plan-approval dismissal (#405) (#481)
-
gate live integration tests + classify trust-all-tools dialog (#483)
-
suppress and dismiss startup update-available dialog (#488)
-
add autouse fixture to strip leaked CAO env vars (#489)
-
suppress pytest warnings summary in pre-push hook to avoid BlockingIOError (#491)
-
validate CAO terminal ID before API requests (#475)
-
use paste-buffer -p instead of hand-crafted bracketed-paste markers (fixes #413) (#430)
-
prevent deferred-init retry loop from re-pasting into working OpenCode workers (#496)
-
bound graph lint projection (#507)
-
skip bracketed-paste wrap when the pane is a bare shell (#500)
-
mock cleanup-nudge lookup in assign tests to stop live-server leakage (#508)
-
submit orchestrated/flow tasks reliably on Gemini 3.x agy (#517)
-
make the state-detection rolling buffer size configurable, raise default to 32KB (#425)
-
detect v0.145 idle composer at startup (#527)
-
reset backend registry singleton between tests (#522) (#528)
-
inter-process-safe atomic read-modify-write for memory/skill files (caom-47e) (#492)
-
upgrade postcss to >=8.5.18 in web (#535)
-
validate Origin on terminal WebSocket to block cross-site WebSocket hijacking (CWE-1385) (#533)
-
convert kimi/antigravity/copilot startup-prompt handling to async (#509)
-
bump mcp from 1.26.0 to 1.28.1 (#455)
-
bump postcss from 8.5.16 to 8.5.25 in /cao_mcp_apps (#530)
-
pin paste submission overrides (#544)
-
release v2.4.0
-
add reconciliation sweep for orphaned PENDING messages (#266)
-
add provider support (#272)
-
add herdr terminal backend with event-driven inbox delivery (#271)
-
bundle built-in memory plugins for Claude Code, Kiro, and Codex (#269)
-
Web UI support for the memory system (#290)
-
Phase 3 — LLM wiki compile, cross-references, lint, audit log, scoring (#285)
-
add Cursor CLI as a first-class provider (#296)
-
pyte rendered-screen status detection (closes #287) (#293)
-
gate network egress behind a web_fetch tool category (#311)
-
discover skills from extra_skill_dirs (mirror extra_agent_dirs) (#277)
-
pass per-agent config overrides via codexConfig (#278)
-
add optional Session Name field to the Spawn Agent dialog (#279)
-
worker status/output tools + orchestration worker profiles (#324)
-
spec grammar + run_agent_step substrate (#312 Bolt 1) (#320)
-
authoring, persistence & structured returns (#312 Bolt 2) (#326)
-
add Antigravity CLI (agy) provider (#323)
-
wiki self-healing —
cao memory heal(Phase 4 U1) (#306) -
sandboxed host-rendered fleet UI (SEP-1865) + capabil… (#332)
-
cross-project federation — FEDERATED scope (Phase 4 U3) (#314)
-
canonical-source fidelity + host-delegated dogfooding (#347)
-
orchestration run engine (#312 Bolt 3 / N5) (#329)
-
rename cao flow → cao schedule with deprecated alias (#380)
-
cross-node fleet coordinator (bootstrap + AI conductor) (#365)
-
scope the per-agent skill catalog via a profile allowlist (#351)
-
Open Knowledge Format (OKF) export/import (#345) (#384)
-
durable run journal + resume (#312 N6) (#372)
-
script-tier journal extension (#312 C3/U3) (#391)
-
script linter + run-step env guard (#312 B2: U1+U2) (#394)
-
fleet web panel + live console (#366)
-
enable/disable an agent-profile directory (closes #280, #281) (#368)
-
script-tier execution engine — U4 runner (#312) (#396)
-
GraphView contract + provider/sink registries (#348, B1) (#402)
-
add per-scope store samples, on-disk comparison, SQLite architecture diagram (#355)
-
add AWS cloud-ops agent examples with config (#377)
-
fleet coordinator guide (docs/fleet_instructions.md) (#367)
-
draft CHANGELOG for v2.3.0 (#418)
-
stop TestPyPI squats breaking the release smoke test (#270)
-
handle v0.136+ TUI footer and skip MCP tool-call markers … (#274)
-
mark messages DELIVERED before send_input to stop double delivery (#265)
-
address CodeQL command-injection and URL-sanitization … (#288)
-
structural callback routing for worker agents (#284) (#289)
-
auto-detect server backend + herdr reconcile fixes (#309)
-
detect TUI idle state without falling back to --legacy-ui (#330)
-
harden Claude and OpenCode status detection (#327)
-
stop echoed system prompt from short-circuiting trust dialog (#319)
-
allow permissionMode to override yolo in claude_code provider (#322)
-
adopt vite 8 / vitest 4 and restore the 90% coverage floor (#346)
-
also deny Claude Code's renamed subagent tool (Agent) (#350)
-
accept workspace-trust dialog so init doesn't hang (#364)
-
dismiss startup upgrade-reminder dialog so init doesn't hang (#363)
-
read herdr native status in all providers (#359) (#361)
-
add --version/-V option (#354) (#379)
-
dismiss startup feedback survey so init doesn't block (#371)
-
non-blocking reader loop + event-loop-safe teardown (fixes #382) (#383)
-
fix: unblock multi-agent orchestration on kiro-cli 2.11 — event-loop deadlock, serial/timed-out assign, and provider output/status detection (#390)
-
background task ("✻ Waiting for N workflows") no longer reads as COMPLETED (fixes #392) (#393)
-
validate user-derived path components to close CodeQL path-injection alerts (#401)
-
launch bundled cao-mcp-server without a per-launch network fetch (#403)
-
Potential fix for code scanning alert no. 66: Uncontrolled command line (#275)
-
bump starlette from 0.49.1 to 1.0.1 (#276)
-
Event-driven architecture: rebase onto main + green the suite (continues #115) (#273)
-
bump esbuild, @vitejs/plugin-react and vite in /web (#295)
-
bump pyjwt from 2.12.0 to 2.13.0 (#301)
-
bump python-multipart from 0.0.27 to 0.0.31 (#302)
-
bump cryptography from 46.0.7 to 48.0.1 (#303)
-
bump starlette from 1.0.1 to 1.3.1 (#304)
-
bump form-data from 4.0.5 to 4.0.6 in /web (#305)
-
Add configurable server timeouts and file-based Claude Code prompt delivery (#318)
-
fix kiro/q integration tests (mock_db signature + event-loop starvation) (#333)
-
bump happy-dom from 15.11.7 to 20.10.6 in /cao_mcp_apps (#341)
-
Remove Amazon Q CLI and Gemini CLI providers (#353)
-
quickly remove some comments (#370)
-
Unify CAO configuration into a single source of truth (#357) (#381)
-
bump ws from 8.20.0 to 8.21.0 in /web (#398)
-
[Feat] cao profile — profile lifecycle management (#395)
-
release v2.3.0
-
Add Opencode provider label to Web UI (#217)
-
add install with pypi in README.md (#214)
-
Build an MCP server for cao operations (#166)
-
shell command tracking, flow recycling fixes, and inbox delivery reliability (#230)
-
auto-delete handoff terminals with snapshot-based restore (#233)
-
enhance DashboardHome with filtering, sorting, grouping, and session deletion (#200)
-
persistent agent memory system (Phase 1) — foundation (#245)
-
forward env vars to supervisor and child agents (#259)
-
SQLite metadata, BM25 fallback, context-manager injection (#254)
-
auto-derive CORS origins from cao-server --host/--port (#261)
-
Official devcontainer feature for CAO (#260)
-
eager inbox delivery for providers that buffer input during processing (#251)
-
Phase 2.5 hardening (#262)
-
add external tool integration guide for CAO skills (#241)
-
fix web UI build instructions and add 404 troubleshooting (#252)
-
add Hermes Agent as worked example (#253)
-
detect TUI Initializing... to prevent false IDLE (#211) (#215)
-
start panes at 220x50 to avoid kiro-cli SIGWINCH input death (#216) (#218)
-
Add a poller to opencode CLI inbox delivery to drain s… (#210)
-
resolve profile.provider in create_session() (#198)
-
wait for idle before tmux attach on non-headless launch (#220) (#221)
-
fix mcp worker provider resolution (#224)
-
harden agent-profile install against SSRF and path inje… (#226)
-
isolate GEMINI.md per terminal in a dedicated workspace (#227)
-
guard agent-name path lookups against traversal (#228)
-
fix ops mcp profile provider resolution (#229)
-
fix handoff hang for Q Developer Pro — Credits marker not emitted in TUI mode (#238)
-
filter environment to prevent 'command too long' errors (#246)
-
default TERM to xterm-256color for tmux PTY attach (#256)
-
make network allowlists configurable via env vars (#255)
-
resolve profile.provider regardless of yolo/allowed-tools branch (#257)
-
reject send_message when receiver_id equals sender (#24) (#263)
-
[Docs]Reorganize README, split detail into topic docs, and add control-plane overview (#225)
-
bump python-multipart from 0.0.26 to 0.0.27 (#232)
-
bump urllib3 from 2.6.3 to 2.7.0 (#234)
-
bump authlib from 1.6.11 to 1.6.12 (#236)
-
bump idna from 3.10 to 3.15 (#247)
-
Add optional permission_mode field to AgentProfile for claude_code provider (#244)
-
Add optional codexProfile field to AgentProfile for codex provider (#250)
-
Fix/codeql 66 tmux name validation (#258)
-
bump vitest from 3.2.4 to 4.1.0 in /web (#267)
-
Fix/resolve provider explicit override (#268)
-
Add OpenCode CLI provider support (#193)
-
add PyPI publish workflow and update pyproject.toml (#123)
-
honour profile.provider when --provider flag is not given (#196)
-
eliminate PROCESSING false-positives from compaction and /exit (#199)
-
honor --yolo and profile.model at launch (#201)
-
recognise Copilot v1.0.31+ status bar and breadcrumb as footer lines for idle detection (#184)
-
fix the cliff github api timeout with env GITHUB_TOKEN for git cliff to pickup. Add retry mechanism in script (#212)
-
Feat/publish cao to pypi (#209)
-
bump postcss from 8.5.8 to 8.5.12 in /web (#208)
-
switch to deploy key to bypass commit to main (#213)
-
release v2.1.1
-
Add support for skills (#145)
-
Build support for external plugins (#172)
-
add cao session command, HTTP API refactor, and kiro-cli fixes (#187)
-
add managed skills to README, restore developer.md orch… (#170)
-
cut 2.1.0 release notes (#195)
-
correct 2.1.0 entry — remove unmerged feature, fix refs (#197)
-
Bundle built WebUI assets within Python wheel (#169)
-
prevent stale processing spinners from blocking inbox delivery (#104) (#106)
-
structural PROCESSING detection immune to ❯ position race (#177)
-
read GEMINI.md for Gemini skill catalog injection assertion (#180)
-
gracefully handle missing agent profiles in CAO store (#186)
-
handle Kiro CLI 2.0 Credits-before-separator layout (#188)
-
honor profile.model at terminal creation (#189)
-
position-aware 'Kiro is working' check prevents stale PROCESSING blocking handoffs (#185)
-
prevent false-positive IDLE on shell prompt during startup (#190)
-
only kill sessions this call created on cleanup (#191)
-
bump pytest from 8.4.2 to 9.0.3 (#173)
-
bump python-multipart from 0.0.22 to 0.0.26 (#175)
-
bump authlib from 1.6.9 to 1.6.11 (#178)
-
bump python-dotenv from 1.1.1 to 1.2.2 (#194)
-
Support agent-profile environment variable injection and loading (#156)
-
add cao-provider skill for new CLI agent providers (#154)
-
add full TUI mode support with --legacy-ui fallback (#159) (#163)
- improve Web UI terminal scroll and paste reliability (#162)
-
Fix/providers endpoint missing entries (#158)
-
bump vite from 6.4.1 to 6.4.2 in /web (#160)
-
bump cryptography from 46.0.6 to 46.0.7 (#165)
- add allowedTools — universal tool restriction across … (#125)
-
add --legacy-ui flag for new Kiro CLI TUI compatibility (#138)
-
add new TUI fallback patterns + fix #137 exception handling (#140)
-
replace WAITING_USER_ANSWER regex to prevent stale scrollback false positives (#142)
-
honor child allowedTools=["*"] instead of inheriting parent restrictions (#141) (#144)
-
clarify prompt, add --auto-approve, document TOOL_MAPPING (#146)
-
bump cryptography from 46.0.5 to 46.0.6 (#135)
-
bump pygments from 2.19.2 to 2.20.0 (#136)
-
bump fastmcp from 2.14.5 to 3.2.0 (#139)
-
add Gemini CLI provider (#102)
-
Support provider override in agent profiles for cross-provider workflows (#101)
-
add Kimi CLI provider (#113)
-
add copilot_cli provider (#82)
-
add Web UI dashboard with configurable agent directories (#108)
-
auto-inject sender terminal ID in assign and send_message (#98)
- add cross-provider example profiles and fix missing gemini_cli in README (#109)
-
accept IDLE or COMPLETED during terminal init (#111)
-
add extraction retry for TUI-based providers (Gemini CLI) (#117)
-
add CodeQL SafeAccessCheck guard for path injection (#121)
-
add DNS rebinding protection via Host header validation (#124)
-
pin trivy-action to SHA instead of mutable master ref (#126)
-
handle bypass permissions prompt on startup (#119) (#120)
-
bump vite 5→6.4.1 and vitest 2→3.2.4 to fix esbuild vulner… (#129)
-
Fixes the
400 Bad Requesterror when launching agents in directories outside~/, such as/Volumes/workplaceon macOS. (#110) -
bump black from 25.9.0 to 26.3.1 (#114)
-
bump pyjwt from 2.11.0 to 2.12.0 (#118)
-
bump authlib from 1.6.7 to 1.6.9 (#122)
-
bump requests from 2.32.5 to 2.33.0 (#130)
-
Docs/update readme and changelog (#132)
-
Docs/update readme and changelog (#133)
-
Fix regex to catch Claude Code Processing spinner (#92)
-
Update failing Q CLI unit tests due to working directory validation (#94)
-
Update Codex TUI footer detection for v0.111.0 (#99)
- bump authlib from 1.6.6 to 1.6.7 (#97)
-
add --dangerously-skip-permissions, --yolo flag, tmux paste fix, and dep upgrades (#76)
-
rewrite Codex provider, framework improvements, security fix, and docs (#77)
-
add CLI commands, shell safety fixes, agent profiles, and docs (#83)
- detect active permission prompts using line-based counting (#71)
-
bump cryptography from 46.0.1 to 46.0.5 (#72)
-
add comprehensive unit tests, E2E tests, and CI workflows (#81)
-
Synchronize status detection with response completion (#62)
-
update IDLE_PROMPT_PATTERN_LOG to match actual kiro-cli ANSI output (#65)
-
prevent permission prompt pattern from matching stale prompts (#69)
- replace chunked send_keys with paste-buffer for instant delivery (#67)
- add dynamic working directory inheritance for spawned agents (#47)
- Handle CLI prompts with trailing text (#61)
- release workflow version parsing (#60)
-
bump authlib from 1.6.4 to 1.6.6 (#51)
-
bump urllib3 from 2.5.0 to 2.6.3 (#52)
-
Remove unused constants and enum values (#45)
-
bump starlette from 0.48.0 to 0.49.1 (#53)
-
bump werkzeug from 3.1.1 to 3.1.5 (#55)
-
bump python-multipart from 0.0.20 to 0.0.22 (#58)
-
Escape newlines in Claude Code multiline system prompts (#59)
-
async delegate (#3)
-
add badge to deepwiki for weekly auto-refresh (#13)
-
add Codex CLI provider (#39)
-
add changelog and automated release workflow (#50)
- rename 'delegate' to 'assign' throughout codebase (#10)
-
Handle percentage in agent prompt pattern (#4)
-
resolve code formatting issues in upstream main (#40)
-
Initial commit
-
Initial Launch (#1)
-
Inbox Service (#2)
-
tmux install script (#5)
-
update README: orchestration modes (#6)
-
Update README.md (#7)
-
Update issue templates (#8)
-
Document update with Mermaid process diagram (#9)
-
Adding examples for assign (async parallel) (#11)
-
update idle prompt pattern for Q CLI to use consistent color codes (#15)
-
Add comprehensive test suite for Q CLI provider (#16)
-
Add code formatting and type checking with Black, isort, and mypy (#20)
-
Make Q CLI Prompt Pattern Matching ANSI color-agnostic (#18)
-
Add explicit permissions to workflow
-
Kiro CLI provider (#25)
-
Add GET endpoint for inbox messages with status filtering (#30)
-
Adding git to the install dependencies message (#28)
-
Bump to v0.51.0, update method name (#31)
-
accept optional U+03BB (λ) after % in kiro and q CLIs (#44)