v0.10.0 — the agent release
Both agent archetypes ship on a shared actor-model runtime: coding (sub-agents) and persona (agent home), with compaction to keep either alive over long sessions. All six ports — JavaScript, Python, Go, Java, C#, Elixir — byte-parity against the shared examples/ fixtures.
Added
Agent runtime + sub-agents (SPEC.md §7D) — a new agents namespace per port: agent(name, { does, uses, soul, team, budget, … }) with .run() and .asTool(). An Agent is a Tool. Delegation runs through a built-in team-scoped task tool: isolated child transcript, one tool message back, usage roll-up, parallel calls. Underneath — a Handle state machine with six host verbs (spawn/post/wake/wait/interrupt/close), two delivery rails, three loud backpressure gates, hierarchical live-enforced budgets, §10 suspension escalation with durable resume by task-key reattachment.
Persona agents / agent home (SPEC.md §7E) — fromDir(dir) composes the bootstrap files (AGENTS/SOUL/IDENTITY/USER/TOOLS/HEARTBEAT/MEMORY.md, 2 MB cap each) into a frozen soul snapshot at session start. A file-backed memory builtin writes to disk and loads at the start of the next session — never mutating the live prompt, keeping a long-lived persona cache-stable. Plus startAgent(…, { everyMs }), a coalescing heartbeat where a HEARTBEAT_OK reply stays silent.
Context compaction (SPEC.md §7F) — an opt-in compactor({ maxTokens, keepTail, summarize, … }) returning a beforeLLM hook. Below budget it is a byte-identical no-op. Two invariants: the retained tail begins at a user turn (tool-pair safety — a tool result is never orphaned from its tool_call_id), and a leading system prompt survives verbatim.
Docs — sub-agent and persona pages, plus five end-to-end scenario builds (coding agent, persona assistant, research orchestrator, support agent, self-improving agent), each with all six language tabs and an honest "what you bring / what this isn't" section.
Changed — action may be required
RunResult.status gains "incomplete". A maxTurns stop that still had tool calls in flight now returns status: "incomplete" plus limit: "maxTurns" instead of a silent "done". Any limit stop (turns, tokens, tool calls, wall clock) is now loud and names its limit; partial work and the transcript are preserved.
Code matching status === "done" after a maxTurns stop must be updated to also handle "incomplete".
Install
npm install toolnexus@0.10.0
pip install toolnexus==0.10.0
go get github.com/muthuishere/toolnexus/golang@v0.10.0
dotnet add package Toolnexus --version 0.10.0
<dependency><groupId>io.github.muthuishere</groupId><artifactId>toolnexus</artifactId><version>0.10.0</version></dependency>{:toolnexus, "~> 0.10"}