release: 0.2.0 (#168)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
2e8389f438
commit
4d5d55d15a
27 files changed
+171
-15
No files matched your search
@@ -1,3 +0,0 @@
|
||||
# File summaries wait for the Task to finish
|
||||
|
||||
The main conversation's file summary no longer appears after an intermediate assistant message while tools and later model turns are still running. It now appears once at the completed Task boundary and scans all assistant text from that Task, so paths mentioned before a tool call are still available in the final summary. Nested agent conversations keep their existing per-message summaries because their embedded stream does not expose the parent view's Task footer. File-existence caching also stops retaining negative results, allowing a later Task to create and surface a path that was previously absent. Existence checks go out in server-sized batches, so a long Task referencing more paths than one files/stat call accepts still gets its summary instead of silently losing it.
|
||||
@@ -1,27 +0,0 @@
|
||||
# Backward compatibility in this batch
|
||||
|
||||
Per the repo rule, every compatibility decision of the batch is recorded here once; the feature entries reference this file instead of re-telling it.
|
||||
|
||||
## Installers keep a legacy program-archive path for pre-0.1.6 releases
|
||||
|
||||
From this batch on, the canonical Release artifact is a flat installer bundle whose payload sits inside as `payload.tar.gz` / `payload.zip`. Releases up to v0.1.5 shipped the program tree directly (top-level `penguin/`) under the same asset names, and users can still pin those versions or hold such files locally.
|
||||
|
||||
**Old shape tolerated:** any archive without a top-level `payload.*` is treated as a program archive. `--version` pins at pre-0.1.6 releases download the old raw asset and install through this path; `--archive` / `-ArchivePath` accepts a legacy raw archive (adjacent `.sha256` still required, renamed files still fall back to the canonical asset checksum plus the manifest rule) as well as the new bundle or its inner payload.
|
||||
|
||||
**Scope:** the shape probe and the program-archive branch in `install.sh` and `install.ps1` only. Release packaging, CI and docs describe exclusively the new shape; no on-disk user data is involved (`~/.penguin/data` was never part of install or upgrade).
|
||||
|
||||
**User action:** none for the documented flows.
|
||||
|
||||
**Removal:** the legacy branch should stay while pre-0.1.6 releases remain plausible `--version` targets. Whoever prepares the release that drops support for installing pre-0.1.6 versions deletes the program-archive branch and the `tar -tzf` / zip-entry probes with it; the sites in both installers reference this file.
|
||||
|
||||
## Installer scripts saved from releases up to v0.1.5 cannot install newer assets
|
||||
|
||||
This is a deliberate incompatibility, not a handled one: the old installers download the asset under the same name, pass the outer checksum, then fail with their "unexpected archive layout: top-level penguin/ missing" error because the new artifact is a bundle. The documented install commands are unaffected — the penguin.ooo forwarders fetch the installer attached to the latest Release at run time — and the fix for a saved old script is to re-fetch it. Old releases' own assets are untouched: an old installer pinned at an old version keeps working forever.
|
||||
|
||||
## The Windows payload drops its penguin.ps1 launcher
|
||||
|
||||
This is a deliberate removal with a self-cleaning upgrade path, not a tolerated old shape. Typing `penguin` is unaffected — PowerShell and cmd.exe both resolve `bin\penguin.cmd`, which is exempt from the execution policy that used to block the `.ps1` launcher on default client Windows. Only direct `.\penguin.ps1` invocations need to switch to `penguin` / `penguin.cmd`. Installs made before this change keep their old launcher until the next upgrade: the installer swaps `bin\` wholesale, so re-running it removes the stale `penguin.ps1` along with the rest of the old `bin\` — which is also the fix for machines already showing the "running scripts is disabled" error. Nothing reads or regenerates the file anymore; no removal follow-up is needed.
|
||||
|
||||
## The recover-truncated-tool-output batch needs no handling
|
||||
|
||||
`EnvironmentConfig.sessionScratchpadDir` is additive and optional: standalone SDK embedders that never pass it keep the exact previous truncation behavior, existing Traces replay unchanged, and no stored format changes shape. Recorded here only to state that the check was made.
|
||||
@@ -1,9 +0,0 @@
|
||||
# Evaluation Center Case details and Score charts
|
||||
|
||||
Case details now separate the task materials visible to the Target Agent from the scoring rubric available to project members, while keeping both file roots path-confined. Score charts use a padded dynamic axis without discarding authoritative stored values, and the benchmark Skills use YAML folded scalars for Scoreboard summaries.
|
||||
|
||||
## Details
|
||||
|
||||
- Case details show task materials and scoring rubrics as separate file groups. Rubrics remain hidden from the Target Agent.
|
||||
- Score charts pad the observed in-range values, clamp the displayed axis to 0–100, and preserve stored finite values for plotting and tooltips.
|
||||
- Benchmark design and optimization Skills write summary fields as YAML folded scalars and parse the complete Scoreboard after appending an Evaluation.
|
||||
@@ -1,15 +0,0 @@
|
||||
# Core: truncated tool output remains recoverable within its Session
|
||||
|
||||
Tool output still obeys each entry's `maxOutputLength` exactly as before: the Web/CLI stream, the complete `tool_call_output`, Trace, and the next model input remain byte-for-byte aligned, with truncation and terminal markers staying outside the cap.
|
||||
|
||||
When a tool call in an Agent Session actually exceeds that cap, Environment now also saves the text it received to the Session scratchpad (`scratchpad/<sessionId>/truncated-tool-output/`, created only on actual truncation, private permissions where the platform has them) and appends the recovery path to the same tool result seen by the frontend and the model. No model-facing tool or schema is added: the model inspects the file with the existing `read_file` (`offset`/`limit`) or targeted `rg`/`tail` commands.
|
||||
|
||||
The wiring is one generic Environment parameter rather than a feature-specific manager: `EnvironmentConfig.sessionScratchpadDir` names the Session-scoped storage root, Environment derives `truncated-tool-output/` from it internally, and the new `sessionScratchpadDir()` path helper becomes the single definition of `scratchpad/<sessionId>` (input images and the goal file already lived there and now derive from the same helper). Agent composition passes it automatically; standalone SDK embedders omit it and keep the previous truncation-only behavior, or opt in by passing a directory — no archive class crosses the public config surface.
|
||||
|
||||
The model-visible path is a plain absolute path, always the last element of the note — and the spelling rule now covers every path core composes for the model, through one `modelVisiblePath` helper exported from the package barrel: the system prompt's App Data Dir and CWD lines, `[attached image: …]` lines, the server's `[attached file: …]` lines, and the goal-file line. On Windows that spelling uses forward slashes: `exec_command` runs through (Git) Bash and Node's fs APIs accept them, so the model can re-emit the same spelling into JSON tool arguments and shell commands without backslash-escaping mistakes; harness paths are ordinary absolute paths (never `\\?\`-prefixed), so the swap is lossless, and POSIX paths pass through unchanged.
|
||||
|
||||
File tools stay compatible with Windows spellings on the consuming side: `path.resolve` accepts `C:\…` and `C:/…` alike (pinned by win32-only tests), tool messages echo the caller's own spelling, and the one system-composed path in tool output — `read_file`'s not-found workspace hint — uses the model-visible spelling too. The Web App's file cards follow suit: workspace-prefix stripping previously required the assistant's separators to match the Workspace's exactly, so on a Windows Workspace the forward-slash spelling produced no card at all; it now compares both sides on `/` with a case-insensitive drive letter, while POSIX Workspaces still never touch backslashes (legal filename characters there).
|
||||
|
||||
Each call archives at most 8 MiB — one byte under `read_file`'s 8 MiB scan cap, so the tool's final zero-byte read can still confirm end of file. Larger calls keep UTF-8-safe head/tail windows with an explicit `[archive middle truncated]` gap. Capture memory is bounded (Buffer chunks while exact, a fixed-capacity ring tail after promotion), surrogate pairs split across stream deltas are rejoined, and this is a per-call bound only: a Session has no aggregate archive quota. Recovery preserves what Environment received; text a producer already dropped upstream (e.g. an `[..., N chars of earlier output dropped ...]` marker from a bounded unread buffer) is not recoverable.
|
||||
|
||||
Recovery files contain unredacted tool text and live and die with the Session scratchpad — the existing explicit Session-deletion path removes them; no separate cleanup lifecycle is added, which can increase local at-rest retention of accidentally read sensitive data. Trace stores the same truncated result and absolute path, not a second copy of the archived bytes. An archive-write failure never changes the tool's `stop_reason`; the visible note and stderr warning carry a short errno code, not the path or raw error.
|
||||
@@ -1,15 +0,0 @@
|
||||
# Tooling: one canonical install bundle per target, for online and offline alike
|
||||
|
||||
Each Release now attaches exactly one artifact per target: `penguin-{linux,darwin}-{x64,arm64}.tar.gz`, `penguin-universal.tar.gz` and `penguin-win32-x64.zip` are flat installer bundles, each sealing the native installer, the program payload (`payload.tar.gz` / `payload.zip`) and the payload's SHA256 checksum. Raw program archives and the five `*-offline` wrappers introduced in 0.1.5 are no longer published; `SHA256SUMS` covers exactly the six bundles.
|
||||
|
||||
Both installation modes consume the same file. Online, `install.sh` / `install.ps1` download the bundle, verify it against its published `.sha256` — checksums are now always mandatory; the online warn-and-skip fallback is gone — then open the flat outer layer and verify the payload checksum sealed inside before staging. Offline, the user transfers that one file, extracts it once and runs the bundled `./install.sh` (or double-clicks `install.cmd`); the installer finds the sibling payload by itself and verifies the same sealed checksum with no network access, so no separate checksum file needs to be carried.
|
||||
|
||||
Archive shape is probed by content, not filename: a top-level `payload.*` means bundle, anything else is treated as a program archive with a top-level `penguin/`. That single probe replaces the previous online/offline split and keeps pinned pre-0.1.6 versions and legacy local archives installable (see the batch's [backward-compatibility notes](2026-07-31-backward-compatibility.md)). On Windows, the flat outer layer means the initial extraction never creates deep paths — PowerShell 5.1's 260-character limit stops being reachable from the download directory — and the zip shape probe reads the entry list without extracting; only the installer expands the payload, straight into its short staging directory.
|
||||
|
||||
The canonical installers travel byte-identical inside the bundles — the generated POSIX wrapper entry (`penguin-installer.sh` + stub `install.sh`) is gone, replaced by sibling-payload detection in the one real installer. That detection is hardened to keep 0.1.5's "never trust archives beside a temporary script" property: it engages only for a real file actually named `install.sh`, and the penguin.ooo forwarder now stages its download in a private `mktemp -d` directory rather than a bare file in shared `/tmp`. The Windows forwarder already runs the installer as an in-memory script block and keeps its sibling detection offline-only.
|
||||
|
||||
In-place upgrades stop failing on filesystems that pin in-use directories. `penguin update` re-runs the installer while the CLI process is still executing out of `lib/`; on overlayfs under Docker the plain `mv lib .old.<pid>/lib` failed with `Device or resource busy` and rolled back. Directory moves now degrade through three strategies — whole-directory rename, per-entry renames into a fresh or existing destination, then per-entry copy with the source cleared (POSIX keeps an unlinked-but-open file valid for the process using it) — with a pinned, empty directory husk reused by the incoming move, rollback following the same rules, and a failure message that says to stop running penguin processes. A hermetic test stubs `mv`/`rmdir` to refuse directory renames touching the installed `lib/` and verifies the upgrade completes cleanly.
|
||||
|
||||
Two Windows papercuts are fixed at the root. The payload no longer ships a `penguin.ps1` launcher: PowerShell prefers `.ps1` over `.cmd` on PATH and client Windows defaults to the Restricted execution policy, so a fresh install's plain `penguin` command failed with "running scripts is disabled"; batch files are policy-exempt, both PowerShell and cmd.exe resolve `penguin.cmd`, and since upgrades swap `bin\` wholesale, re-running the installer also removes the old shim (see the batch's [backward-compatibility notes](2026-07-31-backward-compatibility.md)). And after appending to the user Path registry value, the installer now broadcasts `WM_SETTINGCHANGE` — a raw registry write alone left Explorer, and every terminal launched from it, on the stale Path until the next logon, which is why a brand-new PowerShell window still could not find `penguin`; the completion note now says to open a new terminal window rather than a new tab.
|
||||
|
||||
`scripts/package-release-bundles.sh` replaces `package-offline-bundles.sh`, and the release workflow now builds payloads as intermediates, packages the six bundles, and validates the real outputs before upload: outer checksum, exact flat member set, byte-identical installer and payload, and a passing sealed checksum. `scripts/test-installer.sh` and `scripts/test-installer.ps1` replace the offline-only test scripts and hermetically cover bundle layout, offline installs with network access stubbed to fail, corrupted-payload rejection, upgrade rollback, both checksum layers, no-fallback download failures and pinned legacy versions, wired into the existing Linux and Windows CI jobs. README, the docs Installation page and the landing install copy describe the single-artifact flow.
|
||||
@@ -1,9 +0,0 @@
|
||||
# File tools diagnose missing paths instead of implying absolute paths are rejected
|
||||
|
||||
`read_file` / `edit_file` accepted absolute paths all along, but their "File not found" message mentioned only workspace-relative resolution — so a genuinely missing file (typically a dropped `agent_state/` segment) read as "absolute paths are unsupported", and the model retried path forms instead of questioning the path (#138).
|
||||
|
||||
## Details
|
||||
|
||||
- Both tools now state that absolute paths are supported and append a diagnostic: the deepest existing ancestor directory, the first missing segment, and the ancestor's entries ranked by name similarity to the missing one (capped at 8, directories marked with a trailing slash) — for the reported case the hint names `agent_state/` directly.
|
||||
- ENOTDIR (a path segment that is a file, not a directory) gets the same diagnosis instead of a raw errno message.
|
||||
- The agent-creation Skill now spells out that `AGENTS.md` lives under `agent_state/`, not at the agent directory root — the likely source of the dropped segment (skill version 7).
|
||||
@@ -1,3 +0,0 @@
|
||||
# Web App: the manual update check reports every outcome
|
||||
|
||||
The sidebar user menu's "Check for updates" row used to notify only when nothing changed visibly; finding a newer release changed the row silently. The manual check now gives explicit feedback for every outcome: a spinner and busy label while the check runs, a success toast when already up to date, and a success toast naming the release when a newer one is found — at which point the same row turns into the persistent "New version vX available" entry that opens the update dialog (release-notes link, admin-only self-update). Failed lookups and disabled checks keep their error/info toasts. The outcome mapping is a pure, unit-tested classifier: disabled beats failed beats found, and "found" must name a version so neither the toast nor the row is ever blank.
|
||||
@@ -1,21 +0,0 @@
|
||||
# Steering survives reloads and carries files; session list scales
|
||||
|
||||
Steering messages no longer vanish on refresh or come back as duplicate-prone drafts, file attachments steer like images do, tool-card subtitles stop jittering while arguments stream, and the sidebar stays fast and scannable with many agents, workspaces, and CLI sessions.
|
||||
|
||||
## Steering across reloads, with visible content (#136, #140)
|
||||
|
||||
- The server now mirrors each running session's undelivered steering queue (text plus image/file counts) and broadcasts it on every `task_state` event and the SSE subscribe snapshot. The composer's "steering queued" hint shows each queued message's content and survives reloads; entries retire as their `[user_steering]` message reaches the stream, and the mirror drops when the run exits.
|
||||
- A successful steer discards the localStorage draft, like a normal send — previously the sent text was resurrected as a draft on reload, and re-sending it duplicated the steering message. Draft discard also clears the text ref so a later skill/chip flush cannot bring already-sent text back.
|
||||
- File attachments now ride steering exactly like images: written to the session scratchpad under the task-attachment rules and delivered as `[attached file: <path>]` lines on the steering text. A file-only draft steers instead of silently falling into the follow-up queue with the other channel's hint; a 409 cleans the written files up.
|
||||
- New e2e spec: steer during a slow tool run → reload → hint with content, empty composer, exactly-once delivery.
|
||||
|
||||
## Tool-card subtitles render once, fully formed (#137)
|
||||
|
||||
The collapsed tool row's subtitle (the model-written call description, or the shortened file path) no longer re-renders on every streamed fragment — a growing description re-solved the header's flex line ~8×/s and `shortenPath` on a still-growing path rewrote non-monotonically. A field now renders only once its closing quote has arrived (the gate lifts when argument streaming settles, so aborted calls still show what they have), and a complete description wins over the file path when a user-edited schema enables one on a file tool — the rule the CLI already applied.
|
||||
|
||||
## Session list: DB-served by default, CLI sessions opt-in, groups page (#139)
|
||||
|
||||
- The sessions index gains DB-only `client` ('web' / 'cli'; NULL = legacy row, treated as web) and `has_trace` columns; existing `web.db` files are upgraded in place by an idempotent ALTER guard on open.
|
||||
- The default list serves web sessions straight from the DB (SQL-ordered under a new index) with no Trace-directory scanning in steady state; `cli=1` opts into Trace discovery + adoption, and adopted CLI rows stay excluded from the default list while remaining individually reachable (deep links).
|
||||
- New per-user "Show CLI sessions" switch (default off) in the sidebar user menu, persisted in `ui_prefs`; toggling refetches the list under the new filter.
|
||||
- Both sidebar grouping modes page the groups themselves: 10 groups initially, "More groups (N)" reveals 10 more — a pure render cap, reset per Project and on a mode switch.
|
||||
@@ -1,23 +0,0 @@
|
||||
# Models: qianwenai lineup refresh, DeepSeek flash revisions, flash as the seeded default
|
||||
|
||||
Prices and specs read from each model's page or the gateway's models API on 2026-08-03.
|
||||
|
||||
## Qianwenai groups
|
||||
|
||||
Qwen Pay-As-You-Go gains `qwen3.8-max` (CNY 1.5/12/36 per mtok, vision) and `deepseek-v4-flash-0731` (CNY 0.2/1/2, text-only; the page lists DeepSeek bare, unlike the `kimi/` and `ZHIPU/` prefixed resales), and drops `qwen3.7-max`. The Qwen Token Plan gains the same two models and drops `qwen3.8-max-preview` and `qwen3.7-max`, while `deepseek-v4-pro`, `glm-5.2` and `qwen3.7-plus` stay; with the preview entry gone, the Token Plan's model-page link no longer needs its fallback carve-out.
|
||||
|
||||
## OpenRouter
|
||||
|
||||
Gains `deepseek/deepseek-v4-flash-0731` and `openai/gpt-5.6-luna`, and drops `poolside/laguna-m.1:free`, which the models API no longer lists (only the `laguna-s-2.1` / `laguna-xs-2.1` generation remains). Every OpenRouter row's pricing is also re-read in one pass from the models API — the debt the catalog comment had recorded since 2026-07-20: `cache_read` now stores the published cache-hit price wherever one exists, `cache_write` stores the genuine 1.25× per-token write premium on the Anthropic/GPT rows and the input price elsewhere (Gemini's API field is an hourly storage rate, not a per-token price, so those rows keep input), and drifted input/output list prices follow the API (`moonshotai/kimi-k2.6`, `openai/gpt-5.6-terra`, `tencent/hy3`, `z-ai/glm-5.2`, the undated `deepseek/deepseek-v4-flash`).
|
||||
|
||||
## SiliconFlow
|
||||
|
||||
The three previously unpriced rows (`Pro/moonshotai/Kimi-K2.6`, `Pro/zai-org/GLM-5.1`, `Qwen/Qwen3.6-35B-A3B`) get their official CNY list prices; GLM-5.1 bills in two input-length tiers and the catalog stores the lower one, marked as a floor for long-context use. No catalog entry ships unpriced anymore.
|
||||
|
||||
## Default model, docs and skills
|
||||
|
||||
The seeded Project default becomes `deepseek` / `deepseek-v4-flash`. Docs follow (models / configuration / quickstart, en/zh); the penguin-sdk skill (v18) names the new preset default its env-only setup path relies on, and agenthub-models (v9) adds the `deepseek/deepseek-v4-flash-0731` OpenRouter spelling; released blog posts that mention the removed free model stay frozen.
|
||||
|
||||
## Effect on existing Projects
|
||||
|
||||
There is no automatic migration: model entries and the default are copied into `.project_config.toml` when a Project is created, and nothing rewrites them on upgrade. The Web "sync presets" action, when a user runs it explicitly, appends catalog-only rows in catalog order and updates the catalog-owned fields (vision, context window, client type, pricing, base URL) of rows that match a preset — credentials and list positions are kept, nothing is ever deleted, and the stored default is not touched; delisted presets simply stop being re-added. Only newly created Projects see the new lineup and default out of the box.
|
||||
@@ -1,26 +0,0 @@
|
||||
# Web App: chat navigation — input history, stacked sticky headers, minimap tick rail
|
||||
|
||||
Long conversations were hard to move through: recalling a previous request meant retyping it, collapsing a long thinking/tool run meant scrolling all the way back to its header, and reaching a specific exchange meant scrolling past everything in between. Three navigation aids on the chat page address this (#164).
|
||||
|
||||
## ArrowUp input history
|
||||
|
||||
- With an (effectively) empty composer, ↑ recalls this session's previous inputs newest-first, shell-style; ↓ walks forward again and, past the newest entry, restores the draft that was stashed when navigation began.
|
||||
- Editing a recalled entry ends navigation immediately; inside a multi-line entry the arrows move the caret line by line first (only ↑ on the first line / ↓ on the last line step the history, zsh-style), and IME candidate navigation is untouched.
|
||||
- Only text the user actually typed qualifies: handoff / model-switch source blocks, scheduled-trigger prompts, and goal re-sends past round 1 stay out; steering messages are included; consecutive duplicates collapse. Draft chats have no history and keep native arrow behavior.
|
||||
|
||||
## Sticky "Reasoning & Tools" headers, stacked by level
|
||||
|
||||
- The group header sticks to the top of the message list while its group body is in view, and the currently scrolled thinking/tool row pins right below it — rows push each other out at their section boundaries, so the bar directly above the content is always the section being read, never a skipped level. A long run can be collapsed from anywhere inside it, per section or as a whole.
|
||||
- Collapsing from a stuck header scrolls the view back onto that group/row (expanding, and collapsing in view, move nothing). The card clips with `overflow: clip` instead of `overflow: hidden` — a hidden ancestor is a scroll container, which is exactly what disabled `position: sticky`; the group offset cancels the stream container's own top padding in the same rem unit (the rows' offset adds the header's height on top), and the stuck bars' backgrounds are opaque so scrolled content can't bleed through.
|
||||
|
||||
## Conversation minimap (tick rail)
|
||||
|
||||
- The quick-jump index costs the conversation no width: a tick rail overlays the left gutter the centered column leaves free — one tick per exchange (pitch compresses as turns grow), the reading position longer and darker, tracked by a scrollspy (the stream bottom counts as the newest turn).
|
||||
- Hovering or focusing a tick pops a floating preview card — the user's question in bold over a truncated plain-text reply preview (markdown flattened; the newest turn shows a pulsing "answering" note while its reply hasn't started) — and clicking jumps straight to the turn with a brief flash on the landed-on message. The card is a pure tooltip: hit-transparent and mounted only while hovering, so message text is never duplicated into the DOM at rest.
|
||||
- When the rail cannot show at all — phones without a hover pointer, or any window whose gutter a docked panel ate — the index moves to a top-right toolbar icon button opening a dropdown of the exchanges (question + truncated reply, reading position highlighted, tap to jump), so navigation stays reachable in every layout. Active-entry resolution counts only anchors that are outline entries: banner-only messages, merged image fragments and goal rounds past 1 resolve to the entry covering them instead of clearing the highlight.
|
||||
- The toolbar's agents-panel button drops its label below sm like the workspace button next to it (icon with title/aria only) — the text ate the session title's room on phones.
|
||||
- The rail renders only while the measured gutter actually has the room (live measurement — opening a docked side panel hides it, closing brings it back) on hover-capable pointers; the overlay itself takes no pointer events, so the wheel keeps scrolling the stream anywhere in the gutter. Protocol banners open no entry, goal rounds merge into the round-1 entry, scheduled turns are listed; jump anchors are stamped only on the main conversation and queried scoped to its scroll container, so nested subagent renders can't collide.
|
||||
|
||||
## e2e
|
||||
|
||||
The new `outline.spec.mjs` covers the tick rail (hover card, jump, panel-eats-gutter auto-hide), the stacked sticky headers, and history recall end to end at 1440×860; the suite keeps Playwright's default viewport — the rail duplicates no text at rest, so the historical specs needed no changes.
|
||||
@@ -1,23 +0,0 @@
|
||||
# Unreleased
|
||||
|
||||
Changes since v0.1.5. The version number is assigned at release, when this folder is renamed.
|
||||
|
||||
- [2026-08-03] Web App: three chat-navigation aids — ↑ recalls the session's previous inputs shell-style in the composer, the "Reasoning & Tools" header and the current thinking/tool row stick to the top of the stream stacked by level so long runs collapse from anywhere inside them, and a zero-width tick-rail minimap over the stream's left gutter previews every exchange on hover (question + truncated answer) for one-click jumps. ([details](2026-08-03-web-chat-navigation.md))
|
||||
|
||||
- [2026-08-03] Models: the qianwenai groups move to the current lineup (qwen3.8-max and deepseek-v4-flash-0731 in, qwen3.7-max and qwen3.8-max-preview out), OpenRouter gains deepseek/deepseek-v4-flash-0731 and openai/gpt-5.6-luna, drops the delisted poolside/laguna-m.1:free and has every row's cache/input/output prices re-read from the models API, the last unpriced SiliconFlow rows get list prices, and new Projects default to deepseek-v4-flash — existing Projects keep their stored models and default. ([details](2026-08-03-model-catalog-qianwenai-flash.md))
|
||||
|
||||
- [2026-08-02] Web App: steering messages survive reloads with their content visible and can carry file attachments, tool-card subtitles render once fully formed instead of jittering, and the session list is DB-served by default with an opt-in CLI-session toggle and paged sidebar groups. ([details](2026-08-02-web-app-steering-and-session-list.md))
|
||||
|
||||
- [2026-08-02] File tools: `read_file` / `edit_file` diagnose a missing path — deepest existing ancestor, first missing segment, nearest-named entries — instead of a bare "File not found" that read as absolute paths being rejected; the agent-creation Skill spells out `agent_state/AGENTS.md`. ([details](2026-08-02-file-tool-missing-path-diagnostics.md))
|
||||
|
||||
- [2026-08-02] Web App: the manual "Check for updates" row reports every outcome — busy spinner while checking, success toasts for both up-to-date and update-found (naming the release, with the row itself becoming the update entry), and the existing failure/disabled notices — via a unit-tested outcome classifier. ([details](2026-08-02-update-check-feedback.md))
|
||||
|
||||
- [2026-07-31] Tooling: each Release now attaches exactly one artifact per target — a flat installer bundle sealing the native installer, the program payload and its checksum — serving online and offline installation from the same file, with mandatory checksums at both layers, no more raw archives or `*-offline` wrappers, and hermetic installer tests in CI; in-place upgrades survive filesystems that pin in-use directories (the `penguin update` overlayfs `Device or resource busy` failure), the Windows payload drops its policy-blocked `penguin.ps1` launcher, and the installer broadcasts the user-Path change so new terminal windows find `penguin`. ([details](2026-07-31-unified-installer-artifact.md))
|
||||
|
||||
- [2026-07-31] Backward compatibility: the batch's compat decisions in one place — installers keep a content-probed legacy path so pre-0.1.6 releases and old local archives stay installable (with its removal owner named), old saved installer scripts break loudly against new assets by design, the dropped `penguin.ps1` launcher cleans itself up on upgrade, and the truncated-output batch is additive with nothing to migrate. ([details](2026-07-31-backward-compatibility.md))
|
||||
|
||||
- [2026-07-31] Core: tool output that exceeds `maxOutputLength` in an Agent Session is now saved to the Session scratchpad and the recovery path appended to the same truncated result the model and frontends see — no new tool, no change to the visible cap or the stream-equals-complete contract — wired through one generic `EnvironmentConfig.sessionScratchpadDir` parameter, with per-call 8 MiB bounds and UTF-8-safe head/tail for larger calls; every model-visible path core composes (prompt Environment lines, attachment lines, goal file, tool messages, recovery notes) now shares one forward-slash spelling on Windows via `modelVisiblePath`, file tools keep accepting both Windows spellings, and the Web App's file cards match Windows paths in any separator spelling. ([details](2026-07-31-recover-truncated-tool-output.md))
|
||||
|
||||
- [2026-07-31] Evaluation Center: Case details separate Target Agent task materials from project-member-visible scoring rubrics, Score charts use a padded dynamic axis without discarding stored values, and the benchmark Skills write YAML-safe Scoreboard summaries. ([details](2026-07-31-evaluation-center-case-details.md))
|
||||
|
||||
- [2026-07-30] Web App: the main conversation's file summary moves to the completed Task boundary — one card per Task scanning all of its assistant text, nested agent conversations keep their per-message summaries, and file-existence caching stops retaining negative results so a later Task can surface a newly created path. ([details](2026-07-30-file-summary-task-boundary.md))
|
||||
Reference in new issue
Block a user