Repository navigation
[1/8] chore: CI on every PR and test fixture cleanup - #249
Merged
Merged
Conversation
Co-authored-by: Amp <amp@ampcode.com> Amp-Thread-ID: https://ampcode.com/threads/T-01a0eb91-5e79-775e-975e-b85e2ac49ab6 (cherry picked from commit 7f68ac3)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> (cherry picked from commit 758d0bc)
The returned impl Iterator is already must_use, so clippy's double_must_use rejected it. (provider.rs part of commit 8397424) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
…e removal - scripts/gen_providers_doc.py: the `provider_name` module no longer exists; the docstrings and the section-header guard now name only `provider`. `--check` output is unchanged. - docs/internal/phase4-audit.md: add a follow-up note (same style as RFC-0020) so the historical audit no longer reads as if the generated ProviderName types and their drift tests still exist. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS (cherry picked from commit dfcd54f)
The A2 line said Node would keep a generated string-literal union for completion. It does not: overlay-registered provider names can never be part of a compile-time union, so keeping one would keep the second name path this PR removes. Record the actual A2 scope. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS (cherry picked from commit 3e2d9fc)
Pull requests into a branch other than master got no CI, so a stacked PR could not show it was green against the PR below it. The pull_request trigger now has no branch filter. A new push to a PR cancels that PR's run still in progress; pushes to master are never cancelled. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
…that pin Rust-only behaviour The V4 migration that follows replaces these tests with tests ported from the AI SDK. They are deleted first, on their own, so the PRs after this one show only code changes. This commit removes only test files (Rust, the seven bindings, the shared contract fixtures and their Node runner) and the CI steps that ran the contract fixtures. No library code changes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Amp-Thread-ID: https://ampcode.com/threads/T-01a0eb91-5e79-775e-975e-b85e2ac49ab6 Co-authored-by: Amp <amp@ampcode.com> (cherry picked from commit dc1cd14)
…ia alias - Wire*.ts were hand-maintained mirrors of wire.rs and had already drifted (WireContentPart lacked provider_executed). Derive TS on the wire structs and export them to web/src/types/generated/ through gen_ts_types.py, which now handles two targets and checks both in CI. - Core types resolve through the @aimux/types tsconfig alias instead of five-level relative paths into bindings/node. - gen_ts_types.py sync no longer rewrites files that differ only by ts-rs end-of-line spaces. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> (cherry picked from commit 69c1351)
- Drop the redundant #[must_use] on provider_names(); the returned impl Iterator is already must_use, so clippy::double_must_use failed CI. - Gate the wire types' ts-rs export tests behind a ts-export feature that only gen_ts_types.py enables. A plain cargo test previously wrote Wire*.ts into bindings/node/src/types via the workspace-wide TS_RS_EXPORT_DIR, which made gen_ts_types.py --check fail on stale files. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> (cherry picked from commit 8397424)
This was referenced Oct 12, 2026
cunninghamcard-bit
marked this pull request as ready for review
October 12, 2026 11:09
fixtures/aisdk/VERSIONS.json lists the seven AI SDK packages that the
upstream comparison tests are pinned to: ai 7.0.127, @ai-sdk/provider
4.0.21, @ai-sdk/provider-utils 5.0.53, @ai-sdk/anthropic 4.0.71,
@ai-sdk/google 4.0.87, @ai-sdk/openai 4.0.83 and
@ai-sdk/openai-compatible 3.0.62.
Every entry has one shape, {"version": "<x.y.z>", "integrity":
"sha512-<base64>"}, where integrity is the sha512 SRI of the npm tarball
(the registry's dist.integrity). A bare version string is not a valid
entry. The file used to arrive later in the stack, together with the
provider factories, as bare version strings; it comes first now so that
every later change can be checked against the pinned upstream sources.
Ported from fork commit 9d7508c.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
scripts/fetch-aisdk.sh downloads every package pinned in
fixtures/aisdk/VERSIONS.json with npm pack and unpacks it into
target/aisdk/<package>@<version>/, so the upstream sources that the
comparison tests follow can be read locally at exactly the pinned
versions.
- The whole VERSIONS.json is checked before anything is downloaded:
every entry must be {"version", "integrity": "sha512-..."}, with a
plain npm package name (it becomes a path) and an exact version.
- Each tarball's sha512 must equal the pinned integrity, and its
package.json must name the pinned package and version.
- A package is unpacked into a work directory under target/aisdk and
renamed into place only after its checks pass, so a failure never
leaves a partial tree. A rerun replaces each tree with identical
content.
AISDK_VERSIONS and AISDK_DEST override the input file and the
destination. scripts/fetch-aisdk.test.mjs (node --test) runs the script
against an npm registry served from the test process, with a temporary
npm cache and empty npm config files, so it needs no network.
Ported from fork commit 19db928. Unlike the fork, a bare version string
or a missing integrity is an error instead of a fallback to npm view,
because VERSIONS.json has a single format.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
scripts/fetch-aisdk.sh now verifies every package before it places any. Phase 1 fetches, checks and unpacks all packages into a staging directory; phase 2 moves the old trees aside, places the new ones and puts the old ones back if a move fails. A network error, a missing version or an integrity or version mismatch in any package leaves target/aisdk exactly as it was. The new test "a failing package leaves every destination as it was" fails on the per-package version. scripts/aisdk-fixtures/versions.mjs is what the fixture recorder uses to read and rewrite fixtures/aisdk/VERSIONS.json: - readVersions / checkVersions accept only the object form, with the same name, version and sha512 checks as fetch-aisdk.sh. - versionsDocument keeps the pinned integrity when the version is unchanged, takes it from package-lock.json when the lock pins the same version, and fails when neither has it or when the two disagree. It never writes an entry without integrity. versions.test.mjs (node --test) covers this and checks the committed VERSIONS.json. Its lockfile comparison is skipped until scripts/aisdk-fixtures/package-lock.json exists. Ported from fork commits ed1564b and 1ce4eb6. Unlike the fork, versionsDocument fails instead of writing a version-only entry, because VERSIONS.json has a single format. The recorder (record.mjs) is not part of this change; it switches to versionsDocument when it is added. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
This was referenced Oct 13, 2026
Merged
Replace the integration-branch atomic cutover in the alignment document (header, section 0.4 Q3, D31, the section 0.7 ABI row, section 9.1 and appendix I1) with layer-by-layer merges into master. Each layer is CI-green with all its consumers updated, and nothing is released from master until every layer is merged and the P2 gates pass; fixes for released versions ship from a maintenance branch. The new C ABI, codegen, the full recording schema 3 and the binding migration come last, before the release. Until then the existing C constructors keep their signatures and call the new factories, and ts-rs stays as the interim generator (section 0.5 and the Part 2 generator note). The Part 2 implementation order moves codegen, the new C ABI and the full recording schema to the end. ROADMAP defers the ops protocol schema and L0 passthrough until after the migration and stops fixing C1 at nine exports. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Remove designs from the alignment document that were never implemented and are no longer planned: - LanguageModelRef, ResolvedModel and RegistryModelReference. Model references follow upstream: an operation takes a string model ID, resolved through a registry, or a model instance; named methods come from the registration's extensions. The recording target keeps the string ID, and live replay asks for an explicit target when there is none. - Registered sidecar metadata and its propagation through resolution, scope and wrap. Trace metadata comes from an explicit audit family or an injected descriptor index, and catalogue joins use explicit package/model links. - The SessionInferer trait and registration API. Session inference keeps the existing opt-in prefix implementation in aimux. - Session affinity middleware. Callers pass session headers per request through headers, as RFC-0019 describes. Section 1.2 rulings and the appendix entry that pointed at these designs now state what aimux does instead. The size and performance gates (S1-S3, P, the CLI budget) and the capability matrix move out of the alignment document to ROADMAP as work after the migration. Their thresholds wait for the rewrite of #208 (RFC-0038); until then each migration layer's PR lists artifact sizes before and after. Section 9.1 gains a known-gaps list of the agreed designs the migration layers do not implement, one line each. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Cargo.toml configures [profile.release] with fat LTO (lto = true), codegen-units = 1, and opt-level = "z" so published FFI binaries stay small. In CI, 11 test-only jobs (Java, Kotlin, Go, Python, Flutter, Android example, contract tests, Swift) were running full fat-LTO release builds from scratch even though they upload no release artifacts, while writing separate 275 MB cache entries per job and exceeding GitHub's 10 GB repository cache quota. - Skip fat LTO and -Oz in test-only jobs via top-level CARGO_PROFILE_* overrides, while keeping Cargo.toml's full release profile (lto = true, codegen-units = 1, opt-level = "z") on node-binding and ffi-build so uploaded release artifacts keep their exact sizes. - Strip debug symbols from dev/test profiles (CARGO_PROFILE_DEV_DEBUG=0, CARGO_PROFILE_TEST_DEBUG=0) to speed up linking the 162 integration test binaries. - Build only the cdylib target (cargo rustc --crate-type cdylib) in jobs that only link the shared library, avoiding archiving a redundant staticlib. - Enable cache-all-crates on Swatinem/rust-cache and share a single "ffi-test" cache key across the FFI test jobs to reduce cache churn. - Replace `cargo install cargo-ndk` (source build) with taiki-e/install-action@v2 and enable Flutter/Gradle/npm/pip caches. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…caches Fixes on top of the previous commit: - node-binding builds with `napi build` without `--release`, so its uploaded node-* artifacts are dev-profile builds. The workflow-level CARGO_PROFILE_DEV_DEBUG=0 stripped their debug info (Linux artifact 55.3 MB -> 17.6 MB) and its CARGO_PROFILE_RELEASE_* overrides had no effect. Debug info is now dropped in rust-test only, where the test binaries are linked, and the dead overrides are gone. - ffi-build goes back to `cargo build`, as release.yml does. Building only the cdylib changes the shipped library (x86_64 Linux .so 9,446,848 -> 7,637,144 bytes, same 129 exports), so the ffi-* artifacts would no longer match the release build or earlier runs. - rust-cache `cache-all-crates` keeps unused registry crates, it does not cache workspace crates; dropped. Caches are saved from master only (`save-if`); pull requests restore master's caches instead of each writing their own, which is what pushed the repository past 10 GB. - The two node-binding legs on each runner OS (x64 and arm64 targets) shared one cache key: one leg failed to save and the other restored a cache built for the wrong target. The key now includes the target. - CARGO_INCREMENTAL=0 is already set by rust-cache; dropped. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112xDERMUyD5JALkFhnsdWS
With every stacked pull request running CI, runs wait far longer for a runner than they spend building: each run had 6 macOS jobs against a 5-job macOS limit and 18 Linux jobs against a 20-job total limit, and the macOS jobs of one run sat queued for 15 minutes. - Java (JDK 8, 11, 17, 21) and Kotlin (JDK 17, 21) run in one job that builds the FFI library once and runs each JDK in turn: 6 jobs and 6 FFI builds become 1. - The Go binding is tested in the ffi-build legs on Linux and macOS, against the static archive that job already builds: the 2 Go jobs and their FFI builds go away. - The x86_64 macOS Node binding is cross-built on Apple Silicon and tested with x64 Node under Rosetta instead of on the Intel runner, where its build took 371 of the job's 465 seconds. - scripts/build-ios-xcframework.sh builds both iOS slices in one cargo invocation, so they compile in parallel; the output is unchanged. A run goes from 24 jobs (6 macOS) to 17 (5 macOS). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112xDERMUyD5JALkFhnsdWS
… and secret redaction (#248), RFC-0033 to RFC-0043 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
The console imports the core types from bindings/node/src/types through @aimux/types. gen_ts_types.py --check only compares the generated files, so a renamed or removed Rust type regenerates cleanly and leaves a dangling import that no pull request check catches. RFC-0036 §13.1 A4 asks for every import to be type-checked. A new "Web console typecheck" job runs `npm ci && npm run typecheck` (vue-tsc --noEmit) in tools/aimux-web/web. It runs when the shared code changes (which includes tools/aimux-web and the Rust crates whose types are generated) or when bindings/node changes, where the generated types live; documentation-only changes skip it. "CI result" checks it. Removing bindings/node/src/types/Recording.ts locally makes it fail on the two files that import it. RFC-0029 §9.1 gets a later-change note: the console no longer has its own copies, and TS_RS_EXPORT_DIR no longer points at the web directory. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
…, Bedrock SigV4 and secret redaction (#248), roadmap status (#205), RFC-0033, RFC-0036 §12-§14, RFC-0039 to RFC-0043 The CI speed-up branch below this one has master merged in, so this brings in master as well. ROADMAP.md §4 conflicted: master rewrote it as "近期入口与依赖门" (#205), and this branch had annotated the old item 2 (S1 + S2) as deferred. The merge takes master's section as written; the size and performance gates are reconciled with RFC-0043 in the next commit. .github/workflows/ci.yml: the contract-tests and swift-contract-tests jobs keep the "changes" gate and the master-only cache saving from below, with this branch's steps (generator drift checks only; the Rust, Node and Swift contract tests were removed here). The comments in the "changes" job now use the jobs' new names. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
#208 is merged as RFC-0043, which sets the gates without waiting for the migration, and master's ROADMAP §4 (#205) lists S1 / S2 / P as near term. This branch had deferred them until the migration was done and until #208 was rewritten. S1, S2, S3 and P are no longer marked as deferred in ROADMAP §2 and §3, the alignment doc §0.7 puts them back in the unaffected row with a pointer to RFC-0043, and the list of the maintainer's RFC drafts names RFC-0043 instead of RFC-0038. Each migration layer's PR still lists artifact sizes before and after; the 0.9 capability matrix stays after the migration. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
…rged RFCs #207 merged RFC-0036 §12-§14 and asks that the alignment doc's matching section be updated with this first layer and link back to the §12.2 replacement table. §0.7 now links RFC-0036 §12.2 in both places that cited "#207 §12.2", and links the topic RFCs, all of them now merged (RFC-0033, RFC-0036 §12-§14, RFC-0039 to RFC-0043). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
scripts/fetch-aisdk.test.mjs and scripts/aisdk-fixtures/versions.test.mjs ran nowhere. Both are offline: the fetch test serves its own registry on 127.0.0.1, and the versions test reads local JSON. They now run in the generator drift job, which already runs for every code change. The lock-file test skips until scripts/aisdk-fixtures/package-lock.json exists and then holds the lock to VERSIONS.json. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
RFC-0011, RFC-0013, RFC-0016 and RFC-0035 still pointed at contract-tests/fixtures/wire-format.json, tool-call-repair.json and the binding contract tests this layer deletes. Each gets a 后续变更 line saying what no longer applies and what pins wire behaviour now, and the changelog gets a Removed entry for the retired fixtures. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
aimux-core's #[ts(export)] derives are not feature-gated, and TS_RS_EXPORT_DIR points at bindings/node/src/types/, so a plain cargo test rewrites that tracked directory. scripts/gen_ts_types.py is the source of truth; the debt goes away when ts-rs retires with D8. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
10 of 12 tasks
The only conflict was scripts/gen_ts_types.py. It keeps #247's multi-target structure (TARGETS, per-target sync and check) and drops the EXCLUDED set and manifest's exclude parameter: #246 deletes bindings/node/src/types/ProviderName.ts, so nothing is left to exclude. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
aimux-core's #[ts(export)] attributes were ungated, so every plain cargo test rewrote bindings/node/src/types through the TS_RS_EXPORT_DIR in .cargo/config.toml. aimux-core now has the same ts-export feature as tools/aimux-web (tools/aimux-web/Cargo.toml:21-23), and each of its 158 exports is #[cfg_attr(feature = "ts-export", ts(export))]. scripts/gen_ts_types.py enables the feature for the core target, and --check also fails on any ts(export attribute outside that gate in either crate's source, printing file:line. The .cargo/config.toml comment and the web README now say that cargo test writes nothing and the generator is the only writer. gen_ts_types.py --check passes: 159 node files and 8 web files are unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Stacks the series on #247 (which carries #246): aimux-core's ts-rs exports run only under the ts-export feature that scripts/gen_ts_types.py enables, and the generated ProviderName types are gone. Each later layer gates the exports it adds in its own merge, so no layer leaves an ungated export. Resolution: scripts/local-ci.sh keeps this layer's version without the retired contract section; CHANGELOG keeps both sides, the ts-rs entry as a Fixed section before Removed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Brings in #266 (a blank key on a custom base URL is sent as an empty key, as the AI SDK does for apiKey: ''). Resolution: no conflicts. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Brings in #266 (a blank key on a custom base URL is sent as an empty key, as the AI SDK does for apiKey: ''). Resolution: no conflicts. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
Brings in #266 (a blank key on a custom base URL is sent as an empty key, as the AI SDK does for apiKey: ''). Resolution: no conflicts. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
cunninghamcard-bit
changed the base branch from
ci/optimize-ci-speed-and-cache
to
refactor/generate-web-wire-types-with-ts-rs
October 16, 2026 11:03
Contributor
Author
|
这次更新:本层合入了 #247(含 #246,c5255255),所以 PR 的基改成 #247 的分支。
Generated by Claude Code |
The fetch test pointed npm's user and global config at the same empty
file. npm refuses that ("double-loading config ... as global, previously
loaded as user") and exits before any request, so on CI every test that
downloads failed with "npm pack failed". It passed in the cloud only
because the environment's NPM_CONFIG_USERCONFIG overrode the test's own
setting.
The test now writes two files, and drops inherited npm_config_* variables
in any case before setting its own, so it runs the same everywhere.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3WxDBWBA4ituJjXsHaEAa
eric8810
changed the base branch from
refactor/generate-web-wire-types-with-ts-rs
to
master
October 17, 2026 01:25
eric8810
added a commit
that referenced
this pull request
Oct 17, 2026
master 带入 #249 的 squash;两个冲突文件取本分支版本 (对齐文档含本层 §0.7 增量;VERSIONS.json 为本层的 provider-utils 5.0.55 升级)。
9 of 12 tasks
This was referenced Oct 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by li
Summary
Before: The shared contract fixtures and several hand-written tests record Rust's own pre-alignment output rather than real data. Nothing pins which AI SDK package versions the alignment work compares against, and the alignment document still plans one atomic cutover through an integration branch.
After: The self-generated fixtures and the tests that pin Rust-only behaviour are deleted. Two of the deleted files come back later in a form that compiles against the new types: PR 6 restores the upstream-translated Anthropic and Bedrock remaining cases, and PR 4 ports upstream's stream timeout tests in place of the old timeout matrix.
fixtures/aisdk/VERSIONS.jsonpins every AI SDK package the later PRs compare against, with its npm sha512 integrity, andscripts/fetch-aisdk.shfetches exactly those sources intotarget/aisdk, verifying all of them before placing any. The alignment document now says the migration lands on master layer by layer, each layer CI-green, with no release until every layer is in.This is the first of eight stacked PRs that migrate aimux to the AI SDK V4 types and provider packages. It deletes first, on its own, so the PRs after it show only code changes. It is based on master, which now has #262 (CI runs on every pull request, so every PR in the series gets checks, and a PR's superseded runs are cancelled), #246 and #247.
Type of change
Checklist
cargo fmt --all -- --checkpassescargo clippy --workspace --all-targets -- -D warningspassescargo test --workspacepasses (cassette playback — no network/keys)README.md,docs/,rfc/,bindings/README.md)Notes for reviewers
Before the series (in this order):
fix/bedrock-sigv4-signing-and-secret-redactionci/optimize-ci-speed-and-cacherefactor/remove-generated-provider-name-typesProviderNameunion; mergedrefactor/generate-web-wire-types-with-ts-rsSeries (each PR targets the one below it; after a merge the next one is retargeted to master):
v4/1-ci-on-every-pr-and-test-fixture-cleanupv4/2-tool-calls-follow-the-ai-sdkv4/3-messages-and-content-follow-the-ai-sdkv4/4-results-and-streams-follow-the-ai-sdkv4/5-providers-are-ai-sdk-factoriesv4/6-vendors-follow-the-upstream-packagesv4/7-remaining-upstream-model-kindsv4/8-public-json-equals-the-ai-sdk-jsonfixtures/aisdk/VERSIONS.jsonhas one form,{"<package>": {"version", "integrity"}}, both required. The script tests run withnode --test scripts/fetch-aisdk.test.mjs scripts/aisdk-fixtures/versions.test.mjs(they need no network); one of them compares against the fixture recorder's lockfile and is skipped until PR 5 adds the recorder.LanguageModelRef/ResolvedModel/RegistryModelReference), no registered sidecar metadata, noSessionInferertrait, no session affinity middleware. The size and performance gates, CLI budget and capability matrix move to ROADMAP until the budgets RFC is rewritten, and §9.1 lists the known gaps left for after the migration.ffi-x86_64-unknown-linux-gnuffi-aarch64-apple-darwinffi-x86_64-pc-windows-msvcnode-x86_64-unknown-linux-gnunode-aarch64-unknown-linux-gnunode-aarch64-apple-darwinnode-x86_64-apple-darwinnode-x86_64-pc-windows-msvcnode-aarch64-pc-windows-msvc