From 03b903127eb692746fadc7d127d77bafcae24d69 Mon Sep 17 00:00:00 2001 From: Jay Yu Date: Mon, 26 Oct 2026 12:32:48 -0400 Subject: [PATCH 1/2] fix(coding-agent): harden release preparation - Allow slow registry installs and updates to finish validation - Use consistent conventional messages for release recovery --- scripts/artifact-acceptance.mjs | 4 ++-- scripts/npm-lifecycle.mjs | 8 +++++++- scripts/release-source.mjs | 2 +- scripts/release-source.test.mjs | 2 +- scripts/release.mjs | 4 ++-- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/scripts/artifact-acceptance.mjs b/scripts/artifact-acceptance.mjs index b48f92533..f8f60f200 100644 --- a/scripts/artifact-acceptance.mjs +++ b/scripts/artifact-acceptance.mjs @@ -183,7 +183,7 @@ export function installConsumer( manager === "npm" ? ["install", "--omit=dev", "--ignore-scripts", "--no-audit", "--no-fund"] : ["install", "--production", "--ignore-scripts", "--network-concurrency=8"], - { cwd: directory, env, stdio: "inherit", timeout: 180_000 }, + { cwd: directory, env, stdio: "inherit", timeout: 600_000 }, ); for (const pkg of selected) { const installed = join(directory, "node_modules", pkg.name); @@ -329,7 +329,7 @@ export function acceptArtifacts(artifactDirectory, outputDirectory, { managers = outputDirectory, ...(managers.includes("bun") ? [] : ["--skip-bun"]), ], - { cwd: root, stdio: "inherit", timeout: 600000 }, + { cwd: root, stdio: "inherit", timeout: 3_600_000 }, ); verifyTarballs(tarballDirectory, records, packages); writeFileSync( diff --git a/scripts/npm-lifecycle.mjs b/scripts/npm-lifecycle.mjs index 0be2511bf..5620cac59 100644 --- a/scripts/npm-lifecycle.mjs +++ b/scripts/npm-lifecycle.mjs @@ -104,7 +104,13 @@ await new Promise((done) => server.listen(0, "127.0.0.1", done)); async function command(command, args, extra = {}) { try { console.log(`Lifecycle: ${command} ${args.join(" ")}`); - const result = await run(command, args, { ...options, ...extra }); + const packageManagerOperation = + (["npm", "bun"].includes(command) && args.includes("install")) || args.includes("--self"); + const result = await run(command, args, { + ...options, + timeout: packageManagerOperation ? 600_000 : options.timeout, + ...extra, + }); evidence.commands.push({ command, args, exitCode: 0 }); return result.stdout; } catch (error) { diff --git a/scripts/release-source.mjs b/scripts/release-source.mjs index 8781562ed..91c540676 100644 --- a/scripts/release-source.mjs +++ b/scripts/release-source.mjs @@ -102,7 +102,7 @@ export function pushPreparedRelease(tag) { const commit = git("rev-parse", `refs/tags/${tag}^{commit}`); if ( git("rev-parse", "HEAD^") !== commit || - git("log", "-1", "--format=%s") !== "Add [Unreleased] section for next cycle" + git("log", "-1", "--format=%s") !== "docs(coding-agent): start next release cycle" ) throw new Error("Prepared main must contain exactly the next-cycle commit after the release tag"); const changed = git("diff-tree", "--no-commit-id", "--name-only", "-r", "HEAD").split("\n"); diff --git a/scripts/release-source.test.mjs b/scripts/release-source.test.mjs index 4972bf32f..b0b5f5fb0 100644 --- a/scripts/release-source.test.mjs +++ b/scripts/release-source.test.mjs @@ -220,7 +220,7 @@ for (const failure of ["rejected transaction", "lost acknowledgement"]) "# Changelog\n\n## [Unreleased]\n\n## [0.0.3]\n\n- Fixture\n", ); f.git("add", "packages/ai/CHANGELOG.md"); - f.git("commit", "-m", "Add [Unreleased] section for next cycle"); + f.git("commit", "-m", "docs(coding-agent): start next release cycle"); const final = f.git("rev-parse", "HEAD"); const hook = join(f.remote, "hooks/pre-receive"); if (failure === "rejected transaction") writeFileSync(hook, "#!/bin/sh\nexit 1\n", { mode: 0o755 }); diff --git a/scripts/release.mjs b/scripts/release.mjs index c61c31813..e614d482f 100755 --- a/scripts/release.mjs +++ b/scripts/release.mjs @@ -224,7 +224,7 @@ if ( ) throw new Error("origin/main changed during preparation; review the new main before releasing"); stageReleaseOutputs(intendedOutputs); -run(`git commit -m "Release v${version}"`); +run(`git commit -m "fix(coding-agent): release v${version}"`); run(`git tag v${version}`); console.log(); @@ -236,7 +236,7 @@ console.log(); // Commit console.log("Committing changelog updates..."); stageReleaseOutputs(new Set(getChangelogs())); -run(`git commit -m "Add [Unreleased] section for next cycle"`); +run(`git commit -m "docs(coding-agent): start next release cycle"`); console.log(); // Push From 60eb1740ef775d5b7ed98e864bc1f496fe560f56 Mon Sep 17 00:00:00 2001 From: Jay Yu Date: Mon, 26 Oct 2026 12:36:58 -0400 Subject: [PATCH 2/2] docs(coding-agent): prepare release notes - Record the completed changelog audit for the next release - Include the refreshed image catalog validated by local smoke tests --- packages/agent/CHANGELOG.md | 9 ++ packages/ai/CHANGELOG.md | 18 +++ packages/ai/src/image-models.generated.ts | 135 ++++++++++++++++++++++ packages/coding-agent/CHANGELOG.md | 29 ++++- packages/tui/CHANGELOG.md | 10 ++ 5 files changed, 200 insertions(+), 1 deletion(-) diff --git a/packages/agent/CHANGELOG.md b/packages/agent/CHANGELOG.md index 4d5b226ce..335add425 100644 --- a/packages/agent/CHANGELOG.md +++ b/packages/agent/CHANGELOG.md @@ -2,6 +2,15 @@ ## [Unreleased] +### Added + +- Added explicit runtime telemetry contexts and nested run, turn, request, and tool spans ([#95](https://github.com/diffexai/diffex/pull/95)). + +### Changed + +- Updated runtime dependencies, including file-ignore matching, schema handling, YAML parsing, and diff generation ([#272](https://github.com/diffexai/diffex/pull/272), [#274](https://github.com/diffexai/diffex/pull/274)). +- Changed package licensing to MIT ([#280](https://github.com/diffexai/diffex/pull/280)). + ## [0.3.2] - 2026-09-29 ### Added diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index ca91fc76a..61f98e399 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -2,6 +2,24 @@ ## [Unreleased] +### Added + +- Added GPT-6 Astra, Luna, Sol, and GPT-6.1 Sol to the Codex catalog for ChatGPT authentication. +- Added `isRetryableProviderErrorMessage` for classifying transient provider and transport failures ([#161](https://github.com/diffexai/diffex/pull/161)). + +### Changed + +- Updated provider SDKs and runtime dependencies ([#272](https://github.com/diffexai/diffex/pull/272), [#273](https://github.com/diffexai/diffex/pull/273), [#274](https://github.com/diffexai/diffex/pull/274)). +- Anthropic requests now omit unsupported sampling parameters, including the unified `temperature` option. Google Gemini and Vertex AI disable automatic SDK continuations; Anthropic context-window limits and Google continuation limits map to `length`. + See [Provider SDK migration notes](README.md#provider-sdk-migration-notes) ([#273](https://github.com/diffexai/diffex/pull/273)). +- Changed package licensing to MIT ([#280](https://github.com/diffexai/diffex/pull/280)). + +### Fixed + +- Fixed cancelled authentication and lazy provider setup being reported as errors instead of `aborted` responses. +- Preserved Kimi Coding catalog generation after the upstream source key changed. +- Fixed Google model streaming through OpenCode Go by registering its Google API implementation ([#265](https://github.com/diffexai/diffex/pull/265)). + ## [0.3.2] - 2026-09-29 ## [0.3.1] - 2026-09-20 diff --git a/packages/ai/src/image-models.generated.ts b/packages/ai/src/image-models.generated.ts index 85a6c8f6a..31b49fe9a 100644 --- a/packages/ai/src/image-models.generated.ts +++ b/packages/ai/src/image-models.generated.ts @@ -5,6 +5,36 @@ import type { ImagesApi, ImagesModel } from "./types.ts"; export const IMAGE_MODELS = { openrouter: { + "black-forest-labs/flux-3-image": { + id: "black-forest-labs/flux-3-image", + name: "Black Forest Labs: FLUX 3 Image", + api: "openrouter-images", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + input: ["text", "image"], + output: ["image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + } satisfies ImagesModel<"openrouter-images">, + "black-forest-labs/flux-3-image-klein": { + id: "black-forest-labs/flux-3-image-klein", + name: "Black Forest Labs: FLUX 3 Image Klein", + api: "openrouter-images", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + input: ["text", "image"], + output: ["image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + } satisfies ImagesModel<"openrouter-images">, "black-forest-labs/flux.2-flex": { id: "black-forest-labs/flux.2-flex", name: "Black Forest Labs: FLUX.2 Flex", @@ -80,6 +110,21 @@ export const IMAGE_MODELS = { cacheWrite: 0, }, } satisfies ImagesModel<"openrouter-images">, + "bytedance-seed/seedream-5-0-flash": { + id: "bytedance-seed/seedream-5-0-flash", + name: "ByteDance Seed: Seedream 5.0 Flash", + api: "openrouter-images", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + input: ["text", "image"], + output: ["image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + } satisfies ImagesModel<"openrouter-images">, "bytedance-seed/seedream-5-0-lite": { id: "bytedance-seed/seedream-5-0-lite", name: "ByteDance Seed: Seedream 5.0 Lite", @@ -200,6 +245,36 @@ export const IMAGE_MODELS = { cacheWrite: 0, }, } satisfies ImagesModel<"openrouter-images">, + "google/gemini-nano-banana-2.1": { + id: "google/gemini-nano-banana-2.1", + name: "Google: Nano Banana 2.1", + api: "openrouter-images", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + input: ["image", "text"], + output: ["image", "text"], + cost: { + input: 1.5, + output: 7.5, + cacheRead: 0, + cacheWrite: 0, + }, + } satisfies ImagesModel<"openrouter-images">, + "krea/k3-edit": { + id: "krea/k3-edit", + name: "Krea: K3 Edit", + api: "openrouter-images", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + input: ["text", "image"], + output: ["image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + } satisfies ImagesModel<"openrouter-images">, "krea/krea-2-large": { id: "krea/krea-2-large", name: "Krea: Krea 2 Large", @@ -470,6 +545,36 @@ export const IMAGE_MODELS = { cacheWrite: 0, }, } satisfies ImagesModel<"openrouter-images">, + "qwen/qwen-image-2.1-pro": { + id: "qwen/qwen-image-2.1-pro", + name: "Qwen: Qwen Image 2.1 Pro", + api: "openrouter-images", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + input: ["text", "image"], + output: ["image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + } satisfies ImagesModel<"openrouter-images">, + "qwen/qwen-image-2.1-turbo": { + id: "qwen/qwen-image-2.1-turbo", + name: "Qwen: Qwen Image 2.1 Turbo", + api: "openrouter-images", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + input: ["text", "image"], + output: ["image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + } satisfies ImagesModel<"openrouter-images">, "qwen/qwen-image-3": { id: "qwen/qwen-image-3", name: "Qwen: Qwen Image 3", @@ -650,6 +755,21 @@ export const IMAGE_MODELS = { cacheWrite: 0, }, } satisfies ImagesModel<"openrouter-images">, + "recraft/recraft-v4.1-flash": { + id: "recraft/recraft-v4.1-flash", + name: "Recraft: Recraft V4.1 Flash", + api: "openrouter-images", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + input: ["text"], + output: ["image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + } satisfies ImagesModel<"openrouter-images">, "recraft/recraft-v4.1-pro": { id: "recraft/recraft-v4.1-pro", name: "Recraft: Recraft V4.1 Pro", @@ -785,6 +905,21 @@ export const IMAGE_MODELS = { cacheWrite: 0, }, } satisfies ImagesModel<"openrouter-images">, + "tencent/hy-image-v3.5-preview": { + id: "tencent/hy-image-v3.5-preview", + name: "Tencent: Hy Image 3.5 Preview", + api: "openrouter-images", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + input: ["text", "image"], + output: ["image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + } satisfies ImagesModel<"openrouter-images">, "x-ai/grok-imagine-image-2.0": { id: "x-ai/grok-imagine-image-2.0", name: "xAI: Grok Imagine Image 2.0", diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 72214f7c8..dea41b2a4 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,9 +2,36 @@ ## [Unreleased] +### New Features + +- Added GPT-6 Astra, Luna, Sol, and GPT-6.1 Sol to the model list for ChatGPT login. + See [Providers](docs/providers.md). +- Added cache-preserving harness updates: background memory and evolved-skill changes apply after successful compaction or in a new session, with pending-update notices in the TUI. + See [Request boundaries](docs/evolution.md#request-boundaries) ([#260](https://github.com/diffexai/diffex/pull/260) by [@Issacboy123](https://github.com/Issacboy123)). +- Retained lessons and evolved skills longer before score-based grooming removes them, while keeping existing capacity limits. + See [Lesson feedback and grooming](docs/evolution.md#lesson-feedback-and-grooming) and [Private skill feedback](docs/evolution.md#private-skill-feedback). + +### Added + +- Added GPT-6 Astra, Luna, Sol, and GPT-6.1 Sol to the Codex model list for ChatGPT login. + ### Changed -- Regular root sessions now reconcile selected harness memory and evolved skills at construction, idle reload, and eligible manual compaction boundaries. +- Deferred background harness memory and evolved-skill updates until successful manual or automatic compaction or a new session, preserving the active conversation's input cache. The TUI announces pending updates; `/clear` starts with the latest revision and `/version` still switches immediately. + See [Request boundaries](docs/evolution.md#request-boundaries) ([#260](https://github.com/diffexai/diffex/pull/260) by [@Issacboy123](https://github.com/Issacboy123)). +- Retained lessons and evolved skills longer by lowering grooming removal thresholds from -5 to -7 for lessons and from -8 to -11 for skills, without changing capacity limits. + See [Lesson feedback and grooming](docs/evolution.md#lesson-feedback-and-grooming) and [Private skill feedback](docs/evolution.md#private-skill-feedback). +- Updated provider SDKs and runtime dependencies, including terminal rendering, syntax highlighting, credential storage, and HTTP libraries ([#272](https://github.com/diffexai/diffex/pull/272), [#273](https://github.com/diffexai/diffex/pull/273), [#274](https://github.com/diffexai/diffex/pull/274)). +- Anthropic requests now omit unsupported sampling parameters, including `temperature`. Google Gemini and Vertex AI requests no longer perform automatic SDK continuations; continuation and context-window limits are reported as `length`. + See [Provider SDK migration notes](../ai/README.md#provider-sdk-migration-notes) ([#273](https://github.com/diffexai/diffex/pull/273)). +- Changed project and package licensing to MIT ([#280](https://github.com/diffexai/diffex/pull/280)). + +### Fixed + +- Fixed Google model streaming through OpenCode Go by registering its Google API implementation ([#265](https://github.com/diffexai/diffex/pull/265)). +- Fixed failed evolution evidence scans being skipped permanently; bounded retries preserve the failed cursor and expose retry status in `/evolve` ([#258](https://github.com/diffexai/diffex/pull/258) by [@Issacboy123](https://github.com/Issacboy123)). +- Enabled short prompt-cache retention for background evolution model calls ([#259](https://github.com/diffexai/diffex/pull/259) by [@Issacboy123](https://github.com/Issacboy123)). +- Updated vulnerable CLI dependencies, including Undici and Zod, and patched shell-quote in the sandbox extension example ([#262](https://github.com/diffexai/diffex/pull/262), [#272](https://github.com/diffexai/diffex/pull/272), [#274](https://github.com/diffexai/diffex/pull/274), [#281](https://github.com/diffexai/diffex/pull/281)). ## [0.3.2] - 2026-09-29 diff --git a/packages/tui/CHANGELOG.md b/packages/tui/CHANGELOG.md index d0cd2373b..f1ebeab6b 100644 --- a/packages/tui/CHANGELOG.md +++ b/packages/tui/CHANGELOG.md @@ -2,6 +2,16 @@ ## [Unreleased] +### Added + +- Added atomic editor tokens with compact display labels that expand on submission, including `EditorTextPart`, `EditorTextToken`, and optional `EditorComponent.setTextWithTokens` ([#132](https://github.com/diffexai/diffex/pull/132)). +- Added configurable placeholder-cursor styling and shared selected-list prefix exports ([#58](https://github.com/diffexai/diffex/pull/58)). + +### Changed + +- Updated Markdown parsing and character-width dependencies ([#272](https://github.com/diffexai/diffex/pull/272)). +- Changed package licensing to MIT ([#280](https://github.com/diffexai/diffex/pull/280)). + ## [0.3.2] - 2026-09-29 ## [0.3.1] - 2026-09-20