Open source
Contributions
29 merged12 projects25 in review4 fixed upstream
OpenHands Active Contributor
OpenHands named me an Active Contributor in August 2026. It comes with priority review, triage access, and contributor benefits. The title matters more to me because of who grants it: the people building a coding-agent harness, after reviewing my work and collaborating with me across their projects.
It's an honor. Twenty-one merged contributions across the OpenHands app, software-agent SDK, docs, typescript client, and Agent Canvas are public below and in the official OpenHands contributor directory.
Merged
-
OpenHands / typescript-client #364 merged Aug 2026
The
release readygate had never once started: every run ended asstartup_failurewith no jobs and no logs, because the caller grantedcontents: readto a reusable workflow whose jobs needcontents: write, and GitHub validates called-workflow permissions statically, before anything runs. One grant, and the gate runs. First fork PR merged in this repo. -
OpenHands #16439 merged Aug 2026
Re-derives the active model stamp from event history so a dropped socket stops leaving the readout disagreeing with the model the agent is using.
-
OpenHands #16441 merged Aug 2026
Exposes the SDK's existing LLM-switching toggle in Agent settings, so users can stop an agent from moving itself to another model under a confirmation policy that never asks.
-
OpenHands #16279 merged Aug 2026
Handles
SIGHUPin the minimal development launcher so closing a terminal or multiplexer cleans up its detached services instead of leaving ports and lease files behind. -
OpenHands #16280 merged Aug 2026
Handles
SIGHUPin the extra-backend development launcher so the agent-server cannot survive its parent and keep stale conversation leases alive. -
OpenHands / docs #750 merged Aug 2026
Documents issue triage and the
ready-for-devgate contributors otherwise had to learn by failing CI: labeling, acceptance criteria, evidence placement, linked issues, and bot abstention. -
OpenHands #16758 merged Aug 2026
Searching
xaiin the Cloud LLM provider list returned only a fuzzy name match while the realxAIentry sat past the default page cut: the providers hook read the first page and droppednext_page_id. It now walks the cursor to exhaustion, cycle-guarded, so all 135 providers surface. This is the follow-up the #16415 close comment predicted after #16453 fixed the local path. -
OpenHands #16656 merged Aug 2026
The desktop app shipped macOS and Windows installers but nothing for Linux, and the deb target could not build at all: fpm refuses a package with no author email. Adds a Linux CI lane mirroring the other two and the four-line
maintainerfield, so AppImage and deb both build. Smoke-tested on Fedora. -
OpenHands #16145 merged Aug 2026
The ACP auth banner detected a signed-in user by shelling the provider's CLI, which only tells the truth on a native local install. On Docker and cloud that probe came back empty, so a correctly supplied credential showed no acknowledgement at all. Adds a neutral 'credentials configured' banner state driven by the secret store, which works on all three. Re-landed here after agent-canvas moved into this repo.
-
OpenHands / software-agent-sdk #4536 merged Aug 2026
send_messageowns skill activation for every user message: matching the text against the agent's skills, attaching the recalled knowledge to the event, and recording the activation so a skill fires once per conversation. The block shipped carrying its own# TODOfor test cases. These pin the wiring. -
OpenHands / software-agent-sdk #4526 merged Aug 2026
events_to_messagesis the projection that turns the persisted event log into the messages the model actually sees, and it had carried a# TODO: We should add extensive tests for thissince it was written. Writing the boundary tests exposed a live defect underneath: reasoning items dropped out of re-batched parallel tool calls. Both land here. -
OpenHands / software-agent-sdk #4482 merged Aug 2026
Adds
POST /file/create_directoryto the file router, so a client can create a workspace folder instead of only listing the ones that already exist. Verified over real HTTP against a running agent-server through a locally built typescript-client: nested paths, repeat calls, and immediate visibility to the folder picker's own listing endpoint. -
OpenHands #16534 merged Aug 2026
The context meter drew its ring track from a border token, which left the track washed out against the surface behind it. Draws it from the foreground colour instead. Checked by building the full stack from
mainand from the branch with nothing else changed, then reading the rendered colours out of the running app rather than trusting the token names. -
OpenHands #16311 merged Aug 2026
A context-window usage meter, a usage drawer, and manual compaction, replacing the old metrics modal. Carries three fixes found along the way: a divide-by-zero on models that report no context window, websocket usage metrics dropped for non-agent usage ids, and a crash on the home route.
-
OpenHands #16272 merged Aug 2026
The repo ignored three named subdirectories of
.tmp/while the test harnesses wrote to several more, so runtime state kept turning up in commits. Ignoring the root instead means the list can't fall behind the code again. -
OpenHands #16239 merged Aug 2026
The dev launcher handled
SIGINTandSIGTERMbut notSIGHUP, so closing a terminal or multiplexer killed the launcher and left its detached services running. Reproduced against the real spawn path before and after the fix. -
OpenHands / software-agent-sdk #4150 merged Jul 2026
Verifies the
kimi-for-codingmodel id against Moonshot's Kimi Code membership endpoint, so it appears in the agent-canvas model picker with a Verified badge instead of free-typed entry. Companion to agent-canvas #1844. -
OpenHands #16152 merged Jul 2026
The mock-LLM end-to-end stack now shuts down gracefully, so a test run stops leaving six orphaned processes and four bound ports behind after Playwright exits.
-
OpenHands / agent-canvas #1844 merged Jul 2026
Adds Moonshot's Kimi Code membership as a first-class provider option, so a Console API key against api.kimi.com/coding/v1 works without free-typing the base URL. Companion to software-agent-sdk #4150, which earns the model its Verified badge.
-
stupidedi #289 merged Jul 2026
Re-enabled the 4010 AR943 and RE944 transaction sets (warehouse stock-transfer shipment and receipt advice), whose autoload had been off on the same outgrown segment-element lists as PO850.
-
stupidedi #288 merged Jul 2026
Re-enabled the 4010 PO850 transaction set, whose autoload had been off because the segment definitions had outgrown its element lists.
-
OpenHands / agent-canvas #1368 merged Jul 2026
Groups workspace folders by parent in the dropdown, so deeply nested paths stay organized instead of flattening into one list.
-
ferriskey #1133 merged Jul 2026
Adds the
TokenExchangegrant type and its domain value objects, opening RFC 8693 token exchange in the Rust auth server. -
neurolink #1134 merged Jul 2026
Moves system messages to the AI SDK
generateTextsystemoption instead of themessagesarray. Shipped in v9.82.0 on npm. -
OpenHands / agent-canvas #1434 merged Jun 2026
The acp-docker example inherits its agent-server image from
config/defaults.jsoninstead of pinning a version below the Canvas compatibility floor. -
last30days-skill #564 merged Jun 2026
A
pass(1)credential source: the Linux analog of the macOS Keychain support, so secrets come frompassinstead of a.envfile. -
models.dev #475 merged Dec 2025
Added the Claude Opus 4.5 entry to the model catalog.
-
opencode #4748 merged Nov 2025
Documented the Venice.ai provider.
-
largo #164 merged Mar 2014
Updated the LESS syntax in
mixins.lessfor the WordPress theme. The long end of the track record.
In review
-
OpenHands / software-agent-sdk #4799
The conversation and bash event clients only checked
window.WebSocket, then fell back torequire('ws')— which does not exist in the package's ESM build, so Node 22+ reported no WebSocket implementation despite shipping a global. ReadsglobalThis.WebSocketdirectly and drops thewsdependency. -
OpenHands / software-agent-sdk #4796
The endpoint-audit CI check failed on every fork PR: posting the report comment 403s on a fork's read-only token, so the job went red before anyone read the audit. The report now always lands in the job summary, and the comment posts only on same-repo PRs.
-
OpenHands / docs #771
Documents the two
MCPToolObservationfields from software-agent-sdk #4775:structured_contentandresult_metakeep an MCP result'sstructuredContentand_metain the serialized observation, so protocol-aware clients receive what the tool actually returned. -
OpenHands / software-agent-sdk #4775
MCP tool results can carry
structuredContentand result_metaalongside their content blocks, and the conversion intoMCPToolObservationsilently discarded both, after which no downstream consumer (event persistence, websocket delivery, protocol-aware clients) could recover them. The observation gains the two fields. Closes #4776. -
OpenHands / docs #761
Documents the per-call
llm_profileoption from software-agent-sdk #4510: model-selection precedence, unknown-profile errors, resume behavior, and the custom profile-store discovery limitation. -
OpenHands / software-agent-sdk #4510
An optional
llm_profilefield on the task tool, so a parent agent keeps its own model while delegating one task to a cheaper, faster, or specialized saved profile. -
OpenHands #16994
The same
release readystartup_failureas typescript-client #364, in the monorepo: 100 runs back to 2026-08-07 all died before any job started, invisible in the Actions UI. Onecontents: writegrant in the caller. -
OpenHands #17009
The package declared
engines.node >= 22.12while every CI pin builds on 24, so npm handed the published package to a runtime nothing tests, with noEBADENGINEto warn.enginesbecomes>=24, matching what CI builds. -
OpenHands / docs #757
Documents the offline prompt-composition report from software-agent-sdk #4623: what each component bucket measures, and how to run
scripts/prompt_composition_report.pyagainstlog_completionsoutput. -
A skill or path rule fires once per conversation, on an event condensation is allowed to forget, while the 'already activated' marker persists and is never cleared. After condensation the guidance can be gone from everything the model sees while state still reports it active. Two end-to-end cases run the whole scenario so the intended lifecycle gets settled against observed behavior rather than a reading of the code. #4623: an offline prompt-composition report,
scripts/prompt_composition_report.py, that ingestslog_completionsoutput and shows what each LLM call's prompt is made of (system prompt, tool schemas, history, latest message), as a per-call breakdown plus a text chart. -
opencode #43685
The Task tool awaited its subagent prompt with no timeout, so a stalled subagent (provider hang, SSE keepalives with no content) hung the parent session with it. Adds an optional
timeoutparameter with a 10-minute default, an env-var override, andtimeout: 0to wait indefinitely. When it fires the subagent is cancelled and the tool returns a<task_error>block carrying the task id for a retry. -
opencode #43684
OpenAI's tool-use API rejects function names over 64 characters, so a long MCP server and tool name made the provider return 400 and opencode silently stopped processing. Truncates over-long names to a readable prefix plus a stable hash suffix, so two tools that would otherwise collide stay distinct, and warns instead of dropping one silently.
-
OpenHands #16426
Adds a provider's whole model catalog as LLM profiles in one pass, instead of one entry at a time.
-
OpenHands / software-agent-sdk #4557
A per-conversation deny-list for sub-agents, enforced at the spawn site rather than by hiding the option, so an agent that already knows a disabled agent's name still cannot delegate to it. Issue #4556.
-
OpenHands #16600
Conversation tags a user applies by hand, a filter bar across the panel, and per-card collapse, so a long conversation list stays navigable instead of scrolling forever.
-
livekit / agents #6280
A fix so a duplicate same-target handoff tool call in one turn no longer reads as ambiguous and aborts the agent switch.
-
open-instruct #1751
A
--launcherflag so non-Ai2 users can run the training launcher locally without a Beaker cluster account. -
stryker-net #3694
Extends the array-creation mutator to implicit array creation, a syntax shape it previously had no arm for.
-
Re-enables the 4010 SM204 (Motor Carrier Load Tender) and SH856 (Ship Notice/Manifest, the 856 ASN), third and fourth in the series after PO850 and AR943/RE944, on the same outgrown-segment fix pattern.
-
A
Flow.kill()resume-event fix so teardown closes the client connection, plus a KillInjected event so killing a flow disconnects in-transit connections. -
LSP score-based client selection and single-file-server handling, so single-file language servers start without root markers.
Fixed upstream
-
A per-runner consecutive-timeout counter that detects and recovers stuck task-runner channels, cutting detection from hours to about six seconds. The PR predated a rework of the same
acceptOfferpath, so a maintainer re-implemented the idea on current master and credited the diagnosis by name. Shipped to the 2.33 and 2.34 release lines. The full hunt → -
The Basic LLM provider list stopped at 100 entries because the server's pagination cursor was discarded, putting
together_ai,vertex_ai, andxaiout of reach in every provider dropdown. Reproduced against unmodified upstream main. #16453 fixed the same bug from the other direction, dropping the limit rather than following the cursor. -
A
ProgressEventtest fallback that could never install itself: it was guarded on the symbol being absent, and jsdom always defines it, which left the request interceptor free to throw during teardown and redden an otherwise passing run. #16504 landed the same root cause. It ships no test, so the 1000-iteration repro lives in that PR's description rather than in the suite. -
Added the missing Venice.ai models to the provider catalog by hand. The maintainers took the general fix instead, generating the whole provider config and refreshing it daily, so the catalog stops going stale between contributions.