Skip to content

Releases: tchivs/agentsw

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 08 Oct 07:27

Added

  • use --small-model <id> fills the slot agents reach for cheap background work — Claude Code's
    ANTHROPIC_DEFAULT_HAIKU_MODEL and ANTHROPIC_SMALL_FAST_MODEL — and --no-small-model clears
    it again. Leaving it unset means "same as the default model", so an expensive default quietly
    became the background model too, and the only way to set the slot was add, which demands the
    endpoint and credential again. The id is validated against the provider's model list and a dry
    run previews it without saving, exactly as -m does.

  • Picking providers works the same way everywhere. --all and a comma-separated --provider a,b
    now mean the same thing on sync, discover and refresh; discover additionally takes its
    ids positionally (discover alpha beta) and falls back to the active provider when given none,
    where it used to require exactly one. Every id is resolved before the first request, so a typo
    fails before half a run is on disk, and each command keeps its own default for an omitted
    selection: the active provider for sync and discover, every provider for refresh.

    discover refreshes several providers with the same isolation sync has — an unreachable
    endpoint is reported and skipped, the rest still refresh, and the run exits non-zero — and
    discover --sync then writes only the providers that actually refreshed, never a stale list.

  • sync --all syncs every configured provider, and --provider now takes a comma-separated list
    (sync -p alpha,beta), so refreshing a machine's providers is one command instead of one per
    provider. The menu's Sync providers action is a multi-select with an "all" row; selecting
    nothing returns to the menu.

    Each provider is refreshed and written in turn, with the active provider last, so whatever
    "current" pointer an app keeps ends up where the store says it should. An app that names a single
    provider rather than a map — Claude Code's env block — is written once rather than once per
    provider: it receives the active provider when it supports that protocol, otherwise the single
    provider in the run that it does support, so an anthropic-only app is not starved by an openai
    active provider. When several candidates compete and the active provider is not among them the
    app keeps pointing where it already does, because syncing is not switching. A provider whose
    endpoint cannot be reached is reported and skipped; the rest still
    sync and the run exits non-zero. --json reports a providers array plus the deduplicated union
    of the files touched; a single-provider sync keeps the payload it had.

Changed

  • sync refreshes the provider's model list (and re-enriches saved metadata) before writing the
    agent configs, so one command keeps both sides in step; sync --no-refresh writes the saved
    list without fetching. The menu's separate model-list action and its "also sync?" toggle are
    gone — the single Sync a provider action runs the same refresh-then-write path as the CLI.

Fixed

  • A default or small model the endpoint has stopped listing is now named out loud. A refresh keeps
    such an id on purpose — one flaky listing must not delete the model a person chose — but keeping
    it also kept it out of removed, so the only trace was a dim yellow line between the refresh
    header and a model table that can run to dozens of rows, and --json carried no trace at all
    while sync went on writing that id into every agent config. This is exactly what an endpoint
    renaming a model looks like from the client side. It is still written, and now it is reported:
    a warning: naming the models and the agentsw use <id> -m <model> that replaces them, printed
    after discover's table and after sync's per-app results, plus refreshed.missing in the
    --json payload. The small model counts too, which it did not before.

  • sync --dry-run no longer saves the refreshed model list. The refresh above ran before the
    dry-run scope opened, so previewing a sync wrote the freshly fetched list straight into the
    provider store — the one thing --dry-run promises not to do. The fetch still happens, so the
    preview matches what a real sync would write, but the list now stays in memory and --json
    reports it as refreshed.saved: false.

Full Changelog: v0.10.2...v0.11.0

v0.10.2

Choose a tag to compare

@github-actions github-actions released this 03 Oct 17:26

Fixed

  • use, sync and prune no longer print a bare ok <app> line for an app that was already
    in sync. An empty change list was rendered as nothing at all, leaving a row of trailing
    whitespace that read as a truncated or failed result; it now says unchanged, which is what
    a repeated sync actually did.
  • Codex states the Responses requirement only when the endpoint has not declared itself
    Responses-compatible. The caveat was printed unconditionally, so a provider the user had
    already marked responses — where there is nothing to warn about — warned anyway, and a
    fully successful sync looked like it had a problem.
  • Syncing to a machine whose agent configs do not exist yet no longer prints a backup: … line
    when nothing was backed up. A transaction directory was created for every commit even when
    every planned file was new, so on a first run the output announced eight backups that held
    nothing but a manifest.

Full Changelog: v0.10.1...v0.10.2

v0.10.1

Choose a tag to compare

@github-actions github-actions released this 03 Oct 14:45

Fixed

  • A models.dev row that omits canonical_model_id no longer counts as a second creator identity.
    models.dev leaves the field unset on the creator's own rows and on some reseller rows too, so a
    single silent row made an id every other row agreed on report as ambiguous and kept it — and
    every model sharing its basename — without metadata. Those rows now make no claim; a group where
    nothing declares an identity is still held to its listing ids, and ids listed under genuinely
    different declared identities still stay unresolved.
  • A sync no longer deletes the limits an agent config already has for a model the store knows
    nothing about. Clearing an owned key the entry omits is only meaningful when the entry carries
    metadata at all — an id no catalog row matched arrives as a bare { id }, so the absence said
    nothing and the deletion threw away what an earlier lookup filled in (or a person typed) on
    every miss.
  • A failed AI Gateway request is retried once before falling back to the cache. The endpoint is
    reached over whatever route the machine has, where a cold handshake measures an order of
    magnitude slower than a warm one, so a stall or a reset is far likelier than a bad answer — and
    a single stall used to leave the run on stale metadata until the next successful fetch. Only
    the request is retried: a status, an oversize body or an unparseable catalog is the endpoint's
    answer, and a second request would only repeat it. AGENTSW_DEBUG=1 reports why an attempt
    failed (the user-facing warning stays generic), and AGENTSW_GATEWAY_TIMEOUT_MS overrides the
    15-second whole-request budget.

Full Changelog: v0.10.0...v0.10.1

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 03 Oct 12:56

Added

  • Global --json prints exactly one credential-free document per run
    ({"ok":true,"command":…,"version":…,"data":…}, or {"ok":false,…,"error":{"message":…}} with
    exit code 1) and disables prompts and progress, so scripted runs never block on input.
    --json --dry-run lists the file paths a run would touch without ever emitting the staged
    configuration. Without --json, models --provider <id> --metadata keeps its bare object.
  • Global --quiet suppresses progress, hints and warnings while keeping results and errors, and
    --no-color disables color (so does NO_COLOR; --no-color overrides FORCE_COLOR).
  • Slow operations report progress on a TTY: protocol probing, model-list pagination (page and
    running model count), catalog and metadata lookups, Gateway loading, and per-app version
    checks. The line animates only when nothing else is borrowing it and disappears before
    results print; pipes and CI keep the previous single static line, and AGENTSW_NO_PROGRESS=1
    turns it off.
  • discover/add/quick/import retry a failed discovery when interactive instead of losing
    the whole run, and a failing menu action reports the error and returns to the menu.
  • Menu provider pickers and the removal scope select gained a "back to main menu" entry, and
    Ctrl-C inside a menu prompt abandons that action instead of quitting the application.

Changed

  • Tables size themselves to the terminal: long BASE URL, CONFIG and NAME cells are truncated
    with … while IDs and status columns stay intact, and numeric columns are right-aligned.
    Piped output is unchanged.
  • Interactive cancellation is consistent: standalone prompts print cancelled and exit 130;
    inside the menu they return to the menu. Errors are red and warnings yellow everywhere, and
    the remaining hardcoded English strings follow the interface language.
  • apps and upgrade output, install hints and model-discovery messages are localized; every
    user-visible "next step" hint now goes to stderr so --quiet can drop it.

Fixed

  • A corrupt or unreadable models.dev cache no longer aborts models, add, discover or
    refresh: it is ignored and refetched, and a 200 response that is not catalog-shaped is
    rejected instead of being cached and failing every later run.
  • models --limit values that are not positive integers (--limit abc, --limit 0, ...)
    fail with a clear error instead of dumping the whole catalog or one row.
  • discover no longer reports a pinned default or small model that the provider stopped
    listing under "removed upstream" while keeping it anyway.
  • Switching providers no longer inherits the previous provider's model_reasoning_effort in
    Codex, and opencode clears a provider's own small model once that provider stops defining one.
  • The dsh adapter reads a wire declared on every model, as omp and pi already did, so such
    providers import instead of being skipped and keep their Responses wire on sync.
  • Claude Code and Codex now honor CLAUDE_CONFIG_DIR and CODEX_HOME; previously they always
    wrote ~/.claude and ~/.codex, so a relocated install was configured in the wrong place
    and status/remove/rename disagreed with use.
  • The opencode adapter edits the file that actually exists, chooses between opencode.json,
    opencode.jsonc and config.json the way opencode does, and preserves comments — rename
    previously migrated config.json only in the default directory.
  • A base URL whose path already ends in /models no longer becomes /models/v1/models, and
    model-list pagination stops after 100 pages instead of looping forever on an endpoint that
    keeps returning fresh cursors.
  • A provider store containing a wrong-typed provider or model is now rejected at load with the
    file and provider id, instead of crashing later with an opaque TypeError.

Changed

  • All config paths come from one resolver (src/app-paths.ts) and are recomputed per command,
    so every adapter, rename and remove agree on the same files; dsh also honors
    %LOCALAPPDATA% on Windows.

Full Changelog: v0.9.2...v0.10.0

v0.9.2

Choose a tag to compare

@github-actions github-actions released this 01 Oct 19:13

Fixed

  • Reseller model listings no longer lose their metadata. models.dev lists one model under many
    providers (29 rows for glm-5.2), each with its own provider-prefixed id, so a bare id taken from
    a reseller's /v1/models looked like dozens of conflicting models and was refused
    entirely — leaving pi/prime-agent configs without reasoning or thinkingLevelMap, i.e. no
    thinking level to adjust. Matching now groups rows by models.dev's canonical_model_id and
    takes the creator's own row, so context, output limits, reasoning and effort levels resolve;
    rows under genuinely different creator identities stay ambiguous, and Gateway agreement is
    compared in creator identity too.

  • Adding the same endpoint and API key under a different --id or display name no longer creates a
    second provider. Account identity (normalized endpoint + protocol + credential) now outranks an
    explicit id in add and quick-add, matching what import already did; the existing provider is
    updated and the run says so. Protocol suffixes still apply to genuinely new accounts.

  • Only the creator's own models.dev row supplies limits, prices and reasoning levels for a model that
    resellers also list. Gateways key their rows by the canonical model id and were being read as
    authoritative, so e.g. deepseek-v4.1-flash picked up a gateway's price.

  • Model tables, refresh and provider output are localized, and models left without metadata are
    split into ids an explicit --gateway-models mapping can fix, ids whose creator has no models.dev
    row (AI Gateway fills those), and ids no creator lists at all — instead of one flat count.

Full Changelog: v0.9.1...v0.9.2

v0.9.1

Choose a tag to compare

@github-actions github-actions released this 11 Sep 10:00

Changed

  • Example provider names, hosts and test fixtures no longer reference a real account.
    Git history, tags and the npm tarball were rewritten so the previous name appears nowhere
    in the repository or the published README.

Full Changelog: v0.9.0...v0.9.1

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 11 Sep 08:47

Added

  • Interactive menu app picker for use, sync and discover --sync: multi-select the agents
    to write, with an "all detected apps" row, detected agents listed first and undetected ones
    marked. The last selection is remembered in syncTargets, so the menu stops rewriting agents
    you left out; CLI --apps semantics are unchanged.

Changed

  • Report why a config file was rejected instead of hiding it: JSON/YAML/TOML parse failures now
    carry the file plus a position (YAML error code and line, JSON error offset, TOML line/column),
    and dry-run shows that detail rather than "configuration could not be previewed safely".
    Unclassified errors stay redacted wholesale.

Fixed

  • Never echo config source in parse errors. JSON, YAML and TOML parser messages quote the
    offending line, which can contain a credential; all three are now converted to
    content-free SafeConfigError messages.

Full Changelog: v0.8.0...v0.9.0

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 05 Sep 08:21

Added

  • Automatic AI Gateway model metadata supplementation with a separate 24-hour cache,
    exact model mappings, field-level provenance/conflicts and reference-only pricing.
  • Per-provider --metadata-mode <auto|on|off> settings in add/quick/discover/import/refresh,
    a three-way menu selection, and models --provider <id> --metadata for credential-free
    audit JSON including the effective mode. Legacy enable/disable flags remain supported.

Changed

  • Default to automatic, models.dev-first enrichment without extra onboarding prompts.
    Query Gateway only for missing core parameters, refreshing existing supplemental fields,
    or verifying tracked identity conflicts; preserve explicit off and all omitted saved settings.
  • Resolve unique, exact bare-name model IDs conservatively without changing wire IDs;
    ambiguous/custom names still require explicit aliases. Sync remains catalog-free.
  • Preserve manual/legacy model values and extension fields during enrichment;
    refresh tracked automatic metadata without overwriting subsequent manual edits.
  • Preserve selected default/small-model metadata when discovery omits those IDs.

Full Changelog: v0.7.2...v0.8.0

v0.7.2

Choose a tag to compare

@github-actions github-actions released this 05 Sep 06:25

Fixed

  • Stage every adapter's multi-file changes before committing, preserve permissions,
    create private unique backups, and reject stale provider-store saves under a
    shared short-lived write lock. Dry-run output is redacted and never writes.
  • Isolate generated credential references for distinct provider IDs; preserve
    shared/custom references, YAML aliases and complete multiline dotenv values.
  • Disambiguate WorkBuddy account removal, allow credentialless local entries,
    verify active Codex credentials before global deletion, and apply target-specific
    literal/reference semantics during rename and import.
  • Preserve existing options on repeated automatic onboarding, retain Responses
    routing and custom Codex fields, reject mixed effective model protocols, and
    maintain WorkBuddy endpoint paths and owned model lists across synchronization.
  • Fetch complete model-list pagination before updating the store, preserve query
    parameters when constructing requests, distinguish non-v1 API identities, and
    prefer complete model-ID metadata matches over basename fallbacks.
  • Keep help/version and agent-local management independent of malformed central
    configuration; validate selected targets before changing active-provider state.
  • Correct SemVer precedence, probe Windows batch shims correctly, propagate failed
    installer pipelines, and report unknown/failed version checks rather than success.

Changed

  • Minimum Node.js is now 22.13.0, where built-in SQLite no longer needs an
    experimental flag. CI includes the exact minimum and installed-package CLI
    smoke tests on Linux, macOS and Windows.
  • Expanded command, account-isolation, transaction, discovery, platform and metadata
    regressions; clarified backup scope, non-interactive import and adapter integration docs.

Full Changelog: v0.7.1...v0.7.2

v0.7.1

Choose a tag to compare

@github-actions github-actions released this 05 Sep 05:53

Changed

  • Interactive menu labels describe concrete actions, with contextual help for
    each choice in English and Simplified Chinese. Automatic provider setup is
    listed first; saved providers, agent configuration, syncing, and model-list
    updates are clearly distinguished.
  • Removal choices and confirmations explain what is deleted and what stays,
    including the effect of later syncing after agent-only removal. Rename is
    labeled as changing the provider ID, not a custom display name.
  • Rename and removal confirmations use explicit action labels and default to
    cancellation. Added bilingual menu and scope-confirmation regression tests.

Full Changelog: v0.7.0...v0.7.1