Skip to content

Releases: dkedar7/langstage-core

langstage-core 1.0.16

Choose a tag to compare

@dkedar7 dkedar7 released this 10 Jul 11:57
0da49ee

Fixed

  • examples/fastapi_websocket.py resumed an interrupt with a bare list, crashing a real HITL agent — the same bug as #85, missed in the FastAPI example (gh #87). The decision branch forwarded the client's bare decisions list into resume=[...], but the HITL middleware reads it back as interrupt(...)["decisions"], so a real deepagents/HITL agent (the swap-in the example invites) crashed with TypeError: list indices must be integers or slices, not str on the first Approve. The example now wraps it in the decision envelope resume={"decisions": [...]}, matching the README, the Jupyter example (#86), and create_resume_input. The tests/test_example_docs.py guard now scans every examples/*.py file too, so no shipped surface can regress to the bare list again.

langstage-core 1.0.15

Choose a tag to compare

@dkedar7 dkedar7 released this 10 Jul 02:37
d9214b5

Fixed

  • The Jupyter example notebook's HITL resume snippet used a bare list, which crashes the middleware (gh #85). examples/jupyter_example.ipynb showed resume=[{"type": "approve"}], but HumanInTheLoopMiddleware reads the resumed value back as interrupt(...)["decisions"] — a list has no ["decisions"], so copy-pasting the snippet crashed the resume. Corrected to the decision envelope resume={"decisions": [{"type": "approve"}]} (the same shape create_resume_input(...) builds and the README already documents). New tests/test_example_docs.py forbids a bare-list resume= in both the notebook and README and ties the documented literal to create_resume_input(...)'s output so they can't drift.

Full changelog: https://github.com/dkedar7/langstage-core/blob/main/CHANGELOG.md

v1.0.14

Choose a tag to compare

@dkedar7 dkedar7 released this 08 Jul 14:40
20b1918

Changed

  • HostConfig.describe() is now the single, complete config diagnostic — it renders the [configurable] table too (new configurable= arg). A run of nightly issues (#55/#57/#61/#64/#66) were all config-diagnostic drift: each surface assembled its own --show-config / /config output and the pieces drifted. Folding the [configurable] table into describe() means the whole diagnostic comes from one method, so every surface's two config views render identically by construction. Purely additive.

v1.0.13

Choose a tag to compare

@dkedar7 dkedar7 released this 08 Jul 12:43
4be88c3

Fixed

  • create_resume_input(...) no longer double-wraps under iter_event_frames / iter_chunk_frames, crashing HITL resume (gh #82). The helper returns a LangGraph Command, but the iterators' resume= builds the Command themselves — so passing the helper's output gave Command(resume=Command(...)) and the graph's interrupt() returned the inner Command, crashing a HITL node with 'Command' object is not subscriptable. The iterators now unwrap a Command's .resume, so both resume=create_resume_input(...) and a raw resume={...} work.
  • A malformed TOML config is no longer listed as "read", and its warning prints once (gh langstage-hermes #61). load_toml_config appended a malformed file to sources (so --show-config printed TOML read from: <it>), and the "ignoring malformed" note printed twice. _read_toml now records malformed paths + dedupes the warning; loaders skip listing a malformed file.

v1.0.12

Choose a tag to compare

@dkedar7 dkedar7 released this 08 Jul 01:37
a6257cc

Fixed

  • from langstage_core import SessionAdapter / Session now works, matching the docs (gh #80). The README says everything is re-exported at the top level (except the AG-UI helpers) and lists SessionAdapter/Session, but they were only importable from langstage_core.adapters — so the documented top-level import raised ImportError. They're now re-exported at the top level (still under langstage_core.adapters too). Also fixed the package docstring, which miscategorized SessionAdapter under the agui bullet.

v1.0.11

Choose a tag to compare

@dkedar7 dkedar7 released this 06 Jul 11:53
e3066df

Docs

  • The README no longer over-promises the langgraph_stream_parser compat shim (gh #77). It said the old import "still works via a compat shim," reading as "install langstage-core and import langgraph_stream_parser keeps working" — but the shim is a separate distribution (langgraph-stream-parser 1.0) that langstage-core neither bundles nor depends on (that would be circular), so a fresh install hit ModuleNotFoundError. The README now states the old name works only while the separate langgraph-stream-parser package stays installed.

v1.0.10

Choose a tag to compare

@dkedar7 dkedar7 released this 06 Jul 11:18
34e56bf

Fixed

  • The standard HumanInterrupt shape no longer crashes an interrupt turn (langstage-vscode #40). The on_interrupt handler assumed the interrupt value was a dict keyed action_requests and did payload.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 empty action_requests. A shared _normalize_interrupt now handles the HumanInterrupt list (unwrapping each action_request, deriving allowed_decisions from the config flags), our keyed dict, and a plain dict — on both iter_event_frames (vscode/web) and iter_chunk_frames (cli/jupyter).

v1.0.9

Choose a tag to compare

@dkedar7 dkedar7 released this 05 Jul 14:27
841a75c

Fixed

  • A relative workspace no longer doubles the agent's working directory (gh #66). apply_workspace() stored the root as given (e.g. ./ws), and workspace_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 to ws/ws, splitting the agent's working directory from the file browser root. The root is now resolved to absolute once, at apply time, so workspace_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.py now drives agui.iter_event_frames over the WebSocket (HTML client unchanged); jupyter_example.ipynb was rewritten around agui.iter_chunk_frames. Both run keyless.

v1.0.8

Choose a tag to compare

@dkedar7 dkedar7 released this 04 Jul 15:14
432a0b1

Fixed

  • iter_event_frames / iter_chunk_frames now emit the advertised reasoning frame (gh #71). The mappers had no branch for the Reasoning*/Thinking* AG-UI events ag-ui-langgraph emits for reasoning-capable models (Anthropic extended thinking, o-series, DeepSeek R1, …), so chain-of-thought was silently dropped. ReasoningMessageContentEvent/ThinkingTextMessageContentEvent now map to {"type":"reasoning","content":…} (event wire) / {"status":"streaming","reasoning":…} (chunk wire), separate from the content answer.

v1.0.7

Choose a tag to compare

@dkedar7 dkedar7 released this 03 Jul 21:38
79729a3

Added

  • apply_workspace() / workspace_root() — the single workspace source of truth (ADR 0005). Core resolved workspace_root (the value) but never applied it, so each surface invented its own mechanism (cli chdir / 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 after HostConfig.resolve() — ensures the dir exists, records the process's active workspace, and publishes LANGSTAGE_WORKSPACE_ROOT (+ legacy). workspace_root() is the one accessor tools and surfaces read instead of a private global. chdir is opt-in. Surfaces migrate incrementally; a bring-your-own graph's tools opt in by reading workspace_root(). Both exported top-level.