Repository navigation
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 their originating session or attempt.
⚙️ CI / Engineering
Upgrade checklist
- 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=1disables it regardless. The configuredsmall_modelis preferred, then the provider's small model; if neither exists, no rewrite is made. The old reasoningcompatibilityoption is accepted but ignored. - Hooks: the trust gate and
/trustcommand are completely removed. LegacyrequireTrust,allowUntrustedandOPENCODE_HOOKS_REQUIRE_TRUSTsettings are ignored; existingtrusted-workspaces.jsonfiles are left untouched. Ordinary tool permissions and HTTP hook policies such asallowedHttpHookUrlsandhttpHookAllowedEnvVarsstill apply. - Claude hook import:
.claude/settings*.jsonfiles are not loaded automatically; use/import-claude-hooks. HookinputFormat: "claude-code"maps tool names and input keys, without promising full behavioral parity. - Context settings: remove stale
compaction.max_context_tokensconfiguration when convenient; it remains loadable but has no effect. Automatic compaction and dynamic duplicate folding remain separate controls. - Workflow compatibility: use model tiers for new specs. Historical persisted model choices remain honored, and legacy configurations without
result_protocolretainsubmit_resultbehavior.result_protocolanddelivery_nodeare 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, plusdag-templates.tar.gzanddag-template-provenance.json. Use theocinstaller or select the matching manual artifact from this release, verify the archive checksum before extraction, then confirmopencode --versionreports1.0.82. Built-in updating is removed: legacyautoupdateis ignored, andopencode upgradeand 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