Repository navigation
Releases: uncoalesced/agent-wire
Release list
agent-wire 0.2.3
agent-wire 0.2.3
Agents burn context calling tools one at a time. Every search, read and feed result lands in the conversation, even the parts the agent throws away a step later. This release adds Code Mode: the agent writes one short script, agent-wire runs it, and only the answer comes back. It also closes off private addresses and adds a lot more CI.
uvx agent-wire-cli install --client autoCode Mode: wire_run
The idea comes from Cloudflare's Code Mode. Instead of several tool calls, the agent writes one async JavaScript script against wire.read, wire.search, wire.feed, wire.research and wire.cite. Those return plain data, not formatted pages. The script filters and joins it, and only its return value and console.log output reach the model.
const hits = await wire.search('rust async', {platforms: 'hn', limit: 4});
const docs = await wire.read(hits.map(h => h.url));
return docs.map(d => ({title: d.title, points: d.score,
top: d.comments.sort((a, b) => b.score - a.score).slice(0, 3).map(c => c.text.slice(0, 90))}));On an offline benchmark (HN top 4 threads with 3 best comments each), classic tools used 3,394 context tokens over 2 round trips. Code Mode used 468 tokens in 1 round trip, 86% fewer. A live run over Reddit and HN fetched 41,005 tokens and returned 61.
- The sandbox is QuickJS (
quickjs-ng). Scripts get no filesystem, network, timers or modules. Limits: 64 MB memory, 5 s CPU per step, 60 s wall clock, 40 calls, 16 in flight. Promise.allruns calls in parallel.- Scrubbing, the prompt-injection shield and citation provenance all still apply.
wire_meis left out of scripts on purpose. wire serve --code-modeexposes onlywire_runandwire_status. The normal profile lists 8 tools. From a shell:wire run script.jsorwire run -e "...".- The bundled skill, the
wire-workersub-agent and the Cursor, Windsurf and Hermes rules explain when to reach forwire_run.
Private addresses are refused
wire_read, Code Mode reads and the citation checker now refuse localhost, private-network and cloud-metadata addresses, plus anything that isn't http(s). Redirects are followed by hand and every hop is checked again, so a public page can't bounce a request onto your network. The browser stage blocks those requests too. Citation links to private addresses come back as BLOCKED without being opened.
Things you configure yourself, like a self-hosted SearXNG, a transcription endpoint or a watch webhook, are always allowed on a private address. Set WIRE_ALLOW_PRIVATE=1 only if you want reads to reach your own intranet.
Fixes
- Saved cookies are never attached to anonymous fetches, even after a login wall, and citation checks always go out without your session.
- Code Mode: a
for (;;) await 0loop can't hang the server, scripts can't reach or replace the host's hooks, and lone surrogates in strings no longer crash Python. wire_runerror text is capped and stays inside the untrusted block.wire runandwire citeread piped stdin as UTF-8, which matters on Windows.- RSS, Google News, Reddit search and arXiv feeds are parsed with
defusedxml. rookiepyis skipped on Python 3.13+, which has no wheel for it.- Dependencies:
fastmcp4.1.4 (GHSA-7xgj-8392-5q4r, GHSA-vqqp-x5qm-5qp4), plus newercertifiandfilelock.
Security and CI
- New
SECURITY.md: how to report privately, what's in scope, and known limitations. - CI now has a lint job (ruff, format and lock checks), tests on Python 3.11 to 3.14, and a wheel install plus real stdio MCP smoke test on Linux, macOS and Windows.
- A new security workflow runs pip-audit, bandit, zizmor and dependency review, alongside CodeQL for Python and Actions. Dependabot opens weekly grouped updates.
- Every action is pinned by SHA. The release build uses no cache and keeps no credentials.
378 offline tests pass on Linux, macOS and Windows.
agent-wire 0.2.2
agent-wire 0.2.2
When you ask an agent for sources, two things go wrong. Either it makes one up, or it gives you a real-looking link that's dead, has moved, or doesn't say what it claims. This release is about both.
uvx agent-wire-cli install --client autowire_cite: check the sources before the answer goes out
There's a new tool, wire_cite. The agent passes it its draft answer, and every cited link gets opened. Each link comes back with a verdict:
OK: the page is live, with its title and first lines so the agent can check it matches the claim.DEAD: gone, with no archived copy. The agent gets a readywire_searchquery for a replacement and is told to ask you or a sub-agent rather than quietly drop the citation.ARCHIVED: the original is gone but the Wayback Machine has it, so the agent cites the snapshot and says the original is dead.SOFT_404: the page loads but says "not found", or a deep link bounces to the site's home page.BLOCKED: the site refuses bots. The page exists but can't be verified, so it stays in, marked as unverified.QUOTE_MISSING: the page is live but the quoted words aren't on it.
The archive fallback is off while checking, so a dead page can't pass as live through its Wayback copy.
Links that agent-wire never returned during the session are flagged NOT SEEN. Those usually came from the model's memory, and that's where made-up citations come from.
From a shell:
wire cite answer.md[[UNSOURCED]]
When the agent has no source for a claim, it now writes [[UNSOURCED]] after it instead of inventing one. wire_cite lists every marked claim, so the agent either finds a source or tells you plainly that the claim is unverified. The server instructions, the bundled skill, the wire-worker sub-agent and the Cursor, Windsurf and Hermes rules all teach this.
I picked a bracketed token on purpose. A real word like "Penguin" would flag real citations from Penguin Random House.
Research briefs check their own links
wire_research now opens the web and news links it shows, plus the articles that HN and Reddit posts point to, and marks failures with ⚠ and an archived link where one exists. JSON output has a link_status map. It adds a few seconds at most (8 s per link, 20 links max, run in parallel). Use --no-verify-links or verify_links=False to skip it.
Fixes
- The Wayback availability API answers HTTP 429 under load and then says "no snapshot" for pages it does have. The checker falls back to the CDX index, and if that fails too it says "archive lookup failed" instead of claiming there's no copy.
ruff format --checkwas failing onmainafter the tool-annotations change. Fixed.
Everything else
- The README has a "Citations you can trust" section, lists seven tools, and has MCP badges.
- Plugin, Gemini extension and Hermes skill versions are bumped to 0.2.2.
290 offline tests pass (20 of them new) on Linux, macOS and Windows with Python 3.11 and 3.14. Live, wire cite returned OK, QUOTE_MISSING, DEAD, SOFT_404 and ARCHIVED on real links. BLOCKED is covered by offline tests only.
Full changes: #4
agent-wire 0.2.1
agent-wire 0.2.1
This is the first release you can actually install from PyPI. It just has a different name:
uvx agent-wire-cli install --client autoPyPI refused agent-wire because agentwire already exists, and that's why 0.2.0 never made it there. Only the package name changed. The command is still wire, the import is still agent_wire, and the plugin and skill names are the same. The installer and the client manifests (Codex, Gemini, Hermes, Antigravity, Peridot) now launch uvx agent-wire-cli serve.
Fixes
Before shipping I pointed every channel at the live sites with no logins and fixed what broke.
- Reddit search used to come back empty when anonymous JSON was blocked, and it took 29 seconds to get there. It now falls back to Reddit's own search RSS, then PullPush, then Arctic Shift.
- Several servers starting on a fresh
WIRE_HOMEat the same moment fought over the tokenizer cache on Windows, and one of them crashed. Fixed. - arXiv search could hang for 30 to 50 seconds when the export API stalled. It gets 8 seconds now, then OpenAlex takes over.
- An HTTP 429 made the fetcher cycle through three browser fingerprints for nothing. It stops right away now, or tries an archive copy.
- Google News links resolve to the publisher's URL, so briefs link to the real article, and
wire_readon a news.google.com link reads that article. - Mastodon profiles (
/@user) go through the account API and load in about a second. They used to need the headless browser. - dev.to picks better tags ("Model Context Protocol" finds
mcp), anddev.to/t/<tag>pages read as the tag feed. - Discover mode no longer lists one story under two names, treats a bare "5.5" as a topic, or shows topics with a single story.
- The
lobste.rsandpolymarket.comfront pages read as listings instead of erroring. - Titles that wrapped across lines broke their links in listings. Reddit crosspost links are absolute now.
Everything else
- The README has a proper header (banner, badges, logo), and the banners say 31 platforms.
- Plugin, Gemini extension and Hermes skill versions are bumped to 0.2.1.
270 offline tests pass on Linux, macOS and Windows with Python 3.11 and 3.14, and a 45-case live sweep with an empty vault passes too.
If a site stops parsing for you, open an issue with the URL. Those get fixed fastest.
agent-wire 0.2.0
agent-wire 0.2.0
Last-30-days research, four new key-free channels, and release plumbing.
Research
- New
wire_researchMCP tool andwire researchCLI: one cited brief on what people said about a topic in the last N days. Modes: topic, compare ("A vs B"), discover, person. Depth quick/default/deep,--as-of,--preflight, md/json/html output. - Ranking blends relevance, per-source engagement and freshness; stories are clustered across sources, with momentum labels and a Polymarket odds section.
wire watch add|list|remove|runre-runs topics and reports what's new (optional webhook).wire brief daily|weeklydigests every watched topic.wire library search|list|show|feed: saved briefs, offline search, a local index page and an Atom feed.
Channels (31 total)
- New, no key needed:
polymarket,news(Google News RSS + Techmeme),stocktwits,devto. - GitHub person mode, Mastodon tag search, Lobsters hottest filter.
- Reddit falls back to the Arctic Shift archive when anonymous access is blocked.
- Search hits carry timestamp, author, link and engagement;
sincewindows on HN, GitHub, Stack Overflow, Bluesky, Reddit, dev.to, news, Polymarket and StockTwits.
Fixes
- MCP connect timeout: local-checkout installs use
uv run --directory(handshake 21 s to about 2 s). - Bluesky search host, stage-4 browser waits and challenge handling,
wire auth logincrash when the window closes, arXiv search fallback, dev.to tags, RSS URLs that serve HTML. wire install --client autoasks before writing (--yesto skip).
Install
0.2.0 never reached PyPI (the name was taken). Install the current release instead, which includes everything here:
uvx agent-wire-cli install --client autoCI now runs on Linux, Windows and macOS with Python 3.11 and 3.14.