Releases: Planningo/duul
Release list
v1.1.0
Minor Changes
-
19b5420: Support Codex CLI login for the
openaiprovider — noOPENAI_API_KEYrequired.When no
OPENAI_API_KEY(or per-requestapi_key) is set, DUUL now falls back to the OpenAI Codex CLI credentials in~/.codex/auth.json(override withCODEX_HOME):- Sign in with ChatGPT: uses the OAuth access token against the ChatGPT backend Responses endpoint (
https://chatgpt.com/backend-api/codex), billed to your ChatGPT plan. Tokens are refreshed automatically via the OAuth endpoint (on expiry and on a mid-review 401). - API-key login: uses the
OPENAI_API_KEYstored inauth.json.
The ChatGPT backend is stateless (
store: false): DUUL streams the request, aggregates output items from the stream, resends the full input (echoing encrypted reasoning) across tool rounds, and drops unsupported params (temperature,top_p,max_output_tokens,previous_response_id). Cross-round context is preserved by replaying prior rounds' turns (newconversationReplayprovider capability, same mechanism as the Anthropic provider), soprevious_review_idcontinuity works. AddDUUL_REASONING_EFFORT(defaultmedium) to tune reasoning effort. An explicit env/request key always takes precedence over the CLI login. - Sign in with ChatGPT: uses the OAuth access token against the ChatGPT backend Responses endpoint (
-
7a6123f: Fix the recurring
-32602: plan required(andcode/approved_planequivalents) failure where a caller's tool call collapsed to an empty{}and looped.Two-part fix:
- Reachable guards. The large required string fields (
plan,code,approved_plan) are nowoptionalat the schema level, so an empty/partial call reaches the handler instead of being rejected pre-handler by the MCP SDK. Callers now get actionable retry guidance instead of an opaque-32602zod error. (Partition's shortworkspace_rootwas also relaxed tooptionalfor the same reachability reason — the handler still hard-requires it.) - File escape hatch. Added
plan_file(plan review),code_file+approved_plan_file(code review), andapproved_plan_file(execution partition). Callers can write large content to a file with a normal Write call and pass a short relative path; the server reads it (scoped, symlink-guarded,tracked_onlybypassed for the caller's own artifact). This avoids the large-argument serialization failure that made models emit{}.
The reviewer system prompts now emit free-text fields in compressed style to reduce output tokens. Exactly one of the inline field or its
*_filecompanion is required. - Reachable guards. The large required string fields (