Skip to content

chore(release): cut amplifier-agent 0.13.0 and amplifier-agent-ts 0.7.1 - #131

Merged
David Koleczek (DavidKoleczek) merged 1 commit into
mainfrom
chore/release-0.13.0
Aug 18, 2026
Merged

chore(release): cut amplifier-agent 0.13.0 and amplifier-agent-ts 0.7.1#131
David Koleczek (DavidKoleczek) merged 1 commit into
mainfrom
chore/release-0.13.0

Conversation

@DavidKoleczek

Copy link
Copy Markdown
Collaborator

Coordinated release of two independently-versioned artifacts from this repo.

Artifact Version Tag to push after merge Publishes to
amplifier-agent (engine + CLI) 0.12.0 -> 0.13.0 v0.13.0 PyPI + GitHub Release
amplifier-agent-ts (TS SDK) 0.7.0 -> 0.7.1 wrapper-v0.7.1 npm + GitHub Release

amplifier-agent-py is not released here. Its only diff since v0.12.0 is deleted tests; the source has not moved, and PyPI trusted-publisher setup for that package is not in place yet. It stays at 0.3.0 with zero py-v* tags.

What changes for users

Engine 0.13.0 (minor: new capability)

Two providers are now pre-wired in bundle.md and accepted as provider.module values in host config:

  • openai-chatgpt backs onto a ChatGPT Plus/Pro/Team subscription rather than a per-token API key, talking to the ChatGPT backend (Codex API). Auth is OAuth device-code, driven by the provider module at mount time and cached to ~/.amplifier/openai-chatgpt-oauth.json. auth set openai-chatgpt is refused, as with github-copilot, because there is no static key to store.
  • chat-completions integrates any server speaking the OpenAI Chat Completions wire format (llama.cpp, vLLM, LM Studio, LocalAI, SGLang, TGI), distinct from openai, which uses the Responses API. Its credential is an endpoint, not a key: CHAT_COMPLETIONS_BASE_URL is required and CHAT_COMPLETIONS_API_KEY is sent only when set, since local servers commonly need none.

Native Windows was unusable and is fixed on three counts, each of which independently killed the CLI:

  • An unconditional fcntl import in migration.py sat on the eager import path, so every command failed with ModuleNotFoundError, --version included. It is now imported optionally, and amplifier-agent migrate exits 1 with a migration-unsupported error rather than locking as a no-op, because the migrations move user data and re-check preconditions under the lock.
  • An unguarded os.setsid/os.getsid in the run callback raised AttributeError before any engine code ran. Now gated on hasattr. This does not give Windows an equivalent containment guarantee, and the limitation is recorded in docs/spec/wrapper-contract.md rather than papered over.
  • Python selects the console code page for stdio, so a reply containing any character outside it crashed the final write, after the model call had already run and been billed. main() now reconfigures stdout/stderr to UTF-8. Not gated on platform: POSIX under LC_ALL=C PYTHONUTF8=0 fails identically.

Also user-visible: an installable agent skill (npx skills add microsoft/amplifier-agent) so a coding agent knows how to integrate the engine, and a documentation restructure into task-scoped guides over a new normative docs/spec/ layer.

TS SDK 0.7.1 (patch: fix only)

Transport.terminate() resolved on the child's 'close' event, whose precondition is EOF on stdout and stderr. Those pipe write-ends are inherited by every grandchild the engine spawns, so a single subprocess outliving its parent held them open, EOF never arrived, and terminate() hung for the lifetime of the orphan rather than the lifetime of the engine. 'exit' now also settles the promise, after a 250ms drain window that lets the reader finish the buffer before the stdio handles are destroyed. 'close' still wins the race for every well-behaved child, so frame-delivery ordering is unchanged; the window only bounds the pathological case.

Scope of impact

Coordinated across two components, but not a wire change. PROTOCOL_VERSION is unchanged at 0.3.0, so no wrapper/engine coordination is required and neither SDK will refuse the other's engine. The engine and TS SDK are versioned on their own merits here rather than in lockstep.

Editing bundle.md changes its hash, and that hash is part of the prepared-bundle cache key, so existing installs re-prepare on their next turn.

The amplifier-foundation git pin is unchanged; this is not a pin-consumption release.

Downstream: amplifier-app-opencode does not need a floor bump

MIN_AGENT_VERSION stays at 0.12.0. The floor is a requirement statement, not a mirror of the latest release, and nothing opencode depends on changed:

  • src/amplifier_agent_http/ has zero changes in this range.
  • GET /v1/models, /v1/skills, /v1/modes are unchanged. The resources.py diff is pyright suppression comments only.
  • provider_sources.py and config/loader.py changes are purely additive: two catalog entries, two credential-resolution branches, two accepted module names.
  • The run stdout envelope, the serve endpoint contract, and --host-config handling are unchanged.

A floor bump forces every opencode user through a reinstall, so raising it for an engine change opencode cannot observe has a real cost and no benefit. The new providers are available to opencode users who configure them without the floor moving.

amplifier-app-paperclip and amplifier-app-nanoclaw caret-pin amplifier-agent-ts, and 0.7.1 is a patch, so it propagates without action from either.

Verification

make verify passes clean:

verify-codegen   PASS  spec.md + 32 schemas match generator output
verify-wheel     PASS  6/6 checks, incl. all 18 bundle/**/*.md ship in the wheel
verify-parity    PASS  9/9 conformance fixtures, Python and TS runners agree
verify-wrapper   PASS  20 files, 121 tests

tests/e2e/ is not covered by this run or by CI, since it requires a DTU.

Merging this publishes nothing

Publication is triggered by tag push, not by merge. After this merges, v0.13.0 and wrapper-v0.7.1 are pushed from the tip of main, and those tags are what trigger publish-python.yml, publish-wrapper.yml, and release-notes.yml. Git is the supported install channel for the engine, so the GitHub Release created by the tag is what users actually receive.

A coordinated release of two independently-versioned artifacts. The wire
protocol is unchanged at 0.3.0, so the two are versioned on their own
merits rather than in lockstep.

amplifier-agent 0.12.0 -> 0.13.0 (minor: new capability)

  Two providers are pre-wired in bundle.md and accepted as host-config
  provider.module values: openai-chatgpt, which uses a ChatGPT
  subscription via OAuth device-code instead of an API key, and
  chat-completions, which reaches any server speaking the OpenAI Chat
  Completions wire format. Both are additive.

  Native Windows was unusable and is now fixed on three counts: an
  unconditional fcntl import took down every CLI command including
  --version, an unguarded os.setsid killed every run before it reached
  engine code, and stdio defaulting to the console code page crashed the
  final write of a reply that had already been generated and billed.

amplifier-agent-ts 0.7.0 -> 0.7.1 (patch: fix only)

  Transport.terminate() waited on the child's 'close' event, whose
  precondition is EOF on stdout and stderr. Those pipe write-ends are
  inherited by every grandchild, so one subprocess outliving the engine
  held them open and terminate() hung for the lifetime of the orphan.
  'exit' now also settles, after a 250ms drain window that preserves
  frame-delivery ordering for well-behaved children.

Editing bundle.md changes its hash, which is part of the prepared-bundle
cache key, so existing installs re-prepare on their next turn.

Co-Authored-By: Amplifier <amplifier@microsoft.com>
@DavidKoleczek
David Koleczek (DavidKoleczek) merged commit bfc8a77 into main Aug 18, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant