Skip to content

OpenCode GraphAgent v1.0.82

Choose a tag to compare

@github-actions github-actions released this 19 Oct 04:15
Immutable release. Only release title and notes can be modified.
f787b5c

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 and review/review-* worker types prefer the advanced tier; other nodes prefer standard; 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_response for 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 without result_protocol retain submit_result behavior.
  • 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-ci command 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. maxToolCalls defaults to 0 for 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-key header, 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_thinking as 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/llm engine 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 their originating session or attempt.

⚙️ CI / Engineering

Upgrade checklist

  1. Reasoning shaping: the default is off for every model. Opt in with global or per-model reasoningDistillation.enabled: true; a per-model value overrides the global value. OPENCODE_DISABLE_REASONING_DISTILLATION=1 disables it regardless. The configured small_model is preferred, then the provider's small model; if neither exists, no rewrite is made. The old reasoning compatibility option is accepted but ignored.
  2. Hooks: the trust gate and /trust command are completely removed. Legacy requireTrust, allowUntrusted and OPENCODE_HOOKS_REQUIRE_TRUST settings are ignored; existing trusted-workspaces.json files are left untouched. Ordinary tool permissions and HTTP hook policies such as allowedHttpHookUrls and httpHookAllowedEnvVars still apply.
  3. Claude hook import: .claude/settings*.json files are not loaded automatically; use /import-claude-hooks. Hook inputFormat: "claude-code" maps tool names and input keys, without promising full behavioral parity.
  4. Context settings: remove stale compaction.max_context_tokens configuration when convenient; it remains loadable but has no effect. Automatic compaction and dynamic duplicate folding remain separate controls.
  5. Workflow compatibility: use model tiers for new specs. Historical persisted model choices remain honored, and legacy configurations without result_protocol retain submit_result behavior. result_protocol and delivery_node are start-only fields and cannot be changed by replan.

Maintenance scope: GraphAgent v1 remains focused on DAG configuration, curated workflows and reproducible defects, including narrow compatibility fixes for stability and data integrity. See the current project scope.


📦 Dependencies / Tooling

  • Release assets and installation. Linux, macOS and Windows CLI archives are published with SHA256SUMS, plus dag-templates.tar.gz and dag-template-provenance.json. Use the oc installer or select the matching manual artifact from this release, verify the archive checksum before extraction, then confirm opencode --version reports 1.0.82. Built-in updating is removed: legacy autoupdate is ignored, and opencode upgrade and the upgrade endpoint report that updates are disabled. This fork is not distributed through the upstream npm, brew or scoop packages. See installation details.
  • Release pipeline. The release workflow validates and packages the curated template snapshot with provenance, builds CLI archives for all three platforms, checks CLI version output, runs macOS install/signature acceptance, generates SHA256SUMS, and verifies release candidate contents and checksums before publication.

🧪 Test Summary

#851 integration batch results; these are scoped checks, not totals for v1.0.48-v1.0.82:
  Workspace typecheck:                         31 tasks passed
  Root lint:                                   4,673 warnings, 0 errors; cap 4,675
  Session and reasoning regressions:           268 passed, 4 skipped
  Core registry and adoption:                   36 passed
  Watcher, interruption and Stop regressions:   55 passed
  Trust removal and command regressions:        53 passed
  Full hook suite:                              819 passed
  Workflow draft and control regressions:       80 passed
  Session and tool selection:                  313 passed, 4 skipped
  Core agent permission regressions:             7 passed
  Read, search and network tool regressions:     98 passed
  Final DAG runtime gate:                     1,009 passed, 3 skipped
  Terminal cleanup and recovery regressions:     54 passed

An isolated three-step provider fixture measured asynchronous organizer latency. Across five runs each with 0 ms and 1,500 ms organizer latency, median main-turn times were 0.564 s and 0.613 s; every slow-organizer run finished its main turn before the organizer. This local measurement does not guarantee general latency.


🔍 Verification

PR #851 merged after its required Typecheck, Linux unit, Linux E2E and Windows E2E checks passed. Independent reviews covered hook lifecycle and cancellation, asynchronous adoption, tool availability, file permissions, response streaming and persisted workflow compatibility. Publication also requires the release workflow's platform builds, CLI smoke checks, macOS signing/install acceptance, checksums and template provenance verification.


Full changelog: graphagent-v1.0.81...graphagent-v1.0.82