This release includes 1 security fix for security teams reviewing exposed deployments.
Published 1mo
AI Agents & Assistants
✓ No known CVEs patched
This release patches 1 known CVE
Topics
ai-agents
deepagents
elixir
harness
human-in-the-loop
langchain
+4 more
langgraph-alternative
llm
observability
distributed-tracing
Affected surfaces
rce_ssrf
Summary
AI summarySecurity, transport, Anthropic, Google, OpenAI, xAI, Moonshot, graph, memory/retrieval, rate limiting, serialization, core messages, sandbox fixes.
Full changelog
0.1.2 - 2026-06-20
Fixed
Security and transport:
- SSRF: Req no longer auto-follows redirects. Every redirect hop is validated
against the URL policy, including on streaming paths. - PII: overlapping detector spans (such as a URL containing an IP) no longer
crash or garble output. Spans are pruned to stay disjoint. - IPv4 reserved-range checks no longer over-block public
/16ranges. - IPv6
fe80::/10is treated as reserved, so it stays blocked when
allow_metadata?is on. - Per-call request options (including
:timeout) override client transport
defaults instead of being shadowed.
Providers:
- Anthropic: beta flags go in the
anthropic-betaheader, not the body. This
covers invoke, stream, stream_events, and count_tokens. - Anthropic: final streaming usage is a proper usage map merged into metadata.
- Anthropic: a non-list
:toolsoption (such asnil) no longer raises; tools
are omitted. - Google: streaming tolerates chunks with no candidates, content, or parts.
- Google:
countTokenssends exactly one ofcontentsor
generateContentRequest. - OpenAI: a bare-string
:image_urlblock is handled instead of crashing. - OpenAI: model inference is limited to
o1/o3/o4/chatgptprefixes, so
other models are not misrouted. - OpenAI: parsing a chunk with no tool calls returns
[], not an error. - xAI:
ChatCompletionsModel.new/1no longer crashes onstreaming: true. - Moonshot: the tool-name regex accepts short and digit/hyphen-leading names.
- Provider runtime: stream-metadata returns
%{}instead of crashing when an
adapter has no metadata function. - Cached models keep usage cost on a cache miss, for both stream and
stream_events.
Agents and middleware:
interrupt_before/interrupt_after: :allis preserved instead of becoming
[:all], which had disabled all human-in-the-loop interrupts.- Structured final-response extraction handles string-keyed state instead of
crashing. list_async_tasksrefreshes live status before filtering, not stale status.- A configured subagent-output response that is not a map or function is honored,
not dropped. - The tool emulator falls back to
"unknown_tool"when a tool call has no name.
Graph:
- Validation-node task exits become error messages instead of crashing the node.
- Pending checkpoint-map merging tolerates a missing
configurablekey. - Delta channels keep
nil/falseoverwrite values instead of resetting to the
initial value. input_channelshides private channels (such as__node_outputs__) when there
is noinput_schema.- An empty-list edge condition is treated as membership, not a match-anything map.
add_messageshonors the lastremove_allmarker, not the first.- OpenAI message formatting tags tool calls as
"tool_call", not"tool_calls". ServerInfo.UserAccess no longer leaks struct-field keys into user metadata.
Memory, retrieval, and indexing:
- Ecto memory applies
default_ttlon write. Refresh-on-read updates only
expires_at, notupdated_at. - ETS chat history no longer drops messages under concurrent
add_messages;
writes are atomic. - Indexing without a record manager deduplicates documents that share an id.
- ETS memory namespace listing ignores unknown match-condition types instead of
crashing. - Memory metadata filters match a plain-map value by equality instead of always
failing. - Vector-store SQL filters render
$and/$or/$not. - The policy retriever honors
:similarity_scoreandscore_threshold. - The SQL
$likefilter keeps the user pattern verbatim, matching ETSlike. - ETS vector store stringifies ids in
delete/get_by_ids, so non-string ids
match. - File-search snippets slice with correct offsets, fixing garbled multibyte text.
add_start_indexreports a character index, not a byte offset.
Rate limiting:
- The rate-limited wrapper streams through
ChatModel.stream/3instead of
degrading to invoke when the provider module is not loaded. - Token-bucket
acquirerejects negative or non-integer timeouts and invalid
modes up front. - Retry delays are re-clamped to
max_delayafter jitter, including the
zero-backoff path.
Serialization and schema:
- Maps with colliding atom/string keys raise instead of silently dropping one.
- The pretty JSON encoder escapes all control characters.
- Structured-output
oneOfvariants get distinct spec names. - A nullable typeless tool field becomes
anyOf[…, null], not null-only. - Checkpoint config normalization returns
%{}whenconfigurableisnil. MapAccess.firstreturns afalse/nilvalue instead of the default.- Empty-string schema defaults are emitted, not dropped.
- Strict tool-schema rendering keeps user keys with
nilvalues. - Schema fields given as 2-tuples normalize instead of crashing.
- Tracing
custom_fieldsskips non-pair list entries instead of crashing.
Core messages and text:
- XML output parsing slices on byte offsets, fixing multibyte corruption.
- Tool-result truncation backs off to a valid UTF-8 boundary.
- Trimming with
:lastkeeps the last words, not the first. - Usage subtraction clamps right-only token counts to zero, including nested maps.
- The
drop_oldestmux drops the newest item instead of erroring when the buffer
is full. - Prompt partials and the simple template renderer no longer mishandle supplied
or brace values. - Partial JSON repair is no longer cubic on long input.
- Fixed assorted dead and edge-case clauses: agent decision normalization,
transient-error and MFA retry predicates, and the HTML header splitter.
Sandbox and shell:
- Docker
edit/5starts the container once and threads it through
read/write/execute. Edits previously hit throwaway containers and leaked
containers. - Docker execute/read truncation respects UTF-8 codepoint boundaries.
- The Docker sandbox prints the entry type before the path, so
ls/globhandle
paths containing|. - File-formatting long-line chunking splits on character boundaries, not raw
bytes. - A host shell command no longer crashes when the policy timeout is
nil. - Shell host-executor and session temp files are cleaned up even on timeout or
kill.
Changed
- Default operation timeout raised from 5 seconds to 5 minutes for runnable
batch/map/parallel/fallback and the agentGenServer.call. An explicit
:timeoutstill overrides it.
Internal
- Removed dead clauses and other compiler-warning sources.
mix compileand
mix testnow run clean.
Security Fixes
- SSRF: request processing no longer auto-follows redirects; each redirect hop is validated against the URL policy, including streaming paths.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About BeamWeaver
All releases →Related context
Related tools
Beta — feedback welcome: [email protected]