From 8909547d9b2fe92dbefe046325f498654d2ca08e Mon Sep 17 00:00:00 2001 From: "andreapn.eth" Date: Fri, 7 Aug 2026 23:10:26 +0700 Subject: [PATCH] chore(release): bump version to 2026.8.7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cut 2026.8.7 from main. The release is mostly Web UI. Token price charts render inline in chat — an artifact published as `application/vnd.agentos.chart+json` draws as an interactive candlestick chart with an OHLC readout strip instead of a download chip, rides the existing artifact seam so history replay redraws it, loads `lightweight-charts` dynamically, sweeps charts on transcript rebuild, and lets a click pan instead of downloading the JSON. Both gmgn skills carry the converter. Keyboard handling became one registry with a `?` overlay listing every binding, with self-registering layers and per-platform keycaps. Router Tiers picks tier models from the union of the live catalog and the shipped router profiles instead of free text, warning without blocking. Switching LLM providers restores that provider's remembered profile, and gateway boot warns when the bundled Control UI is older than the frontend sources in a checkout. Bump pyproject, uv.lock, README install pins, install.sh/install.ps1 default versions and the release-consistency/install-script tests, and move [Unreleased] into a [2026.8.7] section with a RELEASES.md row. The chart, shortcut-registry, and Router Tiers work landed without changelog entries, so those are written here too. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 39 +++++++++++++++++++++++++++++++ README.md | 8 +++---- RELEASES.md | 1 + install.ps1 | 2 +- install.sh | 6 ++--- pyproject.toml | 2 +- tests/test_install_scripts.py | 2 +- tests/test_release_consistency.py | 2 +- uv.lock | 2 +- 9 files changed, 52 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d119e9e8..4908f508 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +## [2026.8.7] - 2026-08-07 + ### Fixed - Switching from a cloud LLM provider back to a local one no longer disables the @@ -29,6 +31,43 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). rather than frozen, so upgrades still move you onto the current recommended models. Credentials are never copied into a profile. See [docs/configuration.md](docs/configuration.md). (Refs #188) +- Token price charts render inline in Web UI chat. An artifact published as + `application/vnd.agentos.chart+json` draws as an interactive candlestick chart + in the transcript instead of a download chip, and both `gmgn-market` and + `gmgn-token` ship the converter that emits one alongside their text summaries. + A readout strip above the canvas carries the hovered candle's time, OHLC, + volume, and close-against-open as a signed percentage at the payload's own + precision. The chart rides the existing artifact seam, so history replay + redraws it with no separate path; `lightweight-charts` loads dynamically and + never enters a chat that has no chart. Payload strings are attacker-controlled + on-chain metadata and reach the DOM only through `textContent`. See + [docs/artifacts-and-media.md](docs/artifacts-and-media.md) for the contract a + skill has to meet to publish one. +- The Web UI has one keyboard shortcut registry and a `?` overlay that lists + every binding. Components declare a shortcut instead of attaching their own + document listener, so the editable-target and overlay guards live in one place + and dialogs register themselves as layers rather than being matched by a + hardcoded selector list. Combos match on both `e.key` and `e.code`, and the + New chat tooltip renders the right keycaps per platform instead of a hardcoded + `⌘⇧O`. The sheet loads lazily. (Closes #137) +- Agent settings → Router Tiers picks tier models from a catalog instead of + free text. The provider cell is a read-only chip — requests always go through + `llm.provider`, and save writes it on every tier — while the model cell is a + combobox over the union of the live `models.list` catalog and the shipped + `onboarding.catalog.routerProfiles`, so neither an offline install nor a + provider the gateway has no catalog for produces a false warning. The image + tier is offered only vision-capable models. Save warns and never blocks, and + distinguishes an unknown id, an image tier pointed at a model with no vision + capability, and having no catalog to check against. Context window and price + per 1M render under the entered model. (Closes #142) + +### Documentation + +- `features/skills.md` and the tools reference now name the mimes that render + inline and link to the artifact contract, so a skill author can find out that + publishing one mime rather than another is the difference between a chart and + a download chip. Both chart sections say to keep `--output` a bare filename, + since `publish_artifact` only accepts files under the active workspace. ## [2026.8.6] - 2026-08-06 diff --git a/README.md b/README.md index dec9475f..67d28b13 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ OpenAI, Anthropic, Ollama, DeepSeek, Gemini, Qwen/DashScope, and 20+ other providers. You do not need to change your code or config to switch providers. -AgentOS 2026.8.6 is the current release. The project website is +AgentOS 2026.8.7 is the current release. The project website is [useagentos.dev](https://useagentos.dev). Follow [@useAgentOS](https://x.com/useAgentOS) on X for updates. @@ -224,14 +224,14 @@ agentos gateway run > new terminal window. Or run the PATH command from step 1 again. For an install pinned to one exact version, add `==` — for -example `uv tool install --python 3.12 "use-agent-os[recommended]==2026.8.6"` — +example `uv tool install --python 3.12 "use-agent-os[recommended]==2026.8.7"` — or use the GitHub release wheel link directly: -`https://github.com/use-agent-os/agent-os/releases/download/v2026.8.6/use_agent_os-2026.8.6-py3-none-any.whl`. +`https://github.com/use-agent-os/agent-os/releases/download/v2026.8.7/use_agent_os-2026.8.7-py3-none-any.whl`. > [!NOTE] > Release install commands use published GitHub release assets. > Python wheel installs use versioned wheel filenames — for example -> `use_agent_os-2026.8.6-py3-none-any.whl` — because the installers validate the +> `use_agent_os-2026.8.7-py3-none-any.whl` — because the installers validate the > version segment inside the wheel filename, so there is no `latest` > wheel alias. Only the Windows portable zip has a version-independent > `releases/latest/download/` alias. diff --git a/RELEASES.md b/RELEASES.md index 58babd8e..29222147 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -2,6 +2,7 @@ | Version | Tag | Date | Notes | |---|---|---|---| +| 2026.8.7 | v2026.8.7 | 2026-08-07 | A Web UI release. Token price charts render inline in chat: an artifact published as `application/vnd.agentos.chart+json` draws as an interactive candlestick chart in the transcript instead of a download chip, with a readout strip carrying the hovered candle's time, OHLC, volume, and close-against-open as a signed percentage at the payload's own precision. It rides the existing artifact seam, so history replay redraws it with no separate path; `lightweight-charts` loads dynamically and never enters a chat that has no chart; charts are keyed by host and swept on session switch and "load earlier" rather than stranding a canvas and a `ResizeObserver` per rebuild; a click on the canvas pans instead of downloading the JSON; and payload strings, which are attacker-controlled on-chain metadata, reach the DOM only through `textContent`. Both `gmgn-market` and `gmgn-token` carry the converter, since the skill loader has no skill-to-skill dependency mechanism and deferring to a sibling meant the chart silently never appeared. Keyboard handling became one registry with a `?` overlay that lists every binding — components declare a shortcut instead of attaching their own document listener, dialogs register themselves as layers rather than being matched by a stale hardcoded selector list, combos match on both `e.key` and `e.code`, and the New chat tooltip renders the right keycaps per platform. Agent settings → Router Tiers now picks tier models from a catalog instead of free text: the provider is a read-only chip because requests always go through `llm.provider`, the model cell is a combobox over the union of the live `models.list` catalog and the shipped router profiles so neither an offline install nor an uncatalogued provider produces a false warning, the image tier is offered only vision-capable models, and save warns without ever blocking. Switching from a cloud LLM provider back to a local one no longer disables the router or leaves it pinned to the cloud provider's tier profile — onboarding now remembers a per-provider profile and restores it on return, while install-wide router settings stay global and credentials are never copied. Gateway boot and `agentos doctor` warn when the bundled Control UI is older than the frontend sources in a checkout, advisory only and never gating readiness. | | 2026.8.6 | v2026.8.6 | 2026-08-06 | A cron release: schedules can now run scripts, and the run history is finally readable. `--job-kind script` makes the script the job — stdout delivered verbatim, empty stdout a silent tick, non-zero exit a failed job — while `--job-kind agent_turn --script` runs the script first as a collector and skips the turn entirely when it prints nothing or ends with `{"wakeAgent": false}`, before the session is touched. Scripts resolve inside `~/.agentos/scripts/` with no escape via absolute paths, `~`, `..`, or symlinks, and are exec'd as argv. The new bundled `cron-watchers` skill ships the three watchers everyone writes first (RSS/Atom, JSON endpoint, GitHub repo). Around that, the surface that reports what a job did was rebuilt: run output is stored whole instead of clipped at 500 chars (`agentos cron output`, `cron.runOutput`, and lazy fetch in the Web UI), a script job's output no longer vanishes into delivery skips written for agent turns, the "→ Chat" button is hidden when no chat exists rather than leading to "Could not load chat history", and the session reaper stops missing expired sessions on a busy store because `list_sessions()` only returned the 100 most recent. A bad delivery target is refused at save time — a session key is not a Telegram chat id — with a dropdown of paired chats offered instead of free text, the failure reason lands on the run record, and `structlog` events (every `delivery.*` warning among them) finally reach `debug.log`. Cron's tool refusals reach the model as messages it can self-correct from instead of "received an invalid argument". `/reset` now clears the conversation on screen on both web and CLI. `senior-unilp-manager` gains `create-pool` for hook-less v4 pools — hooks pinned to `address(0)`, dynamic fees refused, odd tiers gated, and the uncorrectable starting price printed three ways before confirm — plus `tick --alert-only`, which lets a healthy ratchet cron stay quiet without silencing `NEEDS_ATTENTION`. | | 2026.8.5 | v2026.8.5 | 2026-08-05 | A cron-reliability and web-UI release. A cron job no longer fails forever once the chat it was created from is gone: the web UI stamps `originSessionKey` onto every reminder job while forcing its target to `isolated`, and "New Chat" mints a session key client-side with no row, so a reminder created before the first message pointed at a session that never existed — the fire-time mirror then raised `KeyError: Session not found`, surfaced as `forward_failed`, and failed the run with no `best_effort` checkbox rendered for the `none` delivery mode it ran under. The mirror is opportunistic now and reports a distinct `origin_gone` status; genuine channel delivery failures still fail the run. Unknown cron tool profiles are rejected at write time instead of dying ~50 ms into every firing until the scheduler auto-paused the job — `normalize_tool_profile` raises listing the profiles that exist, the read direction stays tolerant so already-broken rows can still be listed and deleted, and the tool schema now names the valid profiles. In the web UI, cron cards stop spilling over the neighbouring column (an unbreakable session key has no break opportunity per UAX-14, and three boxes between the grid track and the text could not shrink), and a job's ID — the handle every `agentos cron …` command takes — is finally visible, shortened with a copy button. The Skills page gains `Use` / `Use in chat` buttons that pre-fill the chat composer with `use skill ` instead of making the operator retype it. `senior-unilp-manager` can arm an unattended take-profit ratchet on a one-sided Uniswap v4 position: at milestones measured against the original principal it exits, keeps the converted side as realized profit, and redeploys the remainder into a narrower range in a single `modifyLiquidities` (DECREASE → BURN → MINT → TAKE_PAIR, no SETTLE), authorized by an object the CLI structurally cannot construct. One live mandate per position is now enforced by scan, since `mandate_id` hashes the label and two labels armed two mandates to burn the same NFT. The combined unlock has not been rehearsed against a hooked pool; SKILL.md requires a dust rehearsal first. | | 2026.8.3 | v2026.8.3 | 2026-08-03 | A packaging, skills, and upgrade-path release. `agentos upgrade` now installs the published release instead of delegating to `uv tool upgrade`, which re-resolved uv's *directory* receipt on checkout-backed installs and re-packaged whatever `static/dist/` was on disk — so Python moved forward while the web UI silently did not; installing a checkout stays with `scripts/install_source.sh`, the only path that rebuilds the bundle first. A `pip install use-agent-os` no longer resolves open-ended: bounds now cover the rest of the base runtime and the consumer-facing extras, each cap at the first release its upstream may break in — the next major for a `>=1.0` project, the next **minor** for a `0.x` one — recomputed from `uv.lock` by `tests/test_packaging/test_pyproject_invariants.py` so a new dependency cannot ship unbounded by accident (#153). Shipped Pilot Router tier defaults resolved against static tables with no entry for them and both tables fail open without logging, so `glm-4.7-flashx` estimated at a generic $3/$15 and seven ids — including `anthropic/claude-opus-5` — sized turns against generic limits; every tier default now carries an explicit pricing and catalog entry (#139). OpenCAP cost estimates no longer fall back to Bankr's rate sheet for the life of a process after one failed boot fetch — the price cache refreshes on a TTL, and a static-table estimate is logged once per model. Seven GMGN trading skills ship bundled under the new **Trading** category, driving the third-party `gmgn-cli` that AgentOS does not redistribute. A hub install can no longer silently shadow a bundled skill, `skill_search_community` answers with an `installed_match` block naming what a local skill is missing, and `skill_view(name="agentos", section="Skills")` resolves. Durable memory redaction moves onto the shared scanner (forced, since `AGENTOS_REDACT_SECRETS=0` is an egress-only escape hatch), which also learned the `ASIA`/`ABIA`/`ACCA` AWS prefixes and quoted `Authorization`/`x-api-key` headers. | diff --git a/install.ps1 b/install.ps1 index c5b117a6..667a55c1 100644 --- a/install.ps1 +++ b/install.ps1 @@ -12,7 +12,7 @@ param( Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' -$defaultVersion = 'v2026.8.6' +$defaultVersion = 'v2026.8.7' $repoSlug = if ($env:AGENTOS_REPOSITORY) { $env:AGENTOS_REPOSITORY } else { 'use-agent-os/agent-os' } $pythonVersion = if ($env:AGENTOS_PYTHON_VERSION) { $env:AGENTOS_PYTHON_VERSION } else { '3.12' } $originalPath = if ($env:Path) { $env:Path } else { '' } diff --git a/install.sh b/install.sh index 59c5109b..b1a33815 100755 --- a/install.sh +++ b/install.sh @@ -7,7 +7,7 @@ set -euo pipefail -default_version="v2026.8.6" +default_version="v2026.8.7" repo_slug="${AGENTOS_REPOSITORY:-use-agent-os/agent-os}" python_version="${AGENTOS_PYTHON_VERSION:-3.12}" original_path="${PATH:-}" @@ -18,10 +18,10 @@ cli_extras="" usage() { cat < None: diff --git a/tests/test_release_consistency.py b/tests/test_release_consistency.py index 199cec6e..14f3d947 100644 --- a/tests/test_release_consistency.py +++ b/tests/test_release_consistency.py @@ -3,7 +3,7 @@ import tomllib from pathlib import Path -CURRENT_VERSION = "2026.8.6" +CURRENT_VERSION = "2026.8.7" CURRENT_TAG = f"v{CURRENT_VERSION}" PREVIEW_VERSION = "0.0.1rc1" PREVIEW_TAG = f"v{PREVIEW_VERSION}" diff --git a/uv.lock b/uv.lock index a467914b..1ae9984b 100644 --- a/uv.lock +++ b/uv.lock @@ -3721,7 +3721,7 @@ wheels = [ [[package]] name = "use-agent-os" -version = "2026.8.6" +version = "2026.8.7" source = { editable = "." } dependencies = [ { name = "aiosqlite" },