Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,35 @@
# Changelog

## 0.1.43 - 2026-09-04

MendCode v0.1.43 adds the current OpenAI GPT-5.6 family and GPT-6 Astra to
the model and Codex OAuth surfaces while keeping the terminal session view
compact during concurrent work.

### Changed

- Add GPT-6 Astra plus GPT-5.6 Sol, Terra, and Luna API and ChatGPT OAuth
presets with documented limits, pricing, reasoning levels, and fast/pro
variants where the provider exposes them.
- Keep the OpenAI model picker populated from an in-process fallback when a
cached or bundled `models.dev` catalog predates the current model family;
live provider metadata still takes precedence.
- Keep Commands history in the Ctrl+T horizontal widget tray with a direct
action to open the originating session.
- Record the Codex CLI `0.153.3` comparison and the compatibility decisions in
the release audit.

### Fixed

- Allow GPT-6 Astra through the ChatGPT OAuth model filter with its documented
context and input limits while retaining the existing Responses Lite scope
for GPT-5.6 tiers.

### Tests

- Add model-catalog fallback, model-preset, Astra OAuth filtering, mode
normalization, and context-limit regressions.

## 0.1.42 - 2026-09-03

MendCode v0.1.42 makes queued prompts, cancellation, reconnection, and communication between sessions reliable under concurrent work.
Expand Down
1 change: 1 addition & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ Use this index by intent. **Use MendCode** explains the public workflow, **Featu
- [Package index](package-index.md): workspace packages versus runtime `.mendcode` packages.
- [MendCode Source Map](source-map.md): one maintained map from public features to implementation and test paths.
- [Releasing](releasing.md): installer contract, checksums, release notes, and public installer smoke tests.
- [Codex CLI and model audit](audits/codex-cli-0.153.3-gpt56-2026-09-04.md): upstream comparison and the GPT-5.6/GPT-6 Astra compatibility decisions for 0.1.43.
- [Changelog](../CHANGELOG.md): versioned behavior changes and regression coverage for recent releases.
- [Supply chain security](supply-chain-security.md): provenance, SBOM, pinned actions, dependency review, and scanner policy.
- [Public readiness audit](public-readiness-audit.md): branch, secret, dependency, legacy-reference, and public-surface checks.
Expand Down
46 changes: 46 additions & 0 deletions docs/audits/codex-cli-0.153.3-gpt56-2026-09-04.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Codex CLI and OpenAI model audit — 2026-09-04

This audit records the upstream Codex CLI comparison used for the 0.1.43
release. The reference CLI stable release was `0.153.3` (`rust-v0.153.3`).
OpenAI's current model pages identify the flagship model as `gpt-6-astra` and
the 5.6 family as `gpt-5.6`/Sol, Terra, and Luna.

## Ported in 0.1.43

- Add `gpt-6-astra`, `gpt-5.6`, `gpt-5.6-sol`, `gpt-5.6-terra`, and
`gpt-5.6-luna` to the OpenAI catalog fallback. A stale cache or bundled
`models.dev` snapshot no longer hides these models from the picker.
- Preserve live `models.dev` entries when they exist, so the fallback cannot
replace newer provider metadata.
- Add API and ChatGPT OAuth presets with documented context limits and API
prices. GPT-6 Astra keeps its 1.05M context/922K input limit; ChatGPT OAuth
Sol, Terra, and Luna keep the existing 256K effective limit imposed by the
Responses Lite adapter.
- Recognize Astra and its documented `fast` variant in the ChatGPT OAuth
catalog. Astra stays on the standard Codex Responses transport; the current
MendCode Responses Lite compatibility contract is limited to the 5.6 tiers.
- Keep the compact Commands history in the Ctrl+T horizontal widget tray,
including its direct session-open action.

## Reviewed and intentionally not ported

- Upstream's asynchronous model-picker refresh (`5fc7840cf6d0`) is a larger
TUI/server contract change. MendCode already refreshes `models.dev` in the
provider service; this release adds the static safety net without changing
picker lifecycle or selection state.
- Luna Reserve usage fallback, app-server collaboration-mode discovery, live
context-compaction status, rate-limit banners, permission-profile discovery,
startup warning condensation, automatic thread naming, and submission-ID
steer acknowledgement were reviewed from the upstream history. Each needs a
separate MendCode contract and regression surface, so none is represented as
shipped behavior here.
- The upstream CLI version is not copied into MendCode's `version` request
header. The existing `0.144.0` value belongs to MendCode's internal
Responses Lite compatibility contract, and the upstream source contains no
equivalent current header contract to justify changing it.

## Sources

- [OpenAI GPT-6 Astra model documentation](https://developers.openai.com/api/docs/models/gpt-6-astra)
- [OpenAI GPT-5.6 Sol model documentation](https://developers.openai.com/api/docs/models/gpt-5.6-sol)
- [OpenAI Codex CLI releases](https://github.com/openai/codex/releases)
4 changes: 3 additions & 1 deletion docs/features.md
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,9 @@ MendCode normalizes supported model aliases, preserves session affinity while th
effective instructions stay the same, and rotates that affinity when instructions
change. GPT-5.6 OAuth models expose a 256K effective input/context limit and a
provider-aware compaction threshold so long sessions compact before the provider
rejects the request.
rejects the request. GPT-6 Astra is also available when the OpenAI catalog or
ChatGPT account exposes it, with its documented 1.05M context and 922K input
limits.

## Model Roles

Expand Down
12 changes: 6 additions & 6 deletions src/mendcode/packages/extensions/zed/extension.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
id = "mendcode"
name = "MendCode"
description = "The open source coding agent."
version = "0.1.42"
version = "0.1.43"
schema_version = 1
authors = ["MendCode"]
repository = "https://github.com/MendCode/MendCode"
Expand All @@ -11,26 +11,26 @@ name = "MendCode"
icon = "./icons/opencode.svg"

[agent_servers.mendcode.targets.darwin-aarch64]
archive = "https://github.com/MendCode/MendCode/releases/download/v0.1.42/mendcode-darwin-arm64.zip"
archive = "https://github.com/MendCode/MendCode/releases/download/v0.1.43/mendcode-darwin-arm64.zip"
cmd = "./mendcode"
args = ["acp"]

[agent_servers.mendcode.targets.darwin-x86_64]
archive = "https://github.com/MendCode/MendCode/releases/download/v0.1.42/mendcode-darwin-x64.zip"
archive = "https://github.com/MendCode/MendCode/releases/download/v0.1.43/mendcode-darwin-x64.zip"
cmd = "./mendcode"
args = ["acp"]

[agent_servers.mendcode.targets.linux-aarch64]
archive = "https://github.com/MendCode/MendCode/releases/download/v0.1.42/mendcode-linux-arm64.tar.gz"
archive = "https://github.com/MendCode/MendCode/releases/download/v0.1.43/mendcode-linux-arm64.tar.gz"
cmd = "./mendcode"
args = ["acp"]

[agent_servers.mendcode.targets.linux-x86_64]
archive = "https://github.com/MendCode/MendCode/releases/download/v0.1.42/mendcode-linux-x64.tar.gz"
archive = "https://github.com/MendCode/MendCode/releases/download/v0.1.43/mendcode-linux-x64.tar.gz"
cmd = "./mendcode"
args = ["acp"]

[agent_servers.mendcode.targets.windows-x86_64]
archive = "https://github.com/MendCode/MendCode/releases/download/v0.1.42/mendcode-windows-x64.zip"
archive = "https://github.com/MendCode/MendCode/releases/download/v0.1.43/mendcode-windows-x64.zip"
cmd = "./mendcode.exe"
args = ["acp"]
2 changes: 1 addition & 1 deletion src/mendcode/packages/opencode/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "0.1.42",
"version": "0.1.43",
"name": "mendcode",
"type": "module",
"license": "MIT",
Expand Down
2 changes: 1 addition & 1 deletion src/mendcode/packages/opencode/script/dev-rearm-smoke.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { createServer, type IncomingMessage, type ServerResponse } from "node:ht
import { once } from "node:events"
import { probeRuntime } from "./dev-rearm"

const VERSION = "0.1.42"
const VERSION = "0.1.43"
const PROJECT = "/tmp/mendcode-dev-rearm-smoke-project"

function assert(condition: unknown, message: string): asserts condition {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
import { createMemo, createSignal, For, Show } from "solid-js"
import type { TuiThemeCurrent } from "@mendcode/plugin/tui"
import { Locale } from "@/util/locale"
import {
agentViewCommandStateRank,
formatAgentViewCommandSummary,
isAgentViewCommandActionable,
type AgentViewCommand,
} from "../util/agent-view"

export function AgentCommandPanel(props: {
commands: readonly AgentViewCommand[]
sessionID: string
width: number
height?: number
busyID?: string
theme: Pick<TuiThemeCurrent, "text" | "textMuted" | "accent" | "error">
onUpdate: (command: AgentViewCommand, state: "accepted" | "rejected") => void
onOpenSession?: (sessionID: string) => void
}) {
const [expanded, setExpanded] = createSignal(false)
const active = createMemo(() =>
props.commands
.filter((command) => agentViewCommandStateRank(command) < 2)
.toSorted(
(a, b) =>
Number(b.targetSessionID === props.sessionID && isAgentViewCommandActionable(b)) -
Number(a.targetSessionID === props.sessionID && isAgentViewCommandActionable(a)) ||
agentViewCommandStateRank(a) - agentViewCommandStateRank(b) ||
b.time.updated - a.time.updated,
),
)
const history = createMemo(() =>
props.commands
.filter((command) => agentViewCommandStateRank(command) >= 2)
.toSorted((a, b) => b.time.updated - a.time.updated),
)
const visible = createMemo(() => [...active().slice(0, 4), ...(expanded() ? history().slice(0, 4) : [])])
const rows = () => (
<>
<For each={visible()}>
{(command) => {
const incoming = () => command.targetSessionID === props.sessionID
const actionable = () => incoming() && isAgentViewCommandActionable(command)
const busy = () => props.busyID === command.id
const sender = () =>
incoming() ? command.payload?.sourceTitle || command.sourceSessionID : command.targetSessionID
const relatedSessionID = () => (incoming() ? command.sourceSessionID : command.targetSessionID)
const canOpen = () =>
Boolean(props.onOpenSession && relatedSessionID() && relatedSessionID() !== props.sessionID)
const trailingWidth = () => (canOpen() ? 7 : 0) + (actionable() ? 19 : 0)
return (
<box width="100%" flexDirection="column" flexShrink={0}>
<box width="100%" flexDirection="row" gap={1}>
<text fg={props.theme.text} wrapMode="none" flexGrow={1} minWidth={0}>
{Locale.truncate(
`${incoming() ? "←" : "→"} ${Locale.truncate(sender().replace(/\s+/g, " "), 24)} · ${formatAgentViewCommandSummary(command)}`,
Math.max(1, props.width - trailingWidth()),
)}
</text>
<Show when={canOpen()}>
<text
id={`agent-command-open-${command.id}`}
fg={props.theme.textMuted}
wrapMode="none"
flexShrink={0}
onMouseUp={() => {
const sessionID = relatedSessionID()
if (sessionID) props.onOpenSession?.(sessionID)
}}
>
[open]
</text>
</Show>
<Show when={actionable()}>
<text
id={`agent-command-accept-${command.id}`}
fg={busy() ? props.theme.textMuted : props.theme.accent}
wrapMode="none"
flexShrink={0}
onMouseUp={() => {
if (!busy()) props.onUpdate(command, "accepted")
}}
>
[accept]
</text>
<text
id={`agent-command-reject-${command.id}`}
fg={busy() ? props.theme.textMuted : props.theme.error}
wrapMode="none"
flexShrink={0}
onMouseUp={() => {
if (!busy()) props.onUpdate(command, "rejected")
}}
>
[reject]
</text>
</Show>
</box>
<Show when={expanded() && command.error}>
<text fg={props.theme.textMuted} wrapMode="none">
{Locale.truncate(command.error!.replace(/\s+/g, " "), props.width)}
</text>
</Show>
</box>
)
}}
</For>
<Show when={active().length > 4 || (expanded() && history().length > 4)}>
<text fg={props.theme.textMuted} wrapMode="none">
More commands in Agent View
</text>
</Show>
</>
)

return (
<Show when={props.commands.length > 0}>
<box width={props.width} height={props.height} flexDirection="column" flexShrink={0}>
<text
id="agent-command-history-toggle"
fg={props.theme.textMuted}
wrapMode="none"
onMouseUp={() => setExpanded((value) => !value)}
>
{history().length > 0 ? (expanded() ? "▾ " : "▸ ") : ""}Commands
{active().length > 0 ? ` · ${active().length} active` : ""}
{history().length > 0 ? ` · ${history().length} past` : ""}
</text>
<Show
when={props.height !== undefined}
fallback={rows()}
>
<scrollbox height={Math.max(1, props.height! - 1)} width="100%">
{rows()}
</scrollbox>
</Show>
</box>
</Show>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ const titleOverrides: Record<string, string> = {
"session.context": "View Context Usage",
"session.permission.status": "Change Approval Mode",
"session.toggle.sticky_user_header": "Toggle Sticky User Header",
"session.toggle.todos": "Toggle Todos",
"session.toggle.todos": "Toggle Session Widgets",
"session.toggle.thinking": "Toggle Thinking",
"session.toggle.timestamps": "Toggle Timestamps",
"session.toggle.actions": "Toggle Tool Details",
Expand Down
Loading
Loading