You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Run-slot limit is --concurrent / concurrent in graphviagent.toml / GVA_CONCURRENT (default 3). Every graph execution takes a slot: live Run, Continue/Step, POST /api/run, and Replay / Replay from. Overflow waits in a server-side FIFO (--queue-limit / queue_limit / GVA_QUEUE_LIMIT, default 4× concurrent). Resume / HITL jumps ahead of new runs so a paused run is not stuck behind other live work. LangGraph node fan-out is separate (--node-concurrency / node_concurrency / GVA_NODE_CONCURRENCY; omitted = unlimited). Slots and the queue live on the server (GET /api/meta); two browser tabs share them.
Changed
Concurrent runs in one process are keyed only by LangGraph thread_id (a missing id is not inferred from “the only capture”). user_id is set to that same id so a shared MemorySaver / store cannot mix long-term memory across runs
Node probes stay installed for the compiled app (refcount), but each run has its own probe bucket, logs, and cancel via capture lookup
Process-global stdout/stderr and time.sleep patches resolve the current run through TLS / thread_id, so queued and running workers do not leak logs or cancel
save_run writes to a temp file and os.replaces it; list/load skip unreadable JSON and hidden temp files
Graph workers are non-daemon and joined after cancel, so disconnecting cannot free a slot while an LLM call is still running
Closing a tab dequeues a waiting run and still cancels a live one; a paused or finished run is left alone
Leftover queued / running stubs from a crashed process are canceled on the next serve so they do not look runnable
SSE queue waits send comment heartbeats (: ping) so proxies do not drop the connection
Fixed
Cancel shows Canceling on the button and pipeline until the run actually stops
A 4th Run is queued instead of rejected; a full queue returns HTTP 429 {busy, active, queued, limit, queue_limit}, not a generic 400
Closing the tab dequeues a queued wait without starting the graph
A second start of the same run_id is refused (HTTP 409 {active, run_id}), not HTTP 400
Trace graph edges no longer stretch into giant loops after opening Trace from a fresh start / another page (edges were drawn while the pane was display: none)
Trace follows the run you opened: finishing another job does not replace the view; History / Runs clicks keep the live SSE
Clear / Delete refuse while a pipeline or run is queued or running
Pipeline glob no longer descends into Python environments (.venv / venv, pyvenv.cfg, conda prefixes, tox / pixi / direnv)
File watch re-hashes pipeline files only when size changes, so cloud-sync mtime jitter does not re-read them