Repository navigation
Releases: LeXwDeX/GraphAgent
Release list
OpenCode GraphAgent v1.0.90
opencode 1.0.90
Stable release from main branch. Retry gateway circuit-breaker rejections and reconnect after unrecognised request failures.
🐛 Bug Fixes
- Retry gateway circuit-breaker rejections (#900). Gateways that trip every upstream target reply with text such as
all targets recovering (half-open probe in flight), often with a 4xx status. These replies now count as transient and use the normal retry backoff, so parallel subagents and DAG workers wait for the breaker to close instead of failing at once.half-open,circuit openandcircuit breaker is openare matched too. - Reconnect after unrecognised failures (#900). A failure that matches no retry rule and has no HTTP status, such as a dropped WebSocket, a broken stream or an unexpected transport error, is now retried up to 3 times. Each retry sends a new request after 3 s, then 6 s, then 6 s. Failures with a known final outcome still stop at once: any 4xx response, user aborts, compaction timeouts, context overflow, authentication errors, output-length and structured-output errors, content filtering, and rejected reasoning state. The existing check that blocks a retry once a tool has run, or may have run, applies first and is unchanged.
🧪 Test Summary
Local toolchain: Bun 1.4.3 (pinned 1.4.2; CI uses the pin)
Session tests: 993 passed, 1 failed
(the signed-reasoning prefix test failed once under full-suite load and passes alone, with or without this change)
Retry unit tests: 74 passed, 0 failed
Processor effect tests: 29 passed, 0 failed
StopFailure hook tests (lifecycle, admission, subagent routing): 24 passed, 1 failed
(the Stop asyncRewake chain test hits its 5 s timeout locally without this change too; it passes in CI)
Runtime typecheck: passed
🔍 Verification
- Required merge checks are Typecheck, Unit Tests (linux), E2E Tests (linux), and E2E Tests (windows).
- The release pipeline validates template provenance, three-platform CLI builds, executable and install smoke checks, release notes, and SHA256SUMS before publication.
- No dependency, runtime-pin, HTTP, event, or database changes are included. Retry limits, delays and
Retry-Afterhandling for errors that a rule recognises are unchanged. - Regression coverage includes circuit-breaker text in messages and in a 400 response, the 3-retry cap with 3 s/6 s/6 s waits checked under a test clock, and terminal errors, including a 400, that stay out of the fallback. StopFailure hooks still receive an immediate 400 failure. Live gateway behaviour was not exercised.
Full changelog: graphagent-v1.0.89...graphagent-v1.0.90
OpenCode GraphAgent v1.0.89
opencode 1.0.89
Stable release from main branch. Keep the system prompt cacheable across requests and tighten agent prompts and tool descriptions.
🐛 Bug Fixes
- Keep per-request state out of the cached system prompt (#894). Goal progress, project memory data, async hook context, and model-switch context now travel in
<runtime_context>messages instead of the system message. A block is added only when the state changes, and later requests re-send earlier blocks in place, so each request extends the previous prefix byte for byte. Explicit cache breakpoints and automatic prefix caching (DeepSeek, Qwen, GLM) keep the history cached during goal loops, memory searches, and long DAG workers. - Respect provider message rules for runtime context (#894). Signed and encrypted reasoning is not modified. Runtime-context blocks never separate a tool call from its result, are not placed after tool results for Mistral models, and move back into the system text for GitLab workflow models. GitHub Copilot requests keep the agent attribution when a runtime block follows a tool result. Goal and memory state are tracked separately, so a goal turn does not resend memory data.
- Send product knowledge only to the main conversation (#894). Subagents and DAG workers no longer receive the ~4.7 KB capability catalog, and child sessions no longer see the goal tool, which only the main conversation can use.
- Revise the default prompt used by QWEN, GLM, DeepSeek, and other unrouted models (#894). Do not stop to ask for missing lint commands; report unrun checks instead. Delegate only broad exploration to
task. Add todo tracking, no guessed tool parameters, dedicated file tools, error-driven retries, and faithful reporting. - Clarify runtime reminders (#894). Plan-mode and mode-switch reminders that the application appends to a user turn are application guidance; the same tags inside files, web pages, or tool results stay untrusted.
- Fix tool descriptions (#894). Name tools by their IDs (
read,bash,task,webfetch). Ask the caller to check a subagent's key claims instead of trusting them, and drop the task catalog heading's promise of tool lists. Remove the default writing style's push toward interactive HTML demos.
🧪 Test Summary
Local toolchain: Bun 1.4.3 (pinned 1.4.2; CI uses the pin)
Session, goal, memory, hook and tool tests: 2549 passed, 10 skipped, 3 failed
(the 3 failures reproduce on main and come from a local OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX override)
Runtime-context unit tests: 10 passed, 0 failed
DAG gate: 156 core, 1100 runtime, 3 manifest, 65 TUI tests passed
Runtime and core typecheck: passed
Root lint: 4675 warnings, 0 errors (unchanged cap)
🔍 Verification
- Required merge checks are Typecheck, Unit Tests (linux), E2E Tests (linux), and E2E Tests (windows).
- The release pipeline validates template provenance, three-platform CLI builds, executable and install smoke checks, release notes, and SHA256SUMS before publication.
- No dependency, runtime-pin, HTTP, event, or database changes are included. Persisted history is unchanged. The runtime-context ledger is held in memory and is released when a session is deleted. After a restart it starts empty: signed reasoning produced after an earlier runtime block no longer matches its bound prefix and is dropped, never replayed against a different prefix.
- Provider rules come first. Signed and encrypted reasoning is not modified, and signed-reasoning replay is unchanged: a signed block is replayed only with its exact bound prefix. Runtime-context blocks are never placed between a tool call and its tool result.
- Plugins that read goal or memory text from
experimental.chat.system.transformno longer find it there; it is in the trailing runtime-context message. - Regression coverage includes byte-identical system messages and strict prefix extension across steps with changing memory context, ledger replacement, clearing, history rewrites, one-shot events, tool call/result adjacency, separate goal and memory tracking, the Mistral order rule, GitLab workflow routing, Copilot initiator classification, the goal mechanism/live-state split, child-session capability omission, and tag escaping. Signed-reasoning replay tests keep their assertions and now change the system prefix through server instructions. Cache hit rates were not measured against live providers.
Full changelog: graphagent-v1.0.88...graphagent-v1.0.89
OpenCode GraphAgent v1.0.88
opencode 1.0.88
Stable release from main branch. Restore parent workflow continuations and stop goal loops from treating failed requests as progress.
🐛 Bug Fixes
- Resume the parent after workflow checkpoints and completion (#891). Deliver reporting checkpoints while downstream nodes run. Keep final reports separate from parent wake receipts, retain a completion wake after earlier checkpoints have been delivered, and attribute copied reports to the parent rather than a child model. Workflows without reporting checkpoints retain display-only final delivery.
- Bound recovery after failed goal turns (#892). Pause on non-retryable errors without spending a goal turn. Limit transient recovery to two additional attempts with backoff, and attempt reasoning-state recovery only once. Preserve normal text and tool-only progress, user interruption, and goal ownership checks.
🧪 Test Summary
Pinned toolchain: Bun 1.4.2, Node 24.21.0, Go 1.27.1
Goal tests: 187 passed, 0 failed
Focused DAG tests: 107 passed, 0 failed
DAG gate: 156 core, 1100 runtime, 3 manifest, 65 TUI tests passed
Runtime typecheck: passed
Root lint: 4675 warnings, 0 errors (unchanged cap)
🔍 Verification
- Required merge checks are Typecheck, Unit Tests (linux), E2E Tests (linux), and E2E Tests (windows).
- The release pipeline validates template provenance, three-platform CLI builds, executable and install smoke checks, release notes, and SHA256SUMS before publication.
- No dependency or runtime-pin changes are included. Previously consumed workflow wakes are not replayed retroactively.
- Recovery attempts are stored in the existing goal state as optional fields; older goal records remain readable without a database migration. Manual resume starts a fresh recovery allowance. Local test counts overlap and are not a unique-test count.
- Regression coverage includes an encrypted-reasoning fake upstream, two transient retries followed by pause, goal replacement during recovery, four coalesced checkpoints, and completion after checkpoint acknowledgement. Live-provider and installed-binary runtime acceptance were not run locally.
Full changelog: graphagent-v1.0.87...graphagent-v1.0.88
OpenCode GraphAgent v1.0.87
opencode 1.0.87
Stable release from main branch. Improve workflow authoring diagnostics and recover child sessions whose final answer is cut off by the output limit.
🐛 Bug Fixes
- Make workflow repairs actionable (#887). Group checkpoint diagnostics, identify redundant dependency edges, and preserve prompt bindings in repair hints. Explain checkpoint gating and action-specific node ceilings. Rejected mutations on terminal workflows report the unchanged state, and flat workflow arguments are normalized before validation. Checkpoint gates remain errors.
- Honor configured output budgets (#888). Explicit model output limits can exceed the conservative 32k default. Catalog-only limits remain conservative, and the experimental environment override remains effective. Small context windows retain their normal output reserve so automatic compaction still runs before the input budget is exhausted.
- Recover truncated DAG children (#888). Give a child that reaches its output limit one continuation in the same session. Settle an already captured result first, preserve attempt ownership and review contracts, and report repeated truncation with budget and usage details.
- Do not report empty task success (#889). Continue a truncated task once. Remaining truncation, empty final answers and provider failures are reported as errors in foreground, background and SubagentStop paths. Preserve partial output when continuation fails. Top-level conversation settlement is unchanged.
🧪 Test Summary
Focused session, provider and task suites: 760 passed, 6 skipped, 0 failed
DAG gate, core: 156 passed, 0 failed
DAG gate, runtime: 1092 passed, 3 skipped, 0 failed
DAG gate, schema manifest: 3 passed, 0 failed
DAG gate, TUI: 65 passed, 0 failed
Generated SDK check: no drift
Runtime package typecheck: passed
Root lint: 4675 warnings, 0 errors
🔍 Verification
- The checks above ran with Bun 1.4.2, Node 24.21.0 and Go 1.27.1. Session tests unset
OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX. - Regression coverage includes small-context compaction, configured and environment output budgets, strict native HTTP replay, same-session continuation, repeated truncation, stale attempts and task settlement. Three recorded provider scenarios passed; the OpenAI API-key cassette is absent and that scenario remains skipped.
- PR #890 must pass Typecheck, Unit Tests (linux), E2E Tests (linux) and E2E Tests (windows) before merge. Local test counts overlap and are not a count of unique tests.
- No dependencies, runtime pins, public wire shapes or persisted formats change. Continuation admission is a best-effort local check, not a cross-process atomic guarantee. A larger configured output budget must still be supported by the provider.
- Live-provider and installed-binary runtime acceptance were not run locally. The release pipeline separately validates template provenance, three-platform builds, executable and install smoke checks, rendered notes and SHA256SUMS.
Full changelog: graphagent-v1.0.86...graphagent-v1.0.87
OpenCode GraphAgent v1.0.86
opencode 1.0.86
Stable release from main branch. Refresh the AI SDK 6 stack, preserve WebSocket stream close diagnostics, and reshape very long reasoning.
🐛 Bug Fixes
- Preserve WebSocket body-stream failures (#878). Mid-stream close, socket error and idle timeout now reach the provider boundary with structured kind, close code and reason. Transient transport failures are retryable; protocol errors, normal or policy closes and message-too-big closes are not. Forwarded
response.failed,errorandresponse.incompleteevents keep their existing SDK behavior. HTTP fallback, transport selection and retry budgets are unchanged. - Keep the inner provider cause (#877). The provider-utils status-200 wrapper no longer hides the real cause. Nested provider errors keep their status, headers and body; plain error and object causes keep their message. The generic wrapper no longer reports a misleading 200 status.
- Reshape very long reasoning (#879). Remove the pre-call input size gate, use the model's declared output limit for the output cap, judge truncation by finish reason, and raise the organizer timeout to 120 seconds. Long reasoning is sent to the organizer instead of being skipped.
⚙️ CI / Engineering
- Refresh Nix dependency hashes (#877). Measure and update the
node_modulesfixed-output hashes for linux and darwin on x86_64 and aarch64. The four-platform Nix matrix builds the normal CLI and desktop packages.
📦 Dependencies / Tooling
- Refresh the AI SDK 6 compatibility family (#877). Update the workspace catalog and lockfile, keep the provider-utils direct pin aligned, and rebind the Anthropic structured-output, Google empty-message and xAI PDF patches to the new versions. No AI SDK 7 or provider-interface migration is introduced.
🧪 Test Summary
Focused provider and session suites: 182 passed, 0 failed
Independent stream verification: 1069 passed, 4 skipped, 0 failed
PR #881 required checks: Typecheck, Unit Tests (linux), E2E (linux), E2E (windows) passed
PR #881 Nix matrix: linux and darwin, x86_64 and aarch64 passed
PR #880 required checks: Typecheck, Unit Tests (linux), E2E (linux), E2E (windows) passed
Root lint: 4668 warnings, 0 errors
🔍 Verification
- Source
maincontains PR #881 and PR #880. - PR #881 passed the required checks and the four-platform Nix matrix. Its focused suites use Bun 1.4.2 and Node 24.21.0.
- PR #880 passed the required checks on the reasoning reshaping change.
- The original incident's upstream failure remains unidentified because the persisted error had already lost its cause. This release preserves future close code and reason data; it does not claim a specific gateway fault.
- Issue #869, image paste with physical Cmd+V, remains open and is not included. The local terminal-forwarded
super+vlistener was not merged; this release does not claim a fix. - Release artifacts require separate validation through
release-fork.yml: template provenance, three-platform builds, executable and install smoke checks, rendered notes and SHA256SUMS.
Full changelog: graphagent-v1.0.85...graphagent-v1.0.86
OpenCode GraphAgent v1.0.85
opencode 1.0.85
Stable release from main branch. Recover reasoning and Responses socket continuity after compaction, and remove a noisy prompt status label.
🐛 Bug Fixes
- Recover from rejected reasoning state (#873, #866). Successful manual, automatic and overflow compactions now invalidate opaque reasoning from the replaced history and the summary for outbound replay. Every summarizer request strips opaque reasoning, including fallback attempts. Persisted history is not rewritten. Failed or cancelled compactions do not create a boundary, and fresh reasoning after the boundary remains replayable.
- Make recognized reasoning-state errors actionable (#873, #866). Encrypted-content and thinking-signature failures now return a non-retryable error that names
/compactor a new session. Original upstream diagnostic bodies, status and headers are preserved. No silent retry is added, and unrelated provider errors retain their existing behavior. - Reset Responses WebSocket continuity after compaction (#873, #868). Custom OpenAI providers and the built-in Codex plugin reset only the affected session's socket after committed compaction. Idle sockets are invalidated immediately; busy or connecting requests finish before replacement. Controllers, active HTTP work, sticky fallback and failure budgets survive the reset. Session deletion retains its separate cleanup path.
- Hide the TUI memory preparation label (#872, #867). Only the
memorystage is filtered from the preparation text. Background memory work, the busy spinner, interrupt control, reasoning and tools labels, and retry or error messages remain unchanged. The prompt regression covers 80- and 40-column terminals.
No database schema, migration, public HTTP shape, configuration option or dependency is added by these changes.
⚙️ CI / Engineering
- Feature/source index (#871). Add a concise Chinese capability-to-source index and a link from the Chinese README. This is documentation only, not a new runtime feature.
🧪 Test Summary
TUI prompt rendering (#872): 19 passed, 58 assertions
Focused recovery suites (#873): 270 passed, 1 existing skip, 0 failed
Full prompt suite (#873): 219 passed, 4 conditional skips
Local opencode and TUI typechecks: passed
Root lint: 4,669 warnings, 0 errors (cap 4,675)
These are the merged pull requests' local verification records, using Bun 1.4.2, Node 24.21.0 and Go 1.27.1. The final raw-string diagnostic fallback in #873 has its own red/green regression in the focused run. Formatting and diff checks passed.
🔍 Verification
- Source baseline
706279c84ad6ea13a8f0acf98499c39be91bdea9passed all four required native checks: Typecheck, and Unit Tests (linux), E2E Tests (linux) and E2E Tests (windows). - Three isolated source CLI acceptance runs completed parallel write tools, automatic compaction through a different HTTP provider, and immediate continuation on a new Responses socket. They used synthetic local upstreams, not the incident's real gateway or an installed-binary manual TUI run. Unusual gateway error wording may still produce a generic error.
- The merged changes passed independent review. The documentation index also passed link and formatting checks.
- Release artifacts require separate validation through
release-fork.yml: template provenance, three-platform builds, executable/install smoke checks, rendered notes and SHA256SUMS. The source checks above do not certify release artifacts. - Issue #869, image paste with physical Cmd+V, remains open and is not included. The local terminal-forwarded
super+vlistener has not been merged; this release does not claim to resolve that terminal-specific failure.
Full changelog: graphagent-v1.0.84...graphagent-v1.0.85
OpenCode GraphAgent v1.0.84
opencode 1.0.84
Stable release from main branch. This release lets the plan decide how many implementation writers run in parallel, and makes a review ACCEPT mean that nothing blocking remains.
🎯 Features
- Plan-driven fan-out of parallel writers (#861).
- A
codingblock, or an implementation node, can declarefan_out: <plan-block-id>. That plan then returns work packages, each with anid, aninstructionand awrite_set. - When the writer becomes ready, two or more disjoint packages run as parallel writers named
<writer>--<package>. The writer's own id becomes their implementation aggregator, so verify and review bindings stay unchanged. - How many packages exist and where they split is the planner's call. One package runs the writer as authored.
- The engine only declines parallelism it cannot prove safe: malformed or duplicate ids, empty or overlapping write sets, path traversal, or a node-ceiling breach. In that case the writer runs serially with the reason in its prompt and the log. The workflow does not fail.
- Expansion goes through the durable extend path. It is fenced against the scheduling attempt that planned it, so a parent replan or cancel that lands first wins. A crash before it commits expands again on the next round.
- Package writers get their own recovery identity, and write-set paths are canonicalized before the overlap check.
- A
The model-facing workflow schema gains fan_out on blocks and nodes. Workflows without it compile and run unchanged.
🐛 Bug Fixes
- A review ACCEPT is checked, not trusted (#862).
- Before, the engine only checked the verdict value and the implementation fingerprint echo. An ACCEPT that still listed required actions, or that overrode a lane's blocking finding, opened the gate silently.
- Review lanes compiled from
reviewblocks now return a structured verdict with blockingrequired_actions. - Settlement now fails an ACCEPT that lists its own required actions. It also fails an ACCEPT that leaves a required action raised by a completed dependency unrefuted. The decision refutes each one in
refutedby node, index and reason, or submits REJECT. - Plain and fenced JSON evidence are read the same way as verdict gates read them. The live path and crash recovery apply the same rule.
- Persisted workflows keep working: free-text legacy lanes carry no structured actions, so only the ACCEPT with empty
required_actionsrule applies to them.
No public HTTP shape, durable event version, database schema or migration changed. Review lane and decision output schemas gained fields.
🧪 Test Summary
Merged branch (main with #862, plus #861):
Opencode DAG + tool suites (test/dag, test/tool): 1,478 passed, 3 skipped, 0 failed
DAG core gate (test:dag-core): all behavior and coverage floors passed
Core command guide suite: 26 passed, 0 failed
Opencode typecheck: passed
Lint: 4,673 warnings, 0 errors (cap 4,675)
Local runs used a newer Bun, Node and Go than the repository pins. The pinned toolchain ran in CI on each pull request head.
The new regressions cover:
- Fan-out: compiler output and validation, expansion through the real scheduler loop, a single package, overlapping and dot-segment write sets, a node-ceiling breach, recovery identity, and a stale extend fence.
- ACCEPT consistency: own required actions, unrefuted and refuted lane actions, fenced evidence, legacy free-text lanes, and the live spawn and crash-recovery settlement paths.
🔍 Verification
- Both changes landed through pull requests with merge commits, and the required native checks passed on their heads. The checks are Typecheck, Unit Tests (linux) and both E2E platforms.
- Automated review findings on both pull requests were fixed before merge: recovery identity, path canonicalization, a stale-attempt fence, fenced evidence, and test harness use.
- Fan-out was also exercised end to end against a live model on an isolated server and a throwaway repository. The plan produced three packages, three writers ran in parallel, the aggregator joined six files under one fingerprint, verify passed, review accepted, and the workflow completed.
- Left out of this release: anchoring "material" findings to a structured acceptance-criteria list, and whether ACCEPT may proceed when a review lane failed.
Full changelog: graphagent-v1.0.83...graphagent-v1.0.84
OpenCode GraphAgent v1.0.83
opencode 1.0.83
Stable release from main branch. This release removes avoidable work from interface and runtime hot paths, keeps the prompt cache intact across a turn, hardens core agent tools against silent data loss, and repairs DAG review pipelines and replans.
🐛 Bug Fixes
-
DAG review pipelines reach a decision (#856, #857).
- When a review route's verification fails, the lanes gated on it are skipped. The decision node over those lanes is now scheduled in the same round instead of staying pending forever.
- By default, the verification gate now reports to the parent, so the parent sees a FAIL verdict and can reopen the workflow with extend. An explicit
report_to_parentstill takes precedence. - A failed optional review lane no longer fails the required decision. Strict input mappings receive the same explicit
Dependency "x" failed: <reason>text that default mappings use.
-
Replans rewrite the path instead of breaking it (#856, #857).
- A replan that cancels a running required node and rewires its old dependents keeps running. Only the runtime that matches the durable graph revision may finish a workflow.
- A replan that adds a dependency on a node superseded by an earlier replan is now rejected with guidance. Before, the edge was silently dropped and the new node ran as a root.
- When a rebuilt, queued attempt is refused re-admission, the live attempt keeps its fiber, so cancel still interrupts the real child session.
-
Verdicts are read the same way everywhere (#857). Condition gates, the replan checkpoint and review checks share one normalization:
- JSON strings and a single code fence are parsed.
- Verdict values are matched case-insensitively.
Before, a schemaless verification could satisfy a condition gate and then fail its review input check.
-
Tools no longer lose data silently (#854, #855).
editandapply_patchrefuse to rewrite files that are not valid UTF-8. Before, every non-UTF-8 byte across the file was replaced with U+FFFD.writeand deletion are unchanged.- An
apply_patchmove onto the same path is an in-place update. Before, the file was written and then deleted. editwithreplaceAllkeeps$&,$$and$'in the replacement literal.
-
Agents see real failures (#854, #855).
- A
taskwhose child ended on a provider or output error now returns a tool error in the foreground andtask_errorin the background. Before, it reported a completed task with an empty or partial answer. Cancellation is unchanged. webfetchrefuses binary responses such as PDFs and archives instead of decoding them into noise.- A 4xx response whose body merely contains a number such as
150000is no longer retried five times with the full context.
- A
-
Search stays useful on real repositories (#854, #855).
- A match on a non-UTF-8 line is decoded instead of failing the whole search. An oversized match in a minified file is skipped instead of discarding every other match.
- Grep output now stays within the shared 50 KB output budget.
-
Prompts match the tools that exist (#855). The codex system prompt and the shell tool description no longer direct apply_patch models to Edit and Write tools they do not have.
No public HTTP shape, durable event version, database schema or migration changed. The report_to_parent description in the workflow tool schema changed.
🏗️ Architecture / Refactor
- Lighter hot paths (#854, #855).
- Streaming shell output is coalesced into at most one durable part update every 200 ms. Before, there was one update per chunk: a 40-chunk command wrote 40 events.
- A preview is published only after its chunk, including any spill to the truncation file, has been fully handled.
- The 250 ms DAG mailbox scan reads without taking SQLite's write reservation.
apply_patchwaits for LSP diagnostics on all edited files concurrently instead of one file at a time.
- Stable prompt prefix within a turn (#855).
- The todo reminder is now decided once per user message. Before, a mid-turn
todowritechanged text placed ahead of every tool round-trip, which invalidated the cached prompt for the rest of the turn. - Current todo state still reaches the model at the tail, through the existing pre-tool-call reminder.
- The todo reminder is now decided once per user message. Before, a mid-turn
- Responsive TUI (#855).
- The DAG inspector keeps an unchanged two-second snapshot instead of rebuilding every wave row.
- Session hydration merges messages and parts through indexes rather than nested scans.
🧪 Test Summary
Branch evidence (each new regression failed on the previous main and passes):
Opencode tool + session + mailbox suites: 710 passed, 0 failed
Opencode DAG suites (test/dag): 1,021 passed, 3 skipped, 0 failed
DAG core gate (test:dag-core): all behavior and coverage floors passed
Core DAG + ripgrep suites: 201 passed, 0 failed
TUI suite: 312 passed, 0 failed
Workspace typecheck: 31/31 tasks passed
Lint: 4,673 warnings, 0 errors (cap 4,675)
Tests that bind local ports were run outside the sandbox. The new regressions cover:
- Interface and runtime: chatty shell output, concurrent diagnostics.
- Prompt and retries: a stable turn reminder across a mid-turn
todowrite, a 4xx body with token counts. - Tools: GBK files, a move onto the same path, an errored child task, binary fetches, and a mixed grep over GBK, minified and plain files.
- DAG pipelines: a failed verification that reaches the parent and reopens via extend, a crashed optional lane, a replan that cancels a required node, a dependency on a superseded node, fenced and upper-case verdicts, and a rejected re-admission.
🔍 Verification
- Every fix landed through a pull request with its own commit and with the required native checks passing on its head. The checks are Typecheck, Unit Tests (linux) and both E2E platforms.
- An audit of the interface, runtime, agent tools, prompts and DAG engine selected these fixes. Candidates that would change persisted contracts or product policy were left out of this release.
- Examples left out:
- Classifying block review lanes for the advanced model tier, which needs a new node field.
- Narrowing how parent mailboxes are discarded on cancellation.
Full changelog: graphagent-v1.0.82...graphagent-v1.0.83
OpenCode GraphAgent v1.0.82
opencode 1.0.82
Stable release from main branch. This release consolidates workflow reliability, hook compatibility, reasoning and context handling, provider transport, and clearer tool contracts.
Consolidated changes since the last retained release: graphagent-v1.0.48...graphagent-v1.0.82
🎯 Features
- DAG workflows and curated templates. Workflows run child sessions in dependency-ordered waves, with independent nodes running in parallel. Reusable specs resolve project first, then global, then the builtin library; project and global libraries can shadow a builtin of the same name. The global curated catalog is maintained in
opencode-dag-config; release builds validate and package a snapshot, embed the builtin templates in the CLI, and retain a provenance record. For new specs, required nodes andreview/review-*worker types prefer theadvancedtier; other nodes preferstandard; a single configured tier serves as the unified fallback. See DAG workflows and configuration. - DAG result delivery (#735, #736, #846-#849). New workflows use
final_responsefor terminal result capture and delivery. An explicit or unique terminal delivery is recorded once with its durable receipt and parent wake. Structured JSON keeps its complete value, and successful delivery does not start another parent turn merely to repeat the report. Persisted or direct legacy workflow configurations withoutresult_protocolretainsubmit_resultbehavior. - Asynchronous reasoning shaping (#838). Settled, eligible reasoning parts are organized in the background, with at most two active jobs per session. Completed rewrites are adopted when a later step is prepared; unfinished or failed rewrites leave the original text in use. Cancelling a turn does not discard queued work, while deleting the session or disposing its directory cancels it. See reasoning shaping.
- Background CI observation (#831). The optional
/watch-cicommand polls a pull request from its originating session, deduplicates by pull request head and session, and stops on cancellation or host exit. It requires the documented local setup and an authenticated GitHub CLI. See issue #831.
🐛 Bug Fixes
- DAG execution and recovery, accumulated since v1.0.49 (#655, #699, #719). Extensions of delivered deadline escalations preserve the running attempt and child session within the control contract and its caps. Recoverable runtime failures while applying a replan or extend durably pause the workflow and report its actual state. Stale results are fenced from newer accepted input, and replans reject dangling dependencies atomically. The view reports the current graph revision; superseded failures do not contaminate its terminal state. Recovery reruns work skipped or aborted by workflow termination, preserves failed required upstream nodes as blockers, and wakes the parent after paused, failed or timed-out delivery. Moving a session transfers workflow ownership. Interrupted worker provenance improves diagnosis but does not trigger automatic retry or replay of possible side effects; inspect side effects before manual recovery. See PR #655, PR #699 and PR #719.
- Attempt-scoped parent and node messages (#699). Durable messages are associated with the exact current node attempt. Queue acceptance is distinct from delivery into model input, and stale settlement cannot consume newer input. Sending a message provides context; it does not grant authorization or change workflow lifecycle.
- Workflow authoring and output contracts (#713, #846-#849). Draft writes ask for edit permission before creating directories and exclusively create the target. Workflow controls preserve their existing permission scope and identify the requested operation. Unsupported condition operators are rejected during authoring. Already-saved conditions are preserved, but unsupported expressions still fail when evaluated. New workflow specs warn against node model pins; historical persisted node model choices remain honored.
- Durable goals and bounded judge recovery (#692, #711, #719). A goal belongs to the current session and is judged after each turn. An invalid judge response can retry once at the same boundary under bounded output and time limits; three consecutive failures pause the loop. An unanswered user message pauses visibly instead of spending judge calls. The goal remains resumable, and its turn budget must be a positive integer.
maxToolCallsdefaults to0for unlimited tool calls; a finite budget counts actual admitted attempts, is shared across automatic continuations for one user input, and resets for a manual Goal start or resume. See autonomous goals, PR #692 and PR #711. - Hook decisions and payloads (#829-#837). Decisions reflect the handler that actually ran: failed command output cannot leave an approval behind, and Edit/Write conditions match patch edits. Every handler type supports Claude-shaped input and output. Context-only Stop hooks do not invent a continuation, DAG child-stop reporting waits for the matching attempt, and interrupted tool calls send bounded best-effort failure notices. Hook context routing, permission outcomes, config reload and lifecycle handling were also corrected. See hook compatibility changes and the hooks guide.
- Read, search and fetch boundaries (#842-#845). Read enforces positive page offsets and limits, documents its independent 50 KiB producer cap, and distinguishes file lines from directory entries. Grep and glob only mark output truncated when another result exists and preserve useful filesystem errors. Webfetch keeps its timeout active through body collection, cancels oversized streams and decodes supported declared charsets. Exa search reads the current key for each request, sends it in the
x-api-keyheader, and keeps key material out of URLs and provider errors. - Provider transport (#739-#754). Custom OpenAI SDK providers use HTTP by default and opt into WebSockets with
options.experimentalWebSockets: true; a provider or plugin custom fetch remains on HTTP. Explicit WebSocket routing preserves provider identity, key, base URL and model. Request cancellation, safe header overrides, internal title-header handling, OAuth transport and fallback cleanup were corrected. - Context folding and compaction (#732, #745, #765-#766, #817). Folding counts tool schemas in its budget, isolates bounded evidence by session and rejects stale ledger generations. Safe, verified duplicate error results can fold; unsafe or unverifiable results stay verbatim, and stored messages remain unchanged. Automatic compaction follows the current model's usable context window and accounts for both summary and conversation model budgets. The former separate ceiling, proactive threshold/re-arm behavior and PreCompact decline veto are gone; dynamic duplicate folding remains separate and unchanged. See context management.
- Thinking replay and tool presentation (#768, #839-#841, #850). Native Anthropic Messages replay preserves
redacted_thinkingas opaque metadata; known-unusable signed thinking is invalidated before dispatch. Tool prompts and availability now reflect session context and permission, and obsolete tool names were removed. - Local estimates and terminal behavior (#764, #780, #781-#787). Custom long-context pricing and tier settings survive configuration loading and migration but only affect local estimates, not provider billing or context limits. TUI submission, cancellation, state loading and large-diff rendering received targeted reliability fixes.
🏗️ Architecture / Refactor
- Durable DAG lifecycle. Lifecycle changes flow through persisted events and a declared state machine. Attempt identity and workflow ownership fence stale completion and cross-directory actions. Recovery reconciles against durable child-session evidence instead of fabricating provider work, while status and summaries present the current graph revision. The parent receives durable wakeups rather than polling. Node-to-parent communication is persisted per attempt; accepted-for-queue and delivered-to-model-input remain separate states.
- Reasoning carrier safety. Only editable plain reasoning and plaintext mirrors may be rewritten. Signed, encrypted, referenced, redacted and unknown carriers remain untouched. Complete leaked DSML tool-call envelopes are rejected as source or rewrite; if organization fails, the original reasoning remains. The organizer uses the built-in
@opencode-ai/llmengine without tools and does not force continuation for a reasoning-only response. - Hook outcomes follow real execution. Input and output adapters translate the selected format at each handler boundary, and permission decisions are based on the actual handler outcome. Stop and DAG child-stop lifecycle signals are tied to ...
OpenCode GraphAgent v1.0.48
opencode 1.0.48
Stable release from main branch. Questions now expire after a configurable wait while preserving explicit user interaction across every supported client.
🎯 Features
- The root
question_timeoutsetting controls the server-owned question deadline in seconds. It defaults to 60 and accepts positive integers. - TUI, web app and direct
runprompts show the remaining time. Selecting an option or focusing the custom-answer input cancels the deadline for the whole request; navigation, hovering, tab changes and default selection do not. - Timed-out questions are removed from pending state and tell the agent that the user is temporarily away. The agent analyzes the available choices itself and continues within the task's existing authorization without attributing an answer to the user.
- Both question API generations expose an interaction endpoint and broadcast interaction and timeout events, so connected and reconnecting clients share the same deadline state.
🧪 Test Summary
Bun: 1.3.14
Core question/config/tool: 28 passed, 0 failed
Runtime question/run tests: 95 passed, 0 failed, 5 skipped
TUI package tests: 270 passed, 0 failed, 1 skipped
Source-process TUI timeout: 1 passed, 21 assertions
Web Playwright timeout: 1 passed, 0 failed
HTTP API exerciser: 234 passed, 0 failed, 0 skipped
Workspace typecheck: 29 packages passed
Workspace lint: 4,846 warnings, 0 errors (4,850 ratchet)
🔍 Verification
Source regressions cover the default and configured deadlines, invalid configuration, timeout delivery, interaction before the deadline, reply cleanup, interruption and disposal, exact agent-facing output, direct-run rendering and a real source-process TUI flow. The source-process test proves that navigation alone still times out while option selection and custom-input focus permanently cancel the deadline. The exact merged dev commit passed Typecheck, Linux unit and end-to-end tests, Windows end-to-end tests, and macOS prerelease artifact acceptance. The stable workflow will rebuild all selected platforms from main, publish checksums, and undergo separate post-publication artifact acceptance.
Full changelog: graphagent-v1.0.47...graphagent-v1.0.48