Repository navigation
Releases: dkedar7/langstage-core
Releases · dkedar7/langstage-core
Release list
langstage-core 1.0.16
Fixed
examples/fastapi_websocket.pyresumed an interrupt with a bare list, crashing a real HITL agent — the same bug as #85, missed in the FastAPI example (gh #87). Thedecisionbranch forwarded the client's baredecisionslist intoresume=[...], but the HITL middleware reads it back asinterrupt(...)["decisions"], so a real deepagents/HITL agent (the swap-in the example invites) crashed withTypeError: list indices must be integers or slices, not stron the first Approve. The example now wraps it in the decision enveloperesume={"decisions": [...]}, matching the README, the Jupyter example (#86), andcreate_resume_input. Thetests/test_example_docs.pyguard now scans everyexamples/*.pyfile too, so no shipped surface can regress to the bare list again.
langstage-core 1.0.15
Fixed
- The Jupyter example notebook's HITL resume snippet used a bare list, which crashes the middleware (gh #85).
examples/jupyter_example.ipynbshowedresume=[{"type": "approve"}], butHumanInTheLoopMiddlewarereads the resumed value back asinterrupt(...)["decisions"]— a list has no["decisions"], so copy-pasting the snippet crashed the resume. Corrected to the decision enveloperesume={"decisions": [{"type": "approve"}]}(the same shapecreate_resume_input(...)builds and the README already documents). Newtests/test_example_docs.pyforbids a bare-listresume=in both the notebook and README and ties the documented literal tocreate_resume_input(...)'s output so they can't drift.
Full changelog: https://github.com/dkedar7/langstage-core/blob/main/CHANGELOG.md
v1.0.14
Changed
HostConfig.describe()is now the single, complete config diagnostic — it renders the[configurable]table too (newconfigurable=arg). A run of nightly issues (#55/#57/#61/#64/#66) were all config-diagnostic drift: each surface assembled its own--show-config//configoutput and the pieces drifted. Folding the[configurable]table intodescribe()means the whole diagnostic comes from one method, so every surface's two config views render identically by construction. Purely additive.
v1.0.13
Fixed
create_resume_input(...)no longer double-wraps underiter_event_frames/iter_chunk_frames, crashing HITL resume (gh #82). The helper returns a LangGraphCommand, but the iterators'resume=builds theCommandthemselves — so passing the helper's output gaveCommand(resume=Command(...))and the graph'sinterrupt()returned the innerCommand, crashing a HITL node with'Command' object is not subscriptable. The iterators now unwrap aCommand's.resume, so bothresume=create_resume_input(...)and a rawresume={...}work.- A malformed TOML config is no longer listed as "read", and its warning prints once (gh langstage-hermes #61).
load_toml_configappended a malformed file tosources(so--show-configprintedTOML read from: <it>), and the "ignoring malformed" note printed twice._read_tomlnow records malformed paths + dedupes the warning; loaders skip listing a malformed file.
v1.0.12
Fixed
from langstage_core import SessionAdapter/Sessionnow works, matching the docs (gh #80). The README says everything is re-exported at the top level (except the AG-UI helpers) and listsSessionAdapter/Session, but they were only importable fromlangstage_core.adapters— so the documented top-level import raisedImportError. They're now re-exported at the top level (still underlangstage_core.adapterstoo). Also fixed the package docstring, which miscategorizedSessionAdapterunder theaguibullet.
v1.0.11
Docs
- The README no longer over-promises the
langgraph_stream_parsercompat shim (gh #77). It said the old import "still works via a compat shim," reading as "installlangstage-coreandimport langgraph_stream_parserkeeps working" — but the shim is a separate distribution (langgraph-stream-parser1.0) thatlangstage-coreneither bundles nor depends on (that would be circular), so a fresh install hitModuleNotFoundError. The README now states the old name works only while the separatelanggraph-stream-parserpackage stays installed.
v1.0.10
Fixed
- The standard HumanInterrupt shape no longer crashes an interrupt turn (langstage-vscode #40). The
on_interrupthandler assumed the interrupt value was a dict keyedaction_requestsand didpayload.get(...)— so the list of HumanInterrupt dicts deepagents/langchain HITL emit raised'list' object has no attribute 'get'and failed the turn, while any other plain dict returned an emptyaction_requests. A shared_normalize_interruptnow handles the HumanInterrupt list (unwrapping eachaction_request, derivingallowed_decisionsfrom theconfigflags), our keyed dict, and a plain dict — on bothiter_event_frames(vscode/web) anditer_chunk_frames(cli/jupyter).
v1.0.9
Fixed
- A relative workspace no longer doubles the agent's working directory (gh #66).
apply_workspace()stored the root as given (e.g../ws), andworkspace_root()re-.resolve()d it against the current cwd on every call — so a surface that then chdir'd into the workspace (the cli, or the web app's_enter_workspace) doubled it tows/ws, splitting the agent's working directory from the file browser root. The root is now resolved to absolute once, at apply time, soworkspace_root()is idempotent across a later chdir. Absolute and default (.) workspaces were unaffected.
Docs
- The two shipped
examples/run again on a clean 1.0 install (gh #75). Both imported symbols removed in the 1.0 rename (FastAPIAdapter,JupyterDisplay,StreamParser).fastapi_websocket.pynow drivesagui.iter_event_framesover the WebSocket (HTML client unchanged);jupyter_example.ipynbwas rewritten aroundagui.iter_chunk_frames. Both run keyless.
v1.0.8
Fixed
iter_event_frames/iter_chunk_framesnow emit the advertisedreasoningframe (gh #71). The mappers had no branch for theReasoning*/Thinking*AG-UI eventsag-ui-langgraphemits for reasoning-capable models (Anthropic extended thinking, o-series, DeepSeek R1, …), so chain-of-thought was silently dropped.ReasoningMessageContentEvent/ThinkingTextMessageContentEventnow map to{"type":"reasoning","content":…}(event wire) /{"status":"streaming","reasoning":…}(chunk wire), separate from thecontentanswer.
v1.0.7
Added
apply_workspace()/workspace_root()— the single workspace source of truth (ADR 0005). Core resolvedworkspace_root(the value) but never applied it, so each surface invented its own mechanism (clichdir/ vscode env-push / hermes backend-arg / jupyter global-mutate / web hand-sync) and three drifted into a workspace bug (#19, #45/#36, #44).apply_workspace(root, *, chdir=False)— called once afterHostConfig.resolve()— ensures the dir exists, records the process's active workspace, and publishesLANGSTAGE_WORKSPACE_ROOT(+ legacy).workspace_root()is the one accessor tools and surfaces read instead of a private global.chdiris opt-in. Surfaces migrate incrementally; a bring-your-own graph's tools opt in by readingworkspace_root(). Both exported top-level.