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
39 changes: 39 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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 `==<version>` — 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.
Expand Down
1 change: 1 addition & 0 deletions RELEASES.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <name>` 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. |
Expand Down
2 changes: 1 addition & 1 deletion install.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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 { '' }
Expand Down
6 changes: 3 additions & 3 deletions install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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:-}"
Expand All @@ -18,10 +18,10 @@ cli_extras=""

usage() {
cat <<HELP
Usage: bash install.sh [--version v2026.8.6|latest] [--profile recommended|core] [--extras name[,name]]
Usage: bash install.sh [--version v2026.8.7|latest] [--profile recommended|core] [--extras name[,name]]

Environment equivalents:
AGENTOS_VERSION=v2026.8.6
AGENTOS_VERSION=v2026.8.7
AGENTOS_INSTALL_PROFILE=recommended|core
AGENTOS_INSTALL_EXTRAS=document-extras
AGENTOS_INSTALL_DRY_RUN=1
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "use-agent-os"
version = "2026.8.6"
version = "2026.8.7"
description = "Token-Efficient AI agent with on-device Pilot Router"
license = "Apache-2.0"
license-files = ["LICENSE", "NOTICE", "THIRD_PARTY_NOTICES.md"]
Expand Down
2 changes: 1 addition & 1 deletion tests/test_install_scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
RELEASE_SH = ROOT / "install.sh"
SOURCE_PS1 = ROOT / "scripts" / "install_source.ps1"
SOURCE_SH = ROOT / "scripts" / "install_source.sh"
CURRENT_RELEASE_TAG = "v2026.8.6"
CURRENT_RELEASE_TAG = "v2026.8.7"


def test_source_install_scripts_force_refresh_local_uv_tool_package() -> None:
Expand Down
2 changes: 1 addition & 1 deletion tests/test_release_consistency.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading