diff --git a/.changeset/browser-async-method-identity.md b/.changeset/browser-async-method-identity.md new file mode 100644 index 0000000..502a1d9 --- /dev/null +++ b/.changeset/browser-async-method-identity.md @@ -0,0 +1,5 @@ +--- +"@mcp-b/do-runtime": patch +--- + +Preserve native async-method identity when lowering browser awaits. This lets the Agents SDK keep synchronous methods synchronous while starting a cold Agent before its async methods run; lowered continuations still restore browser async context. diff --git a/.changeset/october-workerd-sync.md b/.changeset/october-workerd-sync.md new file mode 100644 index 0000000..d0b1005 --- /dev/null +++ b/.changeset/october-workerd-sync.md @@ -0,0 +1,8 @@ +--- +"@mcp-b/do-runtime": minor +--- + +Align the runtime with workerd 1.20261002.1: allow multiple output-gate failure +observers, raise SQLite values to 8 MiB plus serialization padding, and support +chainable tracing span name and status updates. Pin the conformance oracle and +Workers types to the October 2 release. diff --git a/README.md b/README.md index f3080ac..99ca54e 100644 --- a/README.md +++ b/README.md @@ -241,7 +241,7 @@ Web Worker and supply the sqlite-wasm backend shown in the runnable examples. For a standalone TypeScript host, install the ambient Node and Workers types: ```bash -pnpm add -D typescript @types/node @cloudflare/workers-types@5.20260911.1 +pnpm add -D typescript @types/node @cloudflare/workers-types@5.20261002.1 ``` Use the following `tsconfig.json`. An existing Workers project can keep its @@ -490,7 +490,7 @@ The browser cannot reproduce every workerd facility. Unsupported runtime APIs th | SQL function allowlist | Not enforced. Workerd's authorizer denies any function outside its 138-name `ALLOWED_SQLITE_FUNCTIONS` list; this runtime allows every function the backend compiled, including build-detail readers such as `sqlite_version()` and `sqlite_source_id()`. | | SQLite internal functions and default expressions | The current engines lack workerd's internal-function and default-expression authorizer patches. Native authorizer callbacks exist in both engines, but the runtime does not wire them into its SQL policy. See the [engine findings](docs/workerd-sync.md#sqlite-engine-work-still-required). | | PRAGMA allowlist | Workerd's allowlist enforced from tokenized SQL text. A `pragma_*` table-valued function with a string or bound argument is authorized by pragma name only, where workerd's authorizer also sees the resolved argument; the pinned conformance row is the contract. | -| Node SQLite length limit | Bound and returned strings and blobs are capped at 4 MiB; `node:sqlite` cannot cap an unreturned SQL-computed value. The browser backend uses SQLite's native limit. | +| Node SQLite length limit | Bound and returned strings and blobs are capped at 8 MiB plus 34 bytes of serialization padding; `node:sqlite` cannot cap an unreturned SQL-computed value. The browser backend uses SQLite's native limit. | | Response BYOB readers | Refused; their continuation cannot be re-gated. Use a default reader or `arrayBuffer()`. | | Facet `setAlarm()` | Refused synchronously, where workerd breaks the actor asynchronously ([workerd#6810](https://github.com/cloudflare/workerd/issues/6810)). | | Alarm exception provenance | Unclassified handler failures stay retryable; browser errors lack jsg provenance. | @@ -558,7 +558,7 @@ it does not need a sibling checkout, SDK source aliases, or a local candidate archive. Publish a new source tag for each SDK change instead of replacing an existing release's assets. The runtime's npm release remains independent. -Change runtime behaviour with the corresponding workerd source open (line citations use release `v1.20260713.1`; the conformance oracle is pinned to `v1.20260911.1`). Ask the workerd lane an observable question before inventing a local rule; record any intentional divergence in the table above and in a conformance row. Keep host seams small and typed, keep gates internal, and keep product knowledge out of the port. See [`docs/decisions.md`](docs/decisions.md) for the invariants the code cites. +Change runtime behaviour with the corresponding workerd source open (line citations use release `v1.20260713.1`; the conformance oracle is pinned to `v1.20261002.1`). Ask the workerd lane an observable question before inventing a local rule; record any intentional divergence in the table above and in a conformance row. Keep host seams small and typed, keep gates internal, and keep product knowledge out of the port. See [`docs/decisions.md`](docs/decisions.md) for the invariants the code cites. ## Acknowledgements diff --git a/conformance/fixtures/probe.ts b/conformance/fixtures/probe.ts index a007ba8..dca081a 100644 --- a/conformance/fixtures/probe.ts +++ b/conformance/fixtures/probe.ts @@ -969,15 +969,16 @@ export class Probe extends DurableObject { }; } - /** Workerd caps every SQLite string or blob at 4 MiB. */ + /** ← workerd 1b9b6ea02: 8 MiB rows plus 34 bytes of serialization padding. */ sqliteLengthLimit(): Record { const sql = this.ctx.storage.sql; - const allowed = sql.exec("SELECT length(?) AS length", "x".repeat(4_000_000)).one(); + const allowed = sql.exec("SELECT length(?) AS length", "x".repeat(8_000_000)).one(); + const padded = sql.exec("SELECT length(?) AS length", new Uint8Array(8 * 1024 * 1024 + 34)).one(); try { - sql.exec("SELECT length(?)", new Uint8Array(4 * 1024 * 1024 + 1)); - return { allowed: allowed.length, tooBig: "allowed" }; + sql.exec("SELECT length(?)", new Uint8Array(8 * 1024 * 1024 + 35)); + return { allowed: allowed.length, padded: padded.length, tooBig: "allowed" }; } catch (error) { - return { allowed: allowed.length, tooBig: String(error) }; + return { allowed: allowed.length, padded: padded.length, tooBig: String(error) }; } } diff --git a/conformance/suite/module.spec.ts b/conformance/suite/module.spec.ts index dc30de5..b1e5547 100644 --- a/conformance/suite/module.spec.ts +++ b/conformance/suite/module.spec.ts @@ -51,3 +51,26 @@ it("§1.12 untraced spans expose chainable attributes and nested active scopes", return value + 1; }, 41)).toBe(42); }); + +it("§1.12 untraced spans support name and status updates, including after end", () => { + const span = tracing.startSpan("original"); + for (const ended of [false, true]) { + if (ended) span.end(); + expect(span.updateName("updated")).toBe(span); + for (const code of ["unset", "ok", "error"] as const) { + expect(span.setStatus({ code, message: "unrecorded" })).toBe(span); + } + let reads = 0; + expect(span.setStatus({ + get code() { + reads++; + return "ok" as const; + }, + })).toBe(span); + expect(reads).toBe(1); + expect(() => Reflect.apply(span.setStatus, span, [{ code: "invalid" }])).toThrow( + "Span status code must be 'unset', 'ok', or 'error'.", + ); + expect(span.isTraced).toBe(false); + } +}); diff --git a/conformance/suite/sql.spec.ts b/conformance/suite/sql.spec.ts index bb1f602..8860547 100644 --- a/conformance/suite/sql.spec.ts +++ b/conformance/suite/sql.spec.ts @@ -158,10 +158,11 @@ it("§1.4 public SQL values follow workerd's JSG conversion", async () => { }); }); -it("§1.4 SQLite strings and blobs are limited to 4 MiB", async () => { +it("§1.4 SQLite strings and blobs allow 8 MiB plus serialization padding", async () => { const probe = await host.spawn("sql-length-limit"); expect(await probe.call("sqliteLengthLimit")).toEqual({ - allowed: 4_000_000, + allowed: 8_000_000, + padded: 8 * 1024 * 1024 + 34, tooBig: "Error: string or blob too big: SQLITE_TOOBIG", }); }); diff --git a/docs/cloudflare-sync-2026-10-02.md b/docs/cloudflare-sync-2026-10-02.md new file mode 100644 index 0000000..1824b47 --- /dev/null +++ b/docs/cloudflare-sync-2026-10-02.md @@ -0,0 +1,102 @@ +# Cloudflare refresh — October 2, 2026 + +This refresh advances the runtime oracle to +[workerd 1.20261002.1](https://github.com/cloudflare/workerd/releases/tag/v1.20261002.1) +and the six-package SDK fork to +[Agents 0.26.0](https://github.com/cloudflare/agents/tree/74570a19aafc676dd85831a31af047817e7bba12). +Think is 0.20.0, AI Chat 0.12.1, Codemode 0.5.3, Voice 0.5.0 and Shell 0.4.3. +Workers types match the oracle in the runtime, both examples and SDK workspace. + +## Review and implementation + +The [workerd audit](workerd-sync.md) covers all 688 intervening commits, with a +[complete disposition table](workerd-sync-2026-10-02.csv). The runtime ports +multi-observer output-gate failure, SQLite's 8 MiB plus 34-byte limit, and the +tracing name/status API. Unsupported distributed retry behavior remains outside +the local host contract. + +The [SDK audit](../vendor/agents/docs/audit/agents-sync-2026-10-02.md) covers all +104 intervening commits. It records the exact merge base and target, imported +APIs, storage implications and reasons for retaining each local behavior. +Upstream replaces the original-method helper, React cleanup guard and most +deleted-facet routing patches. The [fork inventory](../vendor/agents/docs/fork-diff.md) +records the remaining owners and retirement conditions. + +Integration fixes preserve completion metadata, Stop and cancellation evidence, +lossless stored/live replay, terminal-only delivery, and bounded recovery reads. +Browser compilation preserves async method identity so cold asynchronous RPC +initializes correctly while synchronous methods remain synchronous. Both +examples use a real browser implementation for Sessions' synchronous hashing. +The extension recovery assertion now checks one canonical assistant message +and its exact durable prefix plus continuation. + +The root `sdk:test` command selects the same workerd binary as conformance. +The maintained SDK gate includes the new cold-RPC, model, browser capability, +terminal-order, metadata, prompt-cache and address-change regressions. + +## Dependency work + +The [security review](dependency-security.md) records every exact override, +advisory source, remaining dependency path and audit count. Compatible fixes +apply to the installed major versions. The pool and Wrangler remain on their +existing compatible versions; updating Wrangler alone would leave the pool's +older transitive copies installed. The export checker uses Node's built-in glob +instead of an otherwise-unused dependency. + +The optional Evalite runner and its single credentialed scheduling evaluation +were removed after the user delegated that decision. Neither was part of the +maintained regression gate. This removes the remaining high and moderate +development-tooling advisories and two obsolete overrides without adding a +replacement framework. Runtime scheduling and its deterministic tests remain. +The lockfile drops 76 package versions and adds none; both workspaces now report +only the existing low-severity elliptic finding. + +## Verification + +| Gate | Result | +| --- | --- | +| Runtime unit suite | 1,022 tests passed | +| Native workerd conformance | 82 passed | +| Node conformance | 82 passed | +| Chromium conformance | 95 passed | +| Transformed Node / Chromium conformance | 82 passed in each lane | +| SDK regression gate | 3,162 passed in Linux CI: React 103, chat 639, Agents 989, AI Chat 111, Think 1,033, Voice 21, Shell 194, browser 72 | +| Final admission-failure regression | All 28 reconnect tests passed, including a new test proving an identical request can retry after terminal-state cleanup fails | +| Native browser connector | 24 passed with the local Browser Rendering simulator; teardown now targets only listening processes | +| SDK exports, formatting, lint and TypeScript | Passed for the maintained six-package closure | +| Evalite removal follow-up | Both frozen installs, all six SDK builds, `sdk:check` and 70 retained scheduling tests passed; fresh audits have no high or moderate findings | +| Runtime and example TypeScript | Passed | +| Runtime package | Build, publint, declaration checks and installed-package smoke passed | +| SDK packages | All six release tarballs packed; export targets exist and release dependency ranges contain no workspace/file references | +| Dependency installation and oracle | Both frozen lockfile installs and all four Workers type pins passed | +| Extension Chromium journey | Passed, including exact recovery content, Stop, host recreation and alarm watchdog | +| Vibe platform | Production build and Chromium journey passed, including exported Worker deployment dry run | + +The tracing getter follow-up was verified separately in all three ordinary +conformance lanes after the full runtime gate. Windows launcher syntax was +reviewed; Windows execution was not tested. These are maintained +regression gates, not every optional upstream evaluation or live-provider test. + +## Rollout policy + +The release can proceed for existing 0.24 consumers without a browser export +migration: no retained package subpath was removed, `CdpSession` remains an +alias, and the deleted interaction contract was unexported. Think's AI 7 / React +SDK 4 peer floor already matches this fork. Native RPC users with unnamed +Durable Object IDs must adopt named addressing. + +- **Forward-only upgrades:** the user explicitly chose not to support + downgrades of migrated stores. Fixes roll forward; no downgrade compatibility + layer or rollback project will be added. Existing forward migrations remain + necessary to preserve stored user data during upgrades. Old 0.24 writes can + leave the new Sessions content digest stale, and old recovery code does not + recognize completed legacy-fiber markers. The + [SDK audit](../vendor/agents/docs/audit/agents-sync-2026-10-02.md#storage-and-rollout) + retains the exact source and scope of those unsupported downgrade behaviors. +- **Optional evaluation tooling:** remove Evalite and its optional live-model + scheduling sample. The remaining low-severity browser-crypto finding is + recorded in the security review; there is no pending Evalite migration. + +No release was published and no application deployment or stored user data was +modified by this refresh. Work was isolated from the original checkout's +uncommitted README, lint configuration, package and tooling edits. diff --git a/docs/decisions.md b/docs/decisions.md index 7ae7414..1ad55d3 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -8,9 +8,9 @@ the index the citations resolve to, not a second specification. Workerd line citations throughout the source use release `v1.20260713.1`, commit `03c396e9b14ea5644dfcfb696086d8df040a4efc` of [cloudflare/workerd](https://github.com/cloudflare/workerd). The conformance -oracle is pinned separately to release `v1.20260911.1`, commit -`925464ba9fe5751e4468626ce77f7a5810df274f`. -The [September sync audit](workerd-sync.md) records the reviewed changes and +oracle is pinned separately to release `v1.20261002.1`, commit +`51a48a5bb7863fbeab791358bee8dff22c3ce83f`. +The [workerd sync audit](workerd-sync.md) records the reviewed changes and remaining host-engine differences. New source comments name their upstream commit when the July line baseline no longer applies. @@ -297,7 +297,7 @@ consumer peer dependencies retain one identity. | The pinned SQLite engines lack workerd's default-expression and internal-function patches | Native callbacks alone cannot enforce these new restrictions; the [sync audit](workerd-sync.md#sqlite-engine-work-still-required) records observed engine behavior and the required follow-up | | A native outbound WebSocket handshake cannot wait for storage confirmation | Actor-global `new WebSocket(url)` throws before opening the connection; pairs and host-owned transports remain supported | | No tracing observer or generic async span context | Spans are no-ops; active identity is scoped to the synchronous callback and is restored on return or throw | -| `node:sqlite` exposes no `sqlite3_limit()` | Bound and returned strings and blobs enforce workerd's 4 MiB limit; SQL-computed values that are never returned may exceed it. The browser backend sets the native limit. | +| `node:sqlite` exposes no `sqlite3_limit()` | Bound and returned strings and blobs enforce workerd's 8 MiB plus 34-byte limit; SQL-computed values that are never returned may exceed it. The browser backend sets the native limit. | | A response BYOB reader cannot be re-gated after `read(view)` | BYOB readers throw; callers use a default reader or `arrayBuffer()` | | A workerd facet alarm appears to schedule and then breaks asynchronously ([workerd#6810](https://github.com/cloudflare/workerd/issues/6810)) | This runtime refuses facet `setAlarm()` synchronously | | A host may lose a physical wake between durable and platform timer writes | The host timer journals an opaque one-shot token before arming; the scheduler remains authoritative | diff --git a/docs/dependency-security.md b/docs/dependency-security.md new file mode 100644 index 0000000..ab8c9ae --- /dev/null +++ b/docs/dependency-security.md @@ -0,0 +1,103 @@ +# Dependency security review — October 2, 2026 + +The Cloudflare sync includes targeted security overrides in both pnpm workspaces. +They keep the installed major versions, retain the existing Babel 7 override, +and leave the exact workerd oracle pin unchanged. Direct package ranges were +not broadened. The export checker now uses Node 24's `node:fs/promises.glob`, +removing its sole `fast-glob` dependency and the vulnerable `braces` graph. `pnpm install --ignore-scripts` completed without peer warnings. + +The [latest Workers test pool](https://registry.npmjs.org/@cloudflare/vitest-pool-workers/latest) +is still `0.22.0` and pins `miniflare@5.20260815.0-alpha` and `wrangler@4.124.0`. +Updating the top-level Wrangler alone cannot remove its vulnerable Sharp and +Undici copies. The overrides therefore apply to affected transitive versions. +Fixed versions were checked against npm package metadata before installation; +all selected releases support the repository's Node 24 environment. + +## Installed fixes + +These are the exact override entries. “Both” means the root workspace and +`vendor/agents`; “vendor” means that only the vendored workspace had an affected +version. A selector stops applying once its parent resolves a newer version. + +| Selector | Fixed version | Workspace | Advisory evidence | +| --- | --- | --- | --- | +| `sharp@0.35.2` | `0.35.4` | Both | [libheif vulnerabilities](https://github.com/advisories/GHSA-rgj7-g3m4-5g8c) | +| `undici@>=7 <7.29.1` | `7.29.1` | Both | [WebSocket denial of service](https://github.com/advisories/GHSA-rfgv-xxqx-mfg5), [additional high-severity finding](https://github.com/advisories/GHSA-w293-vg96-wgc3); this also resolves the reported 7.28/7.29 moderate and low findings | +| `brace-expansion@>=5 <5.0.12` | `5.0.12` | Both | [Nested-brace stack exhaustion](https://github.com/advisories/GHSA-qhr7-859c-m2p7), [latest affected range](https://github.com/advisories/GHSA-q2hr-2g5m-vwhr) | +| `fast-uri@>=3 <3.1.8` | `3.1.8` | Both | [High-severity affected range](https://github.com/advisories/GHSA-qw65-cvwx-89v3), [latest affected range](https://github.com/advisories/GHSA-hrr3-gc8f-f4qj) | +| `ip-address@>=10 <10.7.1` | `10.7.1` | Both | [High-severity affected range](https://github.com/advisories/GHSA-mwp4-54f8-5fhr), [latest affected range](https://github.com/advisories/GHSA-j6r3-76f7-8jcv) | +| `ws@>=8 <8.21.0` | `8.21.0` | Vendor | [Affected versions below 8.21.0](https://github.com/advisories/GHSA-96hv-2xvq-fx4p) | +| `hono@>=4 <4.13.7` | `4.13.7` | Vendor | [Latest affected range](https://github.com/advisories/GHSA-hxh3-vqpv-xpqv) | +| `@hono/node-server@>=1 <1.19.15` | `1.19.15` | Vendor | [Affected versions below 1.19.15](https://github.com/advisories/GHSA-frvp-7c67-39w9) | +| `qs@>=6 <6.16.0` | `6.16.0` | Vendor | [Latest affected range](https://github.com/advisories/GHSA-4mjr-xmp4-gh2g) | + +## Audit result and remaining findings + +`pnpm audit --json` was run immediately before and after these installs. Counts +are reported advisories, not separate exploitable application paths. The +initial scan includes the new example crypto shims, so it differs from the +older 17/61 scan taken before those dependencies were installed. + +| Workspace | Before | After compatible fixes | After Evalite removal | +| --- | --- | --- | --- | +| Root | 18: 5 high, 9 moderate, 4 low | 1 low | 1 low | +| Vendor | 62: 23 high, 34 moderate, 5 low | 6: 1 high, 4 moderate, 1 low | 1 low | + +Both workspaces now have no reported high or moderate findings. The optional +Evalite runner, its command and its sole credentialed scheduling evaluation +were removed. That live-model quality sample was outside the maintained test +gate; runtime scheduling and its deterministic regression coverage remain. +Removing unused tooling avoids carrying or migrating another development +framework. Its now-unused Fastify and find-my-way overrides were removed too. +The regenerated lockfile drops 76 package versions and adds none. + +The removal resolves these previously deferred findings: + +- **Evalite's static server:** `evalite@0.19.0 > @fastify/static@8.3.0` + had one [high route-guard bypass](https://github.com/advisories/GHSA-83w8-p2f5-377r) + and three moderate findings + ([directory traversal](https://github.com/advisories/GHSA-pr96-94w5-mx2h), + [encoded separators](https://github.com/advisories/GHSA-x428-ghpx-8j92), + [noncanonical paths](https://github.com/advisories/GHSA-8pvw-jcv7-9cmj)). + Fixing all four requires static 10.1.2 or newer, outside Evalite's `^8.2.0` + range. Stable Evalite was 0.19.0 at the audit; its 1.0 prerelease would + require a separate tool migration. +- **Evalite's file detector:** `evalite@0.19.0 > file-type@19.6.0` had a + [moderate malformed-ASF infinite loop](https://github.com/advisories/GHSA-5v7r-6r5c-r473). + Its fix requires 21.3.1 or newer, outside Evalite's `^19.6.0` range. + +The remaining finding is: + +- **Browser crypto:** `node-stdlib-browser > crypto-browserify > elliptic@6.6.1` + has a [low cryptographic-implementation finding](https://github.com/advisories/GHSA-848j-6mx2-7j84). + The advisory names 6.6.2, but [npm metadata](https://registry.npmjs.org/elliptic) + lists no published release satisfying that range. The dependency is present + in both example builds and Think's browser development setup. The current + compatibility need is synchronous hashing; this audit does not establish + that elliptic signing or key agreement is exercised by those builds. + +The dependency audit is not a claim that every reported vulnerability is +reachable, nor that the remaining packages are safe for arbitrary inputs. +Removing the remaining finding requires a smaller browser crypto adapter or +an upstream fix with validation for that surface. + +The removed `fast-glob > micromatch > braces@3.0.3` dependency had a +[high deeply-nested-pattern denial of service](https://github.com/advisories/GHSA-vfj7-8cjw-p6xm). +Its named 3.0.4 fix is not published. Using the built-in glob implementation for +`packages/*/package.json` removes that advisory without replacing the dependency +with another package or changing the export check's scope. + +## Validation + +After installing the security overrides, all 1,022 runtime unit tests, +82 workerd conformance tests, and 50 Think agent-tool tests passed. The latter +runs through the affected Workers test pool and its overridden dependencies. +The Node 24 export checker also passed for all six maintained SDK packages +after their build. The broader SDK, browser, and example validation is recorded +with the sync. + +After Evalite removal, both frozen lockfile installs, all six SDK builds and +`sdk:check` passed. The retained scheduling and schedules-capability suites +passed all 70 tests on the same October 2 workerd binary. Fresh audits confirmed +one low-severity elliptic finding in each workspace and no high or moderate +findings. No runtime implementation or maintained test was removed. diff --git a/docs/workerd-sync-2026-10-02.csv b/docs/workerd-sync-2026-10-02.csv new file mode 100644 index 0000000..c41e960 --- /dev/null +++ b/docs/workerd-sync-2026-10-02.csv @@ -0,0 +1,689 @@ +commit,parents,subject,disposition,changed_paths +51a48a5bb7863fbeab791358bee8dff22c3ce83f,1a536b09fbb59fec3ded9aa9d8e34bd27b624752,Release 2026-10-02,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +1a536b09fbb59fec3ded9aa9d8e34bd27b624752,10e79b8b3ebd1161d308a78ee65585e818b44f59,remove v8 nightly (#7512),"Build, dependency, release tooling or documentation: no local runtime behavior port.",.gitignore;build/deps/deps.jsonc;build/deps/gen/deps.MODULE.bazel;cfsetup.yaml;ci/build.yml;ci/v8_nightly.py;ci/v8_nightly_shared.py;ci/v8_update.py;templates/v8-nightly.yml +10e79b8b3ebd1161d308a78ee65585e818b44f59,1163f12d4284b008ddfb1534169fdd8675426f21 42a71fe42268ef9af0ce489a22e21eb1eb33f85f,Merge pull request #7585 from frostzt/STOR-5691-prepare-sql-query-metrics,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +1163f12d4284b008ddfb1534169fdd8675426f21,54f4cafbcfcce802bcfba68d7180d1e4bb56a9d4 11e134214c32a734004369a7ec92d92e6e5fbb9f,Merge pull request #7559 from cloudflare/mar/sandbox-user-tracing,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +11e134214c32a734004369a7ec92d92e6e5fbb9f,cb26acc62e64f64487a78e3f73d0a08e9926c690,Accept an explicit onset parent span,Native observability/lifetime or tests: local public no-op tracing handled separately; no observer delivery backend.,src/workerd/io/tracer.c++;src/workerd/io/tracer.h +42a71fe42268ef9af0ce489a22e21eb1eb33f85f,1e56ae03c2bbaa20c6686f91690b4339837a9e63,Report SQLite query events on prepare failures,Native observability: query preparation failure events; no SqliteObserver event sink in local seam.,src/workerd/util/sqlite-test.c++;src/workerd/util/sqlite.c++ +54f4cafbcfcce802bcfba68d7180d1e4bb56a9d4,00462aa5c75addf0c865f28a00393f0d4a761ded,Restore the C++ exception boundary in console.* decorators,Native exception boundary for console formatting; local console belongs to JavaScript host.,src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/console-format-throw-test.js;src/workerd/api/tests/console-format-throw-test.wd-test;src/workerd/io/worker.c++ +00462aa5c75addf0c865f28a00393f0d4a761ded,edb99f4d78e3eebc409ec814743c55676c48d9d5 3ae442691007c6db563879c28560c4474b470e4e,Merge pull request #7272 from cloudflare/workflows-create-batch-overload,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +1e56ae03c2bbaa20c6686f91690b4339837a9e63,edb99f4d78e3eebc409ec814743c55676c48d9d5,Document missing SQLite query events on prepare failures,Native observability regression documents missing SQL prepare events; fixed by 42a71fe42.,src/workerd/util/sqlite-test.c++ +edb99f4d78e3eebc409ec814743c55676c48d9d5,a3a28c437b9bc50aac2a0d70af9cf22523019fc7,Reject resolver when startTls support is missing,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.c++ +a3a28c437b9bc50aac2a0d70af9cf22523019fc7,c60cd2b85b45755ba6e6d55bcc21100f214fe45b,Prepare TLS changes,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.c++;src/workerd/io/worker-entrypoint.c++ +c60cd2b85b45755ba6e6d55bcc21100f214fe45b,402f058c655b01fa58ba1ed711061cf3bc7d896b,[nfc] Deduplicate starttls-server.pem,"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/http-socket-server.js;src/workerd/api/tests/starttls-nodejs-server.js;src/workerd/server/tests/python/BUILD.bazel;src/workerd/server/tests/python/sockets/sockets.wd-test;src/workerd/server/tests/python/sockets/starttls-server.pem +402f058c655b01fa58ba1ed711061cf3bc7d896b,ad7b9d4610fef1a470b006f82748896935e8102f,Release 2026-10-01,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +ad7b9d4610fef1a470b006f82748896935e8102f,d7556d157ae8241aa915f8a2c9f91e483c7513d5,[build] Update buildifier,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/gen/shared_deps.MODULE.bazel;build/deps/shared_deps.jsonc +d7556d157ae8241aa915f8a2c9f91e483c7513d5,d99bc6b777e35d72d71c2f1fe2fd1db53284528a,[build] 09-30-26 update deps,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/build_deps.jsonc;build/deps/gen/build_deps.MODULE.bazel;build/deps/gen/deps.MODULE.bazel +3ae442691007c6db563879c28560c4474b470e4e,beabc3d7137c58c5b6b705a551be7a2693b89f0e,workflows: clarify createBatch deprecation,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,src/cloudflare/internal/workflows.d.ts;types/defines/workflows.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +beabc3d7137c58c5b6b705a551be7a2693b89f0e,d99bc6b777e35d72d71c2f1fe2fd1db53284528a,workflows: add createBatch object overload,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,src/cloudflare/internal/test/workflows/workflows-api-test.js;src/cloudflare/internal/test/workflows/workflows-mock.js;src/cloudflare/internal/workflows-api.ts;src/cloudflare/internal/workflows.d.ts;types/defines/workflows.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/rpc.ts +d99bc6b777e35d72d71c2f1fe2fd1db53284528a,cb26acc62e64f64487a78e3f73d0a08e9926c690,Fix spurious unhandled rejections from Durable Object fetch retries (#7584),"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/http.c++;src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/actor-fetch-rejection-test.js;src/workerd/api/tests/actor-fetch-rejection-test.wd-test +cb26acc62e64f64487a78e3f73d0a08e9926c690,87750f2bd04dca00647678f3a04aa346aa93d125 50226a61addeaf5d61c02723151ffa1c263281e4,Merge pull request #7580 from cloudflare/rinkle/RM-30088-revert-compat-date-update,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +50226a61addeaf5d61c02723151ffa1c263281e4,87750f2bd04dca00647678f3a04aa346aa93d125,"Revert ""Update compat date for `durable_object_io_tasks_prevent_eviction`""",Revert restores final eviction-tracking enable date 2026-10-01; evaluated endpoint.,src/workerd/io/compatibility-date-test.c++;src/workerd/io/compatibility-date.capnp +87750f2bd04dca00647678f3a04aa346aa93d125,9079625bd84a55ca6d11f18e7f1b47f714fbb234,Release 2026-09-30,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +9079625bd84a55ca6d11f18e7f1b47f714fbb234,7530e49c41d8235a570fcea92d0cc7a28852b8e1 1132cf4b1bd7bb4707d9831717a87aa152d020b4,Merge pull request #7577 from cloudflare/rinkle/RM-30088-update-compact-date,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +7530e49c41d8235a570fcea92d0cc7a28852b8e1,ab1b3926727b2fdc1f104d99eef93a878a93f665 1cc4c585f1cde289ad517bc8e1722eb8c2aef149,Merge pull request #7564 from cloudflare/mar/tracing-prefactors,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +1132cf4b1bd7bb4707d9831717a87aa152d020b4,ab1b3926727b2fdc1f104d99eef93a878a93f665,Update compat date for `durable_object_io_tasks_prevent_eviction`,Reverted by 50226a61a: temporary eviction-tracking compatibility date change.,src/workerd/io/compatibility-date-test.c++;src/workerd/io/compatibility-date.capnp +ab1b3926727b2fdc1f104d99eef93a878a93f665,9d1290c15f1dc799bd745c6b4805b8ec87a14973 8ede87f0d7f9030b8dfe8974812aef2bfb439645,Merge pull request #7519 from leostera/lostera/artifacts-bindings,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +1cc4c585f1cde289ad517bc8e1722eb8c2aef149,946ff26b028f644960e8d2d7f8bc5f1c4e788654,Centralize TraceContext construction,Native observability/lifetime or tests: local public no-op tracing handled separately; no observer delivery backend.,src/workerd/io/io-context.c++;src/workerd/io/trace.h +9d1290c15f1dc799bd745c6b4805b8ec87a14973,b886ea34a5b08c9ac117d50ae47636881acffae5 acaf55e29c2f010274ec94c3b4488521b057305f,Merge pull request #7571 from cloudflare/harris/2026-09-29-clarify-v8-compat-audits,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +acaf55e29c2f010274ec94c3b4488521b057305f,b886ea34a5b08c9ac117d50ae47636881acffae5,[nfc] Clarify V8 compatibility audit requirements,"Build, dependency, release tooling or documentation: no local runtime behavior port.",AGENTS.md +b886ea34a5b08c9ac117d50ae47636881acffae5,6c3ce9cbf92782c1db4ebbe087384954ef45cc55 b869af0328a927c2b402c0b759eb587c0be4e0a0,Merge pull request #7568 from cloudflare/harris/2026-09-28-update-v8-15.5,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +6c3ce9cbf92782c1db4ebbe087384954ef45cc55,8843f5935d1a5b9c1bd19755f9294c38881138bf,Enable debug for v8's heap.cc,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.bazelrc +b869af0328a927c2b402c0b759eb587c0be4e0a0,82b85cf9f6de50c921b83a4d3b8a005ced8b513a,[build] Update to V8 15.5.35.7,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",build/deps/deps.jsonc;build/deps/gen/deps.MODULE.bazel;build/deps/v8.MODULE.bazel;patches/v8/0001-Allow-manually-setting-ValueDeserializer-format-vers.patch;patches/v8/0002-Allow-manually-setting-ValueSerializer-format-versio.patch;patches/v8/0003-Allow-Windows-builds-under-Bazel.patch;patches/v8/0005-Speed-up-V8-bazel-build-by-always-using-target-cfg.patch;patches/v8/0006-Implement-Promise-Context-Tagging.patch;patches/v8/0009-Add-ValueSerializer-SetTreatFunctionsAsHostObjects.patch;patches/v8/0010-Modify-where-to-look-for-fp16-dependency.-This-depen.patch;patches/v8/0011-Revert-heap-Add-masm-specific-unwinding-annotations-.patch;patches/v8/0012-Update-illegal-invocation-error-message-in-v8.patch;patches/v8/0013-Implement-cross-request-context-promise-resolve-hand.patch;patches/v8/0014-Add-another-slot-in-the-isolate-for-embedder.patch;patches/v8/0015-Add-ValueSerializer-SetTreatProxiesAsHostObjects.patch;patches/v8/0017-Enable-V8-shared-linkage.patch;patches/v8/0018-Modify-where-to-look-for-fast_float-and-simdutf.patch;patches/v8/0019-Remove-unneded-latomic-linker-flag.patch;patches/v8/0020-Add-methods-to-get-heap-and-external-memory-sizes-di.patch;patches/v8/0021-Port-concurrent-mksnapshot-support.patch;patches/v8/0022-Port-V8_USE_ZLIB-support.patch;patches/v8/0023-Modify-where-to-look-for-dragonbox.patch;patches/v8/0026-Implement-additional-Exception-construction-methods.patch;patches/v8/0028-bind-icu-to-googlesource.patch;patches/v8/0029-Add-v8-String-IsFlat-API.patch;patches/v8/0031-Add-verify_write_barriers-flag-in-V8-s-bazel-config.patch;patches/v8/0033-Return-false-on-Object.hasOwnProperty-with-intercept.patch;patches/v8/0035-Remove-libcxx-dep-from-defs.bzl-not-resolvable-via-h.patch;patches/v8/0036-Fix-ExtendedMap-layout-on-Windows.patch;patches/v8/0038-Properly-depend-on-llvm-libc.patch;patches/v8/0039-Fix-TSan-build-without-the-V8-sandbox.patch;patches/v8/0040-Enable-Perfetto-support-in-the-V8-Bazel-build.patch;patches/v8/0042-cppgc-Sweep-cppgc-eagerly-with-non-incremental-GC.patch;patches/v8/0043-Allow-V8-release-archives-without-metagen-Clang-head.patch;src/workerd/jsg/setup.c++ +8843f5935d1a5b9c1bd19755f9294c38881138bf,82b85cf9f6de50c921b83a4d3b8a005ced8b513a 946ff26b028f644960e8d2d7f8bc5f1c4e788654,Merge pull request #7521 from cloudflare/apeacock/STOR-5615-retryable-decorator,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +946ff26b028f644960e8d2d7f8bc5f1c4e788654,bc75cc988c6c0945ace821db0b9267d3206dd479,STOR-5615: Pass @retryable to the retry-token claim,Unsupported distributed retry protocol: retryable handler bit goes to retry-token claim observer; no local replay/dedup service.,src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/global-scope.c++;src/workerd/api/global-scope.h;src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/jsrpc-call-retry-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/workers-module.h;src/workerd/io/observer.h;src/workerd/io/worker-entrypoint-test.c++;src/workerd/io/worker-entrypoint.c++;types/defines/durable-objects.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/index.d.ts +bc75cc988c6c0945ace821db0b9267d3206dd479,82b85cf9f6de50c921b83a4d3b8a005ced8b513a,STOR-5615: Add the @retryable Durable Object decorator,Unsupported distributed retry surface: new cloudflare:durable-objects retryable decorator; no local module alias or retry backend.,src/cloudflare/durable-objects.ts;src/cloudflare/internal/workers.d.ts;src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/new-module-registry-test.js;src/workerd/api/tests/retryable-test.js;src/workerd/api/tests/retryable-test.wd-test;src/workerd/api/workers-module.c++;src/workerd/api/workers-module.h;types/defines/durable-objects.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/index.d.ts;types/test/types/durable-objects.ts +82b85cf9f6de50c921b83a4d3b8a005ced8b513a,71b349a8e87fa22855b818ef72cad5a3a35f6d79,Release 2026-09-29,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +71b349a8e87fa22855b818ef72cad5a3a35f6d79,b5bf0663a84044adaf713a114122e621859f197e 74f625b4e8ea30a147246ba8d6a5d00e2bd1e654,Merge pull request #7563 from cloudflare/rinkle/RM-30088-enable-io-task-eviction-compat-date,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +74f625b4e8ea30a147246ba8d6a5d00e2bd1e654,b5bf0663a84044adaf713a114122e621859f197e,Enable DO I/O task eviction protection on October 1,Host policy: enables eviction tracking at 2026-10-01; local compatibility date retained.,src/workerd/io/compatibility-date-test.c++;src/workerd/io/compatibility-date.capnp +b5bf0663a84044adaf713a114122e621859f197e,5d7700aad53ab19e526435bad32499c0e71137cf,update dependencies to latest version,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/gen/build_deps.MODULE.bazel;build/deps/gen/deps.MODULE.bazel;deps/rust/Cargo.lock +5d7700aad53ab19e526435bad32499c0e71137cf,7d20e0abd254ad3653c5007c8150b6c7e33a2347 a83bf8d8fd6330467e4911d1bcf1b55892971017,Merge pull request #6872 from thibmeu/cf/mlkem-mldsa-helpers,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +a83bf8d8fd6330467e4911d1bcf1b55892971017,0f4b0f323febb2b829cad2048a2dc5c7fbcb8ead,Add ML-KEM and ML-DSA WebCrypto support,Host WebCrypto: opt-in ML-KEM/ML-DSA and draft helpers; local scope gates native WebCrypto and adds no cryptographic engine.,build/wpt_test.bzl;src/workerd/api/crypto/aes.c++;src/workerd/api/crypto/crypto.c++;src/workerd/api/crypto/crypto.h;src/workerd/api/crypto/digest.c++;src/workerd/api/crypto/ec.c++;src/workerd/api/crypto/hkdf.c++;src/workerd/api/crypto/impl.h;src/workerd/api/crypto/keys.c++;src/workerd/api/crypto/keys.h;src/workerd/api/crypto/mldsa.c++;src/workerd/api/crypto/mlkem.c++;src/workerd/api/crypto/pbkdf2.c++;src/workerd/api/crypto/rsa.c++;src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/crypto-extras-test.js;src/workerd/api/tests/crypto-modern-algorithms-test.js;src/workerd/api/tests/crypto-modern-algorithms-test.wd-test;src/workerd/io/compatibility-date.capnp;src/wpt/BUILD.bazel;src/wpt/WebCryptoAPI-test.ts;src/wpt/harness/utils.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +7d20e0abd254ad3653c5007c8150b6c7e33a2347,0f4b0f323febb2b829cad2048a2dc5c7fbcb8ead,Refactor console method decoration for snapshotting (#6874),"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/io/worker.c++;src/workerd/io/worker.h;src/workerd/jsg/wrappable.h +0f4b0f323febb2b829cad2048a2dc5c7fbcb8ead,6cc4a3298deac58ba6d6fb74a3f0ffbc4f1f5902,Run Bonk from ask-bonk main,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/bigbonk.yml;.github/workflows/bonk.yml;.github/workflows/new-pr-review.yml +6cc4a3298deac58ba6d6fb74a3f0ffbc4f1f5902,bf5bfc16a1f339e2a7eb123cc444dc507c3de879,Drop fully rolled-out autogates from the registry,"Native rollout registry cleanup; actor retry, socket transfer and trace gates assessed in their implementation commits.",src/workerd/util/autogate.h +bf5bfc16a1f339e2a7eb123cc444dc507c3de879,72ee7bf344644bdfc51e892a60556d2cecd97e38,Remove the durable-object-retries-fetch-retry-requests autogate,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/http.c++;src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/jsrpc-call-retry-test.c++;src/workerd/api/worker-rpc.c++ +72ee7bf344644bdfc51e892a60556d2cecd97e38,d099c3f21576d15ea58c6e3301249d2234a102c1,Remove the durable-object-retries-fetch autogate,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry-test.c++;src/workerd/api/actor-call-retry.c++;src/workerd/api/actor-call-retry.h;src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/http.c++;src/workerd/api/jsrpc-call-observation-test.c++;src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/jsrpc-call-retry-test.c++;src/workerd/api/worker-rpc.c++ +d099c3f21576d15ea58c6e3301249d2234a102c1,845398e48ea15f9f2ac89f35a8375f8f5f82cb26,Remove the jsrpc-tracing autogate,Native trace rollout gate removal; final-request cleanup still excludes shared actor contexts.,src/workerd/api/http.c++;src/workerd/api/tests/actor-kv-test.wd-test;src/workerd/api/tests/jsrpc-callback-trace-test-tail.js;src/workerd/api/tests/jsrpc-callback-trace-test.wd-test;src/workerd/api/tests/jsrpc-pipelined-trace-test.wd-test;src/workerd/api/tests/sql-test.wd-test;src/workerd/api/tests/tail-worker-test.wd-test;src/workerd/api/worker-rpc.c++;src/workerd/io/BUILD.bazel;src/workerd/io/incoming-request-test.c++;src/workerd/io/io-context.c++ +845398e48ea15f9f2ac89f35a8375f8f5f82cb26,e4de275bd32b13a25d61e3c1b4db6bb7807e3ac9,Remove the socket-rpc-transfer autogate,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.c++;src/workerd/api/tests/js-rpc-socket-streams-ts-test.wd-test;src/workerd/api/tests/js-rpc-socket-test.wd-test;src/workerd/api/tests/outbound-interceptor-socket-test.wd-test;src/workerd/api/worker-rpc.c++ +e4de275bd32b13a25d61e3c1b4db6bb7807e3ac9,d7a909deda84816fa43730d64b0202d0878cde95,Remove the container-tunnel-reuse autogate,Separate Docker Containers service/client or tests: unrelated to local actor execution container.,src/workerd/api/BUILD.bazel;src/workerd/api/bench-container-ingress.c++;src/workerd/api/container-test.c++;src/workerd/api/container.c++;src/workerd/api/container.h +d7a909deda84816fa43730d64b0202d0878cde95,f30fcf93a0eef26e886a9f53a1918634024ca6a0,Remove the nodejs-exceptions-rust autogate,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/rust/node-exceptions/lib.rs;src/workerd/api/node/BUILD.bazel;src/workerd/api/node/exceptions.c++ +f30fcf93a0eef26e886a9f53a1918634024ca6a0,b37c987145e2bd3ad74025f41d2c8f13520832d2,Remove the nodejs-url-rust autogate,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,compile_flags.txt;src/rust/AGENTS.md;src/rust/api/lib.rs;src/rust/api/url.rs;src/rust/net/BUILD.bazel;src/rust/net/lib.rs;src/workerd/api/node/BUILD.bazel;src/workerd/api/node/node.h;src/workerd/api/node/tests/url-nodejs-test.js;src/workerd/api/node/url.c++;src/workerd/api/node/url.h +b37c987145e2bd3ad74025f41d2c8f13520832d2,e5803288aef5315a69cfcb759cfec11311464586 3236e38b66372c99d32acc7e3af9d8619626385a,Merge pull request #7558 from cloudflare/apeacock/STOR-5615-replay-memory-budget,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +8ede87f0d7f9030b8dfe8974812aef2bfb439645,e5803288aef5315a69cfcb759cfec11311464586,Add Artifacts repository read types,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/artifacts.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/artifacts.ts +3236e38b66372c99d32acc7e3af9d8619626385a,af4d571e95939991ef8c6c93dd09763650b73c90,STOR-5615: Count full replay memory for JSRPC calls,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry.c++;src/workerd/api/actor-call-retry.h;src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/jsrpc-call-retry-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h +af4d571e95939991ef8c6c93dd09763650b73c90,e5803288aef5315a69cfcb759cfec11311464586,STOR-5615: Reserve actor call replay memory through LimitEnforcer,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/jsrpc-call-retry-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h;src/workerd/io/limit-enforcer.h;src/workerd/io/observer.h;src/workerd/tests/test-fixture.c++;src/workerd/tests/test-fixture.h +e5803288aef5315a69cfcb759cfec11311464586,500a6f4b3cba10be76bf99953a722cfdc8c23147,Honour the requested atomic cppgc sweeping,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",build/deps/v8.MODULE.bazel;docs/jsg.md;patches/v8/0042-cppgc-Sweep-cppgc-eagerly-with-non-incremental-GC.patch;src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/messageport-gc-test.js;src/workerd/api/tests/messageport-gc-test.wd-test;src/workerd/api/unsafe.c++;src/workerd/api/unsafe.h;src/workerd/jsg/condemned-wrapper-test.c++;src/workerd/jsg/eager-finalization-test.c++;src/workerd/jsg/jsg.c++;src/workerd/jsg/jsg.h +500a6f4b3cba10be76bf99953a722cfdc8c23147,bf05b7e6c997719257080240d2e6799c257fd910,Move wrapper handle to shim,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",docs/jsg.md;src/workerd/jsg/condemned-wrapper-test.c++;src/workerd/jsg/jsg.c++;src/workerd/jsg/jsg.h;src/workerd/jsg/setup.c++;src/workerd/jsg/setup.h;src/workerd/jsg/wrappable.c++;src/workerd/jsg/wrappable.h +bf05b7e6c997719257080240d2e6799c257fd910,43c5dcf88099eb6314aff56501542136c16d6cf1,jsg: tighten wrapper identity checks when unwrapping,Security/branding screened: native cppgc wrapper identity validation; local JS wrappers do not carry cppgc pointers.,docs/jsg.md;src/workerd/jsg/BUILD.bazel;src/workerd/jsg/bench-dispatch.c++;src/workerd/jsg/fast-api-test.c++;src/workerd/jsg/jsg-test.c++;src/workerd/jsg/jsg.h;src/workerd/jsg/resource.h;src/workerd/jsg/setup.c++;src/workerd/jsg/wrappable-tag.h;src/workerd/jsg/wrappable.c++;src/workerd/jsg/wrappable.h +43c5dcf88099eb6314aff56501542136c16d6cf1,4d091cde6c7447a4ead80d1ffbb3a21646eb20c1,jsg: look up wrappables through their cppgc shim,Native cppgc shim lookup and serializer pointer identity; no local native unwrap path.,src/rust/jsg/ffi.c++;src/workerd/api/basics.c++;src/workerd/api/capnp.h;src/workerd/api/global-scope.c++;src/workerd/api/node/timers.c++;src/workerd/jsg/BUILD.bazel;src/workerd/jsg/function.h;src/workerd/jsg/jsg.h;src/workerd/jsg/resource.h;src/workerd/jsg/ser.c++;src/workerd/jsg/setup.c++;src/workerd/jsg/setup.h;src/workerd/jsg/type-wrapper.h;src/workerd/jsg/wrappable-tag.h;src/workerd/jsg/wrappable.c++;src/workerd/jsg/wrappable.h;src/workerd/server/BUILD.bazel +4d091cde6c7447a4ead80d1ffbb3a21646eb20c1,8c17a40c38f3b6127f6aef7dfd8f56c7aac85c62,Hold refs to TailStreamTarget in queued callbacks,Native trace-stream callback ownership; no local tail-stream observer delivery backend.,src/workerd/io/trace-stream.c++ +8c17a40c38f3b6127f6aef7dfd8f56c7aac85c62,5d450132f6e3b69616d8609d74f4e1fb784c23e1,streams: keep tee branch source alive across async ops,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/workerd/api/streams/internal-test.c++;src/workerd/api/streams/internal.c++ +5d450132f6e3b69616d8609d74f4e1fb784c23e1,7b7eb53a3ed50690e86cdebf382fc627facb9ad7,Defer in-memory alarm task cancellation,Native lifetime fix: defer destruction of in-memory alarm task callbacks; JavaScript promises do not self-destruct and local scheduler owns delivery.,src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/actor-alarms-in-memory-test.js;src/workerd/api/tests/actor-alarms-in-memory-test.wd-test;src/workerd/io/worker.c++ +7b7eb53a3ed50690e86cdebf382fc627facb9ad7,948fa207ff77d533e964eb315c57513f3d29f57c,Release 2026-09-28,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +948fa207ff77d533e964eb315c57513f3d29f57c,e4d0afe0ef09edc31c53a1636a3bc2d6db0dee59,memory-cache: merge memory-cache-v2.c++ into memory-cache.c++,Separate native shared memory cache implementation: no local cache backend.,src/workerd/api/BUILD.bazel;src/workerd/api/memory-cache-v2.c++;src/workerd/api/memory-cache.c++;src/workerd/api/memory-cache.h +e4d0afe0ef09edc31c53a1636a3bc2d6db0dee59,10a99ae1c5764aa4e6743f28716171f973131114,memory-cache: expose test stats on MemoryCacheUse,Separate native shared memory cache implementation: no local cache backend.,src/workerd/api/BUILD.bazel;src/workerd/api/memory-cache-test.c++;src/workerd/api/memory-cache-v2-test.h;src/workerd/api/memory-cache-v2.c++;src/workerd/api/memory-cache.h +10a99ae1c5764aa4e6743f28716171f973131114,8e7c42e0b0d363ef04c157e1cf9c93c4d1b13277,memory-cache: fold MemoryCacheNamespace into MemoryCacheProvider,Separate native shared memory cache implementation: no local cache backend.,src/workerd/api/memory-cache-test.c++;src/workerd/api/memory-cache-v2.c++;src/workerd/api/memory-cache.c++;src/workerd/api/memory-cache.h +8e7c42e0b0d363ef04c157e1cf9c93c4d1b13277,a80233266ff8df8b69087b536398ab192cdf402d,memory-cache: drop the clock parameter from MemoryCacheProvider,Separate native shared memory cache implementation: no local cache backend.,src/workerd/api/memory-cache-test.c++;src/workerd/api/memory-cache-v2.c++;src/workerd/api/memory-cache.h;src/workerd/server/server.c++;src/workerd/tests/test-fixture.c++ +a80233266ff8df8b69087b536398ab192cdf402d,cb318b9d59e76b2151c0d289aebe28bb0538f23b,memory-cache: make CacheValue a plain byte view,Separate native shared memory cache implementation: no local cache backend.,src/workerd/api/memory-cache-test.c++;src/workerd/api/memory-cache-v2.c++;src/workerd/api/memory-cache.c++;src/workerd/api/memory-cache.h +cb318b9d59e76b2151c0d289aebe28bb0538f23b,25ef062e9160c1cceba3702386f8bf413318ce36,memory-cache: remove the MEMORY_CACHE_V2 autogate and the C++ implementation,Separate native shared memory cache implementation: no local cache backend.,src/workerd/api/BUILD.bazel;src/workerd/api/memory-cache-test.c++;src/workerd/api/memory-cache-v2-test.h;src/workerd/api/memory-cache-v2.c++;src/workerd/api/memory-cache.c++;src/workerd/api/memory-cache.h;src/workerd/util/autogate.h +25ef062e9160c1cceba3702386f8bf413318ce36,1d3665aa7c082b8ced8a3f010dee5dfc59fac1c3,memory-cache: hoist SharedMemoryCache::Limits to MemoryCacheLimits,Separate native shared memory cache implementation: no local cache backend.,src/workerd/api/memory-cache-test.c++;src/workerd/api/memory-cache-v2.c++;src/workerd/api/memory-cache.h +1d3665aa7c082b8ced8a3f010dee5dfc59fac1c3,8c23e9b39031a9c9cbca7dbef76647009bc51c8e,Release 2026-09-27,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +8c23e9b39031a9c9cbca7dbef76647009bc51c8e,1a709e54e6ad9a40010ba9db6e844aef64382a0e,Make Bonk reviews precise,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/bonk/specialists/SHARED.md;.github/bonk/specialists/api-compat.md;.github/bonk/specialists/compat-flags.md;.github/bonk/specialists/correctness.md;.github/bonk/specialists/design.md;.github/bonk/specialists/docs.md;.github/bonk/specialists/kj-style.md;.github/bonk/specialists/memory-safety.md;.github/bonk/specialists/performance.md;.github/bonk/specialists/rust-first.md;.github/bonk/specialists/tests.md;.github/bonk_reviewer.md;.github/workflows/bigbonk.yml;.github/workflows/bonk.yml;.github/workflows/new-pr-review.yml;src/rust/AGENTS.md +1a709e54e6ad9a40010ba9db6e844aef64382a0e,1481f440b0dc69fee8dcfd2e1995fac5f88f2f88,Make Bonk reviews reliable and context-aware,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/bonk/specialists/api-compat.md;.github/bonk/specialists/compat-flags.md;.github/bonk/specialists/design.md;.github/bonk/specialists/jsg.md;.github/bonk/specialists/kj-style.md;.github/bonk/specialists/memory-safety.md;.github/bonk/specialists/rust-first.md;.github/bonk/specialists/security.md;.github/bonk_reviewer.md;.github/workflows/bigbonk.yml;.github/workflows/bonk.yml;.github/workflows/deps-updater.yml;.github/workflows/new-pr-review.yml;justfile;tools/update_opencode_version.py +1481f440b0dc69fee8dcfd2e1995fac5f88f2f88,da46ad950c54b19158c5ea5cb997a9727491ca17,kj-rs: drop a KjOwn through kj::Own's own destructor,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/AGENTS.md;src/rust/cxx/gen/src/write.rs;src/rust/cxx/kj-rs/README.md;src/rust/cxx/kj-rs/lib.rs;src/rust/cxx/kj-rs/maybe.rs;src/rust/cxx/kj-rs/own.c++;src/rust/cxx/kj-rs/own.h;src/rust/cxx/kj-rs/own.rs;src/rust/cxx/kj-rs/tests/BUILD.bazel;src/rust/cxx/kj-rs/tests/lib.rs;src/rust/cxx/kj-rs/tests/own-test.c++;src/rust/cxx/kj-rs/tests/test-own.c++;src/rust/cxx/kj-rs/tests/test-own.h;src/rust/cxx/kj-rs/tests/test_own.rs;src/rust/cxx/macro/src/expand.rs;src/rust/cxx/tests/ffi/lib.rs;src/rust/kj/http.rs;src/rust/kj/io.rs;src/rust/kj/own.rs +da46ad950c54b19158c5ea5cb997a9727491ca17,e00e11ad3fc7d6501b8141158ba68ced52e4f923,Release 2026-09-26,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +e00e11ad3fc7d6501b8141158ba68ced52e4f923,bf52ccf7e79d1abe73a4d44a225f8c626d538134 68d99dd1e200a210baaf7671533f2d818d9405dc,Merge pull request #7516 from cloudflare/jasnell/ts-streams-detached-dataview,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +68d99dd1e200a210baaf7671533f2d818d9405dc,bf52ccf7e79d1abe73a4d44a225f8c626d538134,Read detached and out-of-bounds DataView chunks as empty,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/crypto/digest-stream.ts;src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/compression.ts;src/per_isolate/webstreams/identity.ts;src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/view-extent.ts;src/per_isolate/webstreams/writable.ts;src/tests/streams/compression/AGENTS.md;src/tests/streams/compression/buffer-lifecycle.js;src/tests/streams/compression/main.js;src/tests/streams/digest/AGENTS.md;src/tests/streams/digest/buffer-lifecycle.js;src/tests/streams/digest/main.js;src/tests/streams/identity/AGENTS.md;src/tests/streams/identity/buffer-lifecycle.js;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/integration-body.js;src/tests/streams/sockets/AGENTS.md;src/tests/streams/sockets/main.js;src/tests/streams/sockets/socket-streams.js +bf52ccf7e79d1abe73a4d44a225f8c626d538134,ebd585e5246afbb027396f5d5c13c9f5aaaff338 8976cb3e0862f3233424e86d0accc22c8fcd799c,Merge pull request #7515 from cloudflare/jasnell/ts-streams-identity-write-settlement,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +ebd585e5246afbb027396f5d5c13c9f5aaaff338,30ed8b445770df14b512179678622996f9d6da8b,types: exact per-model Workers AI reasoning types,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/ai.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/ai-reasoning.ts +30ed8b445770df14b512179678622996f9d6da8b,ac7298be9ac0b71187ebaf6a1a68a3907fff0084,chore(types): regenerate snapshots with bazel,Ambient/service type contract or tests: supplied by updated Workers types; no matching local service implementation.,types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +ac7298be9ac0b71187ebaf6a1a68a3907fff0084,d4e722dcbffb9053d151e588beda636165abaa6c,docs(types): point Workers AI reasoning types at their source of truth,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/ai.d.ts +d4e722dcbffb9053d151e588beda636165abaa6c,3a0d1f59d1830c3c29c2599b84a4a673bfe47cb8,fix(types): inline per-model Workers AI reasoning types,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/ai.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +3a0d1f59d1830c3c29c2599b84a4a673bfe47cb8,0238570afcc03fd44d322e32e8fcd49273398a1d,fix(types): suggest no reasoning efforts for Kimi K2.7 Code,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/ai.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/ai-reasoning.ts +0238570afcc03fd44d322e32e8fcd49273398a1d,856051dd0eb8652d2f4c0623901a56402d9b5bcf,fix(types): make Workers AI reasoning types suggestions instead of restrictions,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/ai.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/ai-reasoning.ts +856051dd0eb8652d2f4c0623901a56402d9b5bcf,5398f442c2f65c059446d214748e09021244c693,fix(types): match generated Gemma 4 class name and keep the original as an alias,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/ai.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/ai-reasoning.ts +5398f442c2f65c059446d214748e09021244c693,ec6b5780e40a2ffb468afd7b629ad1ac40cdd3b8,fix(types): regenerate Workers AI reasoning types from production metadata,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/ai.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/ai-reasoning.ts +ec6b5780e40a2ffb468afd7b629ad1ac40cdd3b8,70d3d28f747653d55f322e011c078d99d90c3fa2,fix(types): publish Nemotron native reasoning controls,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/ai.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/ai-reasoning.ts +70d3d28f747653d55f322e011c078d99d90c3fa2,7b86b5b671031ae7ef923a62282bf31cdbed5e71,fix(types): add Qwen and Nemotron reasoning efforts,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/ai.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/ai-reasoning.ts +7b86b5b671031ae7ef923a62282bf31cdbed5e71,7b31a25ad25ef6a52879a437bb99c72c9206b09e,fix(types): describe Workers AI model reasoning controls,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/ai.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/ai-reasoning.ts +8976cb3e0862f3233424e86d0accc22c8fcd799c,41de4aeaa730d40588d6df1f407601300050df4b,Settle identity-stream writes once read; span reads; tee at the slowest,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/identity.ts;src/tests/streams/identity/AGENTS.md;src/tests/streams/identity/backpressure.js;src/tests/streams/identity/byob.js;src/tests/streams/identity/draining-reader.js;src/tests/streams/identity/identity-modules.capnp;src/tests/streams/identity/main.js;src/tests/streams/identity/read-at-least.js;src/tests/streams/identity/reentrancy.js;src/tests/streams/identity/tee-backpressure.js;src/tests/streams/identity/tee-byob.js;src/tests/streams/r2-patterns/AGENTS.md;src/tests/streams/r2-patterns/r2-consumption.js +41de4aeaa730d40588d6df1f407601300050df4b,7b31a25ad25ef6a52879a437bb99c72c9206b09e,Add a consumption hook and batched byte enqueue for internal sources,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts +7b31a25ad25ef6a52879a437bb99c72c9206b09e,4d84c2c2a5f86e6aef19e194ebb7ade126fac85a 1495a62b5d397ea6ae942b884539d5e8e89b07a0,Merge pull request #7510 from cloudflare/jasnell/ts-streams-transformer-retention,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +4d84c2c2a5f86e6aef19e194ebb7ade126fac85a,d76924cf2f3d73355118759bb81d7363502b4cb8 13aea4b62ebb13bbe8e21ea05c221d58f20e18f7,Merge pull request #7451 from cloudflare/jolio/linting-reje-yw7unu,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +1495a62b5d397ea6ae942b884539d5e8e89b07a0,15c5d5e3a4237754319232e79fa9e78299f87cd2,Release the transformer once a TransformStream finishes,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/per_isolate/webstreams/transform.ts;src/tests/streams/transform/AGENTS.md;src/tests/streams/transform/cancel-outcomes.js;src/tests/streams/transform/gc.js;src/tests/streams/transform/main.js +d76924cf2f3d73355118759bb81d7363502b4cb8,a5e123b6a5c615f6c4a247df88a4534fbbd436ae a745140dc8543085dabdf13cbfd9c2e233556924,Merge pull request #7523 from cloudflare/maizatskyi/2026-09-25-module-source-ownership-base,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +a5e123b6a5c615f6c4a247df88a4534fbbd436ae,15c5d5e3a4237754319232e79fa9e78299f87cd2 6dec1565df779ea90b58d9e0f452647527acd458,Merge pull request #7513 from cloudflare/apeacock/STOR-5615-jsrpc-retry-policy,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +15c5d5e3a4237754319232e79fa9e78299f87cd2,7a7ad836d7846d6442724bff1f3c9cf2fec26568 ae9db71bdab6d067b2d78d6780d6a3e66576e1a8,Merge pull request #7509 from cloudflare/jasnell/ts-streams-transform-cancel-outcome,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +a745140dc8543085dabdf13cbfd9c2e233556924,7a7ad836d7846d6442724bff1f3c9cf2fec26568,Add jsg support for shared-ownership module sources,Native module source ownership: JSG shared backing lifetimes; local WorkerSource retains owned JS strings/bytes/modules.,src/rust/gen-compile-cache/cxx-bridge.c++;src/workerd/io/worker-modules.h;src/workerd/jsg/jsg-test.h;src/workerd/jsg/modules-new-test.c++;src/workerd/jsg/modules-new.c++;src/workerd/jsg/modules-new.h;src/workerd/jsg/modules.c++;src/workerd/jsg/modules.h;src/workerd/jsg/util.c++;src/workerd/jsg/util.h;src/workerd/server/workerd-api.c++ +13aea4b62ebb13bbe8e21ea05c221d58f20e18f7,adc042fdfcf02cf32dff05128f21ebdba0502c8f,Linting: suppress intentional moved-from test assertions,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/io/io-own-test.c++;src/workerd/jsg/weakref-test.c++ +adc042fdfcf02cf32dff05128f21ebdba0502c8f,50e5bf3f93ced8de16bbd0270c63e93288944d6d,Linting: suppress last-recipient move in TailStreamWriter,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/io/trace-stream.c++ +50e5bf3f93ced8de16bbd0270c63e93288944d6d,58fc8abf092dc1fe9bbf86abcf8194938a8f5a7b,Linting: treat KJ owning pointers as null after move,"Build, dependency, release tooling or documentation: no local runtime behavior port.",tools/clang-tidy/use-after-move-analysis.c++;tools/clang-tidy/use-after-move-negative-test.c++;tools/clang-tidy/use-after-move-positive-test.c++;tools/clang-tidy/use-after-move-test.sh +58fc8abf092dc1fe9bbf86abcf8194938a8f5a7b,1c21cdb558aa43fe37435e1a2d8bceadc9bce39a,Linting: extract worker config before capturing def,Native move-order fix when capturing worker definition; no C++ move semantics locally.,src/workerd/server/server.c++ +1c21cdb558aa43fe37435e1a2d8bceadc9bce39a,20228240e1adcfcae1f795a57e4737f333145ce1,Linting: move Sync-KV list prefix field directly,Native move-order fix for sync-kv prefix; local list options are owned JS values.,src/workerd/api/sync-kv.c++ +20228240e1adcfcae1f795a57e4737f333145ce1,336121a9d720b9a8ba54f971a29275020b8e4c46,Linting: consume unwrapped JSG arguments with apply(),"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/jsg/function.h;src/workerd/jsg/resource.h +336121a9d720b9a8ba54f971a29275020b8e4c46,167d0486a472ac90585b5f0c4a03a84229989f46,Linting: add UnwrappedArgs::apply(),"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/jsg/unwrap-args-test.c++;src/workerd/jsg/unwrap-args.h +167d0486a472ac90585b5f0c4a03a84229989f46,918def97132a07c5e38d0293d12bff420f4b60a8,Linting: cover coroutine moves in KJ cases,"Build, dependency, release tooling or documentation: no local runtime behavior port.",tools/clang-tidy/use-after-move-oneof-test.c++ +918def97132a07c5e38d0293d12bff420f4b60a8,83da17e47f0ac11a966e280e200f4221fbb41e93,[fix] Model KJ case loops as single-iteration control flow,"Build, dependency, release tooling or documentation: no local runtime behavior port.",tools/clang-tidy/BUILD.bazel;tools/clang-tidy/BUILD.headers;tools/clang-tidy/test-headers.bzl;tools/clang-tidy/use-after-move-analysis.c++;tools/clang-tidy/use-after-move-analysis.h;tools/clang-tidy/use-after-move-oneof-test.c++;tools/clang-tidy/use-after-move-test.sh;tools/clang-tidy/use-after-move.c++;tools/clang-tidy/use-after-move.h +83da17e47f0ac11a966e280e200f4221fbb41e93,d21f848267341ea91497d3030cced194e2e277b4,[nfc] Apply formatting to LLVM use-after-move analysis,"Build, dependency, release tooling or documentation: no local runtime behavior port.",tools/clang-tidy/use-after-move-analysis.c++;tools/clang-tidy/use-after-move-analysis.h +d21f848267341ea91497d3030cced194e2e277b4,599842e0e838716a864181d2357a6b3ffcfe6ce6,[nfc] Import LLVM use-after-move analysis unchanged,"Build, dependency, release tooling or documentation: no local runtime behavior port.",tools/clang-tidy/llvm-LICENSE.txt;tools/clang-tidy/use-after-move-analysis.c++;tools/clang-tidy/use-after-move-analysis.h +599842e0e838716a864181d2357a6b3ffcfe6ce6,53410c4cba6563b2fa38c03bcc47653ce8252541,Linting: allow derived fields after base move,"Build, dependency, release tooling or documentation: no local runtime behavior port.",tools/clang-tidy/use-after-move-negative-test.c++;tools/clang-tidy/use-after-move-positive-test.c++;tools/clang-tidy/use-after-move-test.sh;tools/clang-tidy/use-after-move.c++ +53410c4cba6563b2fa38c03bcc47653ce8252541,e9f574d985f55cd05e4b818d3a8fce6ef563a779,Linting: narrow use-after-move macro exemptions,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/io/frankenvalue.h;tools/clang-tidy/use-after-move-negative-test.c++;tools/clang-tidy/use-after-move-positive-test.c++;tools/clang-tidy/use-after-move-test.sh;tools/clang-tidy/use-after-move.c++;tools/clang-tidy/use-after-move.h +e9f574d985f55cd05e4b818d3a8fce6ef563a779,f9d2ffabc14f554b08acfa7c9e399f66b28678a3,Use after move: use RemotePromise::releaseParts(),Native Capn Proto RemotePromise ownership; Capn Web has a separate transport implementation.,src/workerd/api/capnp.c++;src/workerd/api/worker-rpc.c++ +f9d2ffabc14f554b08acfa7c9e399f66b28678a3,ff5defb046d088bda6236cc912cbc735c3037be7,Linting: reject more use-after-moves,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.clang-tidy;tools/clang-tidy/BUILD.bazel;tools/clang-tidy/BUILD.headers;tools/clang-tidy/use-after-move-negative-test.c++;tools/clang-tidy/use-after-move-positive-test.c++;tools/clang-tidy/use-after-move-test.sh;tools/clang-tidy/use-after-move.c++;tools/clang-tidy/use-after-move.h;tools/clang-tidy/workerd-lint.c++ +ff5defb046d088bda6236cc912cbc735c3037be7,7019d97e049c3c948b43b89bad1fed7a17b7875a,Use after move: double moved traceContext.,Native observability/lifetime or tests: local public no-op tracing handled separately; no observer delivery backend.,src/workerd/api/kv.c++ +7019d97e049c3c948b43b89bad1fed7a17b7875a,7a7ad836d7846d6442724bff1f3c9cf2fec26568,Potential use after move: fix argument evaluation order,Native AbortSignal argument move-order correction; JavaScript evaluation order and host signal implementation already apply.,src/workerd/api/basics.c++ +7a7ad836d7846d6442724bff1f3c9cf2fec26568,5719a46af4bec666bfa76d2c22ace9ab218af02f e1070b16d2e602bc66196bdc3db101b8781f3a19,Merge pull request #7522 from cloudflare/maizatskyi/2026-09-25-update-capnproto,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +e1070b16d2e602bc66196bdc3db101b8781f3a19,5719a46af4bec666bfa76d2c22ace9ab218af02f,update capnp-cpp and use kj::StaticArrayPtr for static tables,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",AGENTS.md;build/deps/gen/deps.MODULE.bazel;build/wd_cc_embed.bzl;src/workerd/api/crypto/crypto.c++;src/workerd/api/crypto/crypto.h;src/workerd/io/per-isolate-bootstrap.c++;src/workerd/util/autogate.h +ae9db71bdab6d067b2d78d6780d6a3e66576e1a8,115e0b0e58093e141a01679428eb559b238d3ba4,Refine promise resolution ticks to match standard/node,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/transform.ts;src/per_isolate/webstreams/writable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/pull-timing.js;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/main.js;src/tests/streams/readable/source-algorithms.js;src/tests/streams/transform/AGENTS.md;src/tests/streams/transform/main.js;src/tests/streams/transform/transformer-algorithms.js;src/tests/streams/writable/AGENTS.md;src/tests/streams/writable/main.js;src/tests/streams/writable/sink-algorithms.js +5719a46af4bec666bfa76d2c22ace9ab218af02f,dbc56cfb0e4eea2f2a932ead98e8677ef54b8f40,fix: handle exceptions thrown in TCP connect() handler,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/server-test.c++;src/workerd/server/server.c++ +115e0b0e58093e141a01679428eb559b238d3ba4,dbc56cfb0e4eea2f2a932ead98e8677ef54b8f40,Settle a TransformStream cancel from the writable's state,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/transform.ts;src/tests/streams/transform/AGENTS.md;src/tests/streams/transform/cancel-matrix.js;src/tests/streams/transform/cancel-outcomes.js;src/tests/streams/transform/main.js;src/tests/streams/transform/terminate.js;src/tests/streams/transform/transform-modules.capnp +dbc56cfb0e4eea2f2a932ead98e8677ef54b8f40,b9fb2374aef1ca09f5a492e65d5320541125af43 757419a73abd634d278b5c8db2a52a4d2bd1abe2,Merge pull request #7514 from cloudflare/jolio/sqlite-suppo-ufummb,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +b9fb2374aef1ca09f5a492e65d5320541125af43,f4ebbae6562718e53afbc3bba0f882266bd89529 275f7b2a47e95109c9d51a2b8ee6fc5ef7ff4782,Merge pull request #7404 from cloudflare/jolio/adopt-kj-asy-23sm7r,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +f4ebbae6562718e53afbc3bba0f882266bd89529,8cb7f9abfb58951a5113025e34c0a20ed23df16b 0c8dbcfb621180a206036bee13d3fb0668a96675,Merge pull request #7361 from cloudflare/workflows-ctx-exports-workerd,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +6dec1565df779ea90b58d9e0f452647527acd458,7f87ae389ef4258f2408be4598b37cb379ddd721,STOR-5615: Align JSRPC retries with fetch around the output gate,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry.h;src/workerd/api/jsrpc-call-retry-test.c++;src/workerd/api/worker-rpc.c++ +8cb7f9abfb58951a5113025e34c0a20ed23df16b,b1724c33d90ece7a846f56f8d98161fe7cb4759e badef8b8dcf29a988f995cf7c51c38c1b078ade6,Merge pull request #7383 from cloudflare/apeacock/STOR-5615-do-retry-policy-config,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +757419a73abd634d278b5c8db2a52a4d2bd1abe2,b1724c33d90ece7a846f56f8d98161fe7cb4759e,Sqlite: support adding specific error context to internal exceptions,Native diagnostics: database context in internal SQLite exceptions; no Sentry/VFS exception tunnel in local adapter.,src/workerd/util/sqlite-test.c++;src/workerd/util/sqlite.c++;src/workerd/util/sqlite.h +b1724c33d90ece7a846f56f8d98161fe7cb4759e,baf490a0b43baf62aa94a7ca0198f90da3433957 0a3c5639d2b60f0eae1a805699c2dc61045e0d08,Merge pull request #7507 from cloudflare/jasnell/ts-streams-writable-late-size,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +0a3c5639d2b60f0eae1a805699c2dc61045e0d08,baf490a0b43baf62aa94a7ca0198f90da3433957,Validate a writable chunk's size only when it is enqueued,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/writable.ts;src/tests/streams/writable/AGENTS.md;src/tests/streams/writable/backpressure.js;src/tests/streams/writable/main.js +baf490a0b43baf62aa94a7ca0198f90da3433957,bf5bcb4d83ab738147b058b6f7aa9624f86b3bf9 b70547388c6140b5b02a559638269a137586eb39,Merge pull request #7504 from cloudflare/jasnell/ts-streams-native-tee-lock,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +0c8dbcfb621180a206036bee13d3fb0668a96675,6508ecb7d2517cff50c2d6cf086f7a28588256d6,workflows: hold Workflow storage Workers by kj::Own,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,src/workerd/server/server.c++ +6508ecb7d2517cff50c2d6cf086f7a28588256d6,6affb1537951020f80ef9c38077b9d1b6ba98bd1,workflows: keep isWorkflow with the other Durable bools,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,src/workerd/server/server.c++;src/workerd/server/server.h +6affb1537951020f80ef9c38077b9d1b6ba98bd1,46a94e8da4ec0d62abace67b391254ae54d80e80,workflows: use Miniflare's key prefix for Workflow namespaces,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,src/workerd/server/server-test.c++;src/workerd/server/server.c++ +46a94e8da4ec0d62abace67b391254ae54d80e80,acb3f35f9a43b3564a2dcb96e785bf44a210c321,workflows: don't depend on argument evaluation order for namespace key,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,src/workerd/server/server.c++ +acb3f35f9a43b3564a2dcb96e785bf44a210c321,037e10ecfbf758faa6ed5813420224a3d9f127e4,workflows: document ctx.exports Workflows implementation,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,src/workerd/server/server.c++;src/workerd/server/server.h;src/workerd/server/workerd.capnp +037e10ecfbf758faa6ed5813420224a3d9f127e4,bf5bcb4d83ab738147b058b6f7aa9624f86b3bf9,workflows: expose configured workflows on ctx.exports,Separate service: configured Workflow exports now expose a Workflow binding; local Workflow service remains unsupported.,src/workerd/api/export-loopback.h;src/workerd/server/server-test.c++;src/workerd/server/server.c++;src/workerd/server/server.h;src/workerd/server/workerd.capnp;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/rpc.ts +b70547388c6140b5b02a559638269a137586eb39,bf5bcb4d83ab738147b058b6f7aa9624f86b3bf9,Lock a closed or errored native stream on tee(),Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/tee.js +bf5bcb4d83ab738147b058b6f7aa9624f86b3bf9,0838181ef67c7706dd7eaddd938b223feb2ad5d3 bd1108c043da270a5558d0b85ba62ac446e9f54f,Merge pull request #7502 from cloudflare/jasnell/ts-streams-husk-state,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +0838181ef67c7706dd7eaddd938b223feb2ad5d3,5d1832a7fc5c16af33be9a746440cef39253b30e,Release 2026-09-25,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +5d1832a7fc5c16af33be9a746440cef39253b30e,911aada4e6c9d9527bce98258156a04387d4e093,Release the pipe source when validation fails after locking (#7498),Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/per_isolate/webstreams/readable.ts;src/tests/streams/piping/AGENTS.md;src/tests/streams/piping/api-surface.js;src/tests/streams/piping/main.js +bd1108c043da270a5558d0b85ba62ac446e9f54f,1a059cdc6aec4bba43e538065ec2e16a7921e7c3,Update comments on teed branches and simplify native detach,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts +275f7b2a47e95109c9d51a2b8ee6fc5ef7ff4782,911aada4e6c9d9527bce98258156a04387d4e093,Adopt kj::StickyFlag to simplify basic promise and fulfiller use.,"Ported: OutputGate supports multiple onBroken observers; existing observers retain first failure, later observers see latest.",src/workerd/io/BUILD.bazel;src/workerd/io/async-lock-scheduler-test.c++;src/workerd/io/async-lock-scheduler.h;src/workerd/io/io-context-abort-test.c++;src/workerd/io/io-context.c++;src/workerd/io/io-context.h;src/workerd/io/io-gate-test.c++;src/workerd/io/io-gate.c++;src/workerd/io/io-gate.h;src/workerd/io/worker.c++ +7f87ae389ef4258f2408be4598b37cb379ddd721,badef8b8dcf29a988f995cf7c51c38c1b078ade6,STOR-5615: Apply retry policy to JSRPC calls,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry.h;src/workerd/api/http.c++;src/workerd/api/http.h;src/workerd/api/jsrpc-call-retry-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h +badef8b8dcf29a988f995cf7c51c38c1b078ade6,5b48ae2376d42d7589fa3a6fdffb203a8c6f08a9,STOR-5615: Preserve retry policy on loopback namespaces,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/export-loopback.h;src/workerd/server/workerd-api.c++ +5b48ae2376d42d7589fa3a6fdffb203a8c6f08a9,fbe504f36c3429f48be57456341eff6d84f4a94a,STOR-5615: Add configurable Durable Object retry timeouts,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry-test.c++;src/workerd/api/actor-call-retry.h;src/workerd/api/actor-fetch-retry-test.c++;src/workerd/server/server-test.c++;src/workerd/server/server.c++;src/workerd/server/workerd.capnp +fbe504f36c3429f48be57456341eff6d84f4a94a,bf35727557aec3daf2547db00f70a365a244a4a5,STOR-5615: Cancel actor retries that outlast the retry timeout,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry-test.c++;src/workerd/api/actor-call-retry.c++;src/workerd/api/actor-call-retry.h;src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/http.c++;src/workerd/api/worker-rpc.c++;src/workerd/io/io-channels.h +bf35727557aec3daf2547db00f70a365a244a4a5,c412de2a64e627ca65a0d5ebff0a14a9dc599695,STOR-5615: Add configurable Durable Object retry counts,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry-test.c++;src/workerd/api/actor-call-retry.c++;src/workerd/api/actor-call-retry.h;src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/actor.c++;src/workerd/api/actor.h;src/workerd/api/export-loopback.h;src/workerd/api/http.c++;src/workerd/api/http.h;src/workerd/api/worker-rpc.c++;src/workerd/server/server-test.c++;src/workerd/server/server.c++;src/workerd/server/workerd-api.c++;src/workerd/server/workerd-api.h;src/workerd/server/workerd.capnp;src/workerd/util/autogate.h +c412de2a64e627ca65a0d5ebff0a14a9dc599695,1f6faa79bc3dfc266c3bc1d2f9149699e6c5f819,STOR-5615: Cap actor retry backoff and pin redirect semantics,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry.c++;src/workerd/api/actor-call-retry.h;src/workerd/api/actor-fetch-retry-test.c++ +911aada4e6c9d9527bce98258156a04387d4e093,84338b9898770a47fea7495ed5d443989abc4001 1f6faa79bc3dfc266c3bc1d2f9149699e6c5f819,Merge pull request #7348 from cloudflare/jmorrell/add-span-status,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +1f6faa79bc3dfc266c3bc1d2f9149699e6c5f819,84338b9898770a47fea7495ed5d443989abc4001,- Introduces a new STW event `spanUpdate` to mirror `spanOpen` and `spanClose`. Currently only supports updating `name` and `status` but could be expanded to other properties if there is ever a need.,Ported public no-op tracing Span.updateName/setStatus shape and validation; native spanUpdate delivery stays host-owned.,src/cloudflare/internal/test/instrumentation-test-helper.js;src/cloudflare/internal/test/tracing/tracing-helpers-instrumentation-test.js;src/cloudflare/internal/test/tracing/tracing-helpers-test.js;src/cloudflare/internal/tracing.d.ts;src/workerd/api/tracing.c++;src/workerd/api/tracing.h;src/workerd/io/trace-stream.c++;src/workerd/io/trace-test.c++;src/workerd/io/trace.c++;src/workerd/io/trace.capnp;src/workerd/io/trace.h;src/workerd/io/tracer.c++;src/workerd/io/tracer.h;src/workerd/io/worker-interface.capnp;src/workerd/server/server.c++;types/defines/trace.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +84338b9898770a47fea7495ed5d443989abc4001,8f21ea80381bd1f18b3435044ed0465b9c0c3837 354a44cfdda95115b6931d30d7f493915826441b,Merge pull request #7497 from cloudflare/apeacock/actor-claim-after-construction,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +8f21ea80381bd1f18b3435044ed0465b9c0c3837,2854260cc733986a2970978eb99008f97c566f75 fdfeb04318a0ed9544e101c73f6b72f98cba9a81,Merge pull request #7500 from cloudflare/jasnell/ts-streams-pipe-abort-algorithm,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +2854260cc733986a2970978eb99008f97c566f75,31ff41bf0feba707adf9a270afb0bf16c0253750 7b7aa5d402a7900c224aead5a7725e69b2beb581,Merge pull request #7501 from cloudflare/jasnell/ts-streams-pipe-dest-erroring-pin,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +31ff41bf0feba707adf9a270afb0bf16c0253750,46d157f449b6af52467709dce23ea37ac50cbbc6,[build] Update boringssl,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/deps.jsonc;build/deps/gen/deps.MODULE.bazel +354a44cfdda95115b6931d30d7f493915826441b,bd8b075cb810bc10c277e11c1b526ba3966a8cbe,Claim DO retry tokens after actor construction,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h;src/workerd/io/observer.h;src/workerd/io/worker-entrypoint-test.c++;src/workerd/io/worker-entrypoint.c++;src/workerd/jsg/exception.h +1a059cdc6aec4bba43e538065ec2e16a7921e7c3,98e502f88a4be357deef678d8341f7e93ef4d843,Close a native stream at the handoff of its data,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/readable.ts;src/tests/node/stream/AGENTS.md;src/tests/node/stream/finished-and-abort.js;src/tests/node/stream/main.js;src/tests/streams/sockets/AGENTS.md;src/tests/streams/sockets/main.js;src/tests/streams/sockets/socket-streams.js +46d157f449b6af52467709dce23ea37ac50cbbc6,c61cc1a75ba072f47827db38653286d0e9b21a92,[build] Increase link parallelism again,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/kj_test.bzl;build/wd_cc_benchmark.bzl;build/wd_cc_binary.bzl;build/wd_rust_binary.bzl;build/wd_rust_proc_macro.bzl;build/wd_rust_test.bzl +c61cc1a75ba072f47827db38653286d0e9b21a92,98e502f88a4be357deef678d8341f7e93ef4d843 bd8b075cb810bc10c277e11c1b526ba3966a8cbe,Merge pull request #7430 from cloudflare/apeacock/jsrpc-call-retries,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +7b7aa5d402a7900c224aead5a7725e69b2beb581,98e502f88a4be357deef678d8341f7e93ef4d843,Pin that a pipe waits for an erroring destination's in-flight write,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/piping/AGENTS.md;src/tests/streams/piping/close-propagation.js;src/tests/streams/piping/main.js +fdfeb04318a0ed9544e101c73f6b72f98cba9a81,98e502f88a4be357deef678d8341f7e93ef4d843,Observe the pipe's AbortSignal through an abort algorithm,Native stream pipe abort algorithm; local actor cancellation already uses dependent AbortSignal through onAbort.,src/per_isolate/per_isolate-env.d.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/piping/AGENTS.md;src/tests/streams/piping/abort-signal.js;src/tests/streams/piping/main.js;src/tests/streams/piping/piping-modules.capnp;src/workerd/api/BUILD.bazel;src/workerd/api/abort-bootstrap.h;src/workerd/api/basics-test.c++;src/workerd/api/basics.c++;src/workerd/api/basics.h;src/workerd/io/per-isolate-bootstrap.c++ +98e502f88a4be357deef678d8341f7e93ef4d843,dd58d5b952a07b50b0ab33f2b890926f40ab3fa4 38cdda9435869ffc8d32a8ffbe4e964522bb12c9,Merge pull request #7463 from cloudflare/ketan/interal-build-update,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +bd8b075cb810bc10c277e11c1b526ba3966a8cbe,20e7df49ed747f2c1f604de54508fb2a96244497,STOR-5489: Retry Durable Object RPC property reads,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/jsrpc-call-observation-test.c++;src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/jsrpc-call-retry-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h +20e7df49ed747f2c1f604de54508fb2a96244497,d0615a138dc01cdec6a967ec9b48e901662407af,STOR-5489: Retry Durable Object RPC calls,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/BUILD.bazel;src/workerd/api/http.h;src/workerd/api/jsrpc-call-observation-test.c++;src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/jsrpc-call-retry-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h;src/workerd/io/observer.h;src/workerd/util/autogate.h;src/workerd/util/completion-membrane.h +d0615a138dc01cdec6a967ec9b48e901662407af,f6e4947250f0da81054b9f701481fa2384cfe755,STOR-5489: Handle committed actor retry failures,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry-test.c++;src/workerd/api/actor-call-retry.c++;src/workerd/api/actor-call-retry.h +f6e4947250f0da81054b9f701481fa2384cfe755,dd58d5b952a07b50b0ab33f2b890926f40ab3fa4,STOR-5489: Cover actor retry ambiguity,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry-test.c++ +38cdda9435869ffc8d32a8ffbe4e964522bb12c9,3173ee7bba1690e7f876e2c98092512b5df05596,Only run internal build for necessary paths,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/internal-build.yml +dd58d5b952a07b50b0ab33f2b890926f40ab3fa4,48ef4984b3705e654e93856c6ff01905432dd578,add some deserialization diagnostics (#7486),Native V8 deserializer header diagnostics; local storage codec deliberately uses a separate versioned wire format.,src/workerd/api/worker-rpc.c++;src/workerd/io/frankenvalue-test.c++;src/workerd/io/frankenvalue.c++;src/workerd/jsg/README.md;src/workerd/jsg/ser-test.c++;src/workerd/jsg/ser.c++;src/workerd/jsg/ser.h +48ef4984b3705e654e93856c6ff01905432dd578,6b39c33959747115660cb84c76d0b137448b0825 718f53105ec99d2f9f0c88b66316e6b611fa2a2f,Merge pull request #7301 from cloudflare/rinkle/RM-30088-workerd-io-task-eviction,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +6b39c33959747115660cb84c76d0b137448b0825,b1c639d1fd2b198516beaf3b6f4c4a6d671ff27b 1ff0fd78e400dfeadc018e22e583a1ca07c21e89,Merge pull request #7479 from cloudflare/jasnell/ts-streams-released-bytes-with-chunk,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +1ff0fd78e400dfeadc018e22e583a1ca07c21e89,b1c639d1fd2b198516beaf3b6f4c4a6d671ff27b,Queue the chunk before filling reads with released bytes,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/native.ts;src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/release-relock.js;src/tests/streams/readable-byte/tee.js +b1c639d1fd2b198516beaf3b6f4c4a6d671ff27b,8942c412c63cfe1109da7e4c5b3f3d2a3e1eb1dc 90c842c43ccf6dbfe0a46ade6c3472e884835bb7,Merge pull request #7478 from cloudflare/jasnell/ts-streams-held-byob-request-across-tee,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +90c842c43ccf6dbfe0a46ade6c3472e884835bb7,8942c412c63cfe1109da7e4c5b3f3d2a3e1eb1dc,Keep a byobRequest held across tee() working,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/helpers.js;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/tee.js +8942c412c63cfe1109da7e4c5b3f3d2a3e1eb1dc,47d665f79cc89d1297e7adf65d4a8ccdcdb9c589 1b9b6ea023367d92591c1b51658d89eca4b41a23,Merge pull request #7493 from cloudflare/jhoward/increase-sqlite-row-limit,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +47d665f79cc89d1297e7adf65d4a8ccdcdb9c589,920e9871ecf29e8a9db68cbc525e072e0e9ed41d 085a080322db230141863a57765f70a9ee98127a,Merge pull request #7477 from cloudflare/jasnell/ts-streams-auto-allocate-queued-reads,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +920e9871ecf29e8a9db68cbc525e072e0e9ed41d,115580d5af0d6644c264dd6afd55a135c3e17502,bump reviewer to opus 5.5,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/bigbonk.yml +115580d5af0d6644c264dd6afd55a135c3e17502,556b36c0f69fefe1f37dff254c0914e93d8f0442 733da15eda1cf03c1abcdebd95718d9732a48200,Merge pull request #7476 from cloudflare/jasnell/ts-streams-tee-slowest-backpressure,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +556b36c0f69fefe1f37dff254c0914e93d8f0442,91437b139233fd06ba2dcdda142503eafc37b0f5,Collect coverage from tests that run the Rust workerd binary,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.bazelrc;build/deps/build_deps.jsonc;build/deps/gen/build_deps.MODULE.bazel;build/wd_rust_binary.bzl;patches/rules_rust/0001-Propagate-coverage-info-through-link_deps.patch +91437b139233fd06ba2dcdda142503eafc37b0f5,e03943a61167dd5b9981d109a1a35eebc24a0071,Update the docs and comments that name the CLI's files,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",docs/jsg.md;src/rust/AGENTS.md;src/rust/cxx/kj-rs-io/async-io.c++;src/rust/cxx/kj-rs-io/async-io.h;src/rust/cxx/kj-rs-io/lib.rs;src/rust/cxx/kj-rs-io/signal.rs;src/rust/cxx/kj-rs-io/watcher.rs;src/workerd/server/AGENTS.md;src/workerd/server/server.h;src/workerd/server/workerd.capnp;src/workerd/util/setup-async-io-test.c++ +e03943a61167dd5b9981d109a1a35eebc24a0071,3b71d19db3127ccb948b7c53f9294e8cd3c7ae9c,Make workerd's entry point Rust,Native workerd CLI moved to Rust; library runtime has no CLI/bootstrap implementation to port.,.clang-tidy;src/workerd/server/BUILD.bazel;src/workerd/server/cli-main.c++;src/workerd/server/cli-main.h;src/workerd/server/cli/args.rs;src/workerd/server/cli/bridge.rs;src/workerd/server/cli/config.rs;src/workerd/server/cli/lib.rs;src/workerd/server/cli/process.rs;src/workerd/server/cli/socket_fd.rs;src/workerd/server/cli/socket_fd/unix.rs;src/workerd/server/cli/socket_fd/windows.rs;src/workerd/server/cli/watch.rs;src/workerd/server/config-compiler.c++;src/workerd/server/config-compiler.h;src/workerd/server/schema-file.h;src/workerd/server/workerd.rs +3b71d19db3127ccb948b7c53f9294e8cd3c7ae9c,fdc4611e6d8572663cc2f830094f79bcef02bfd8,Rename workerd.c++ to cli-main.c++,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/server/BUILD.bazel;src/workerd/server/cli-main.c++ +fdc4611e6d8572663cc2f830094f79bcef02bfd8,578972cf1c3ae7af90a4ad77a0c6f4a50c5f1950,Move the schema-file classes out of workerd.c++,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/server/BUILD.bazel;src/workerd/server/schema-file.c++;src/workerd/server/schema-file.h;src/workerd/server/workerd.c++ +578972cf1c3ae7af90a4ad77a0c6f4a50c5f1950,28a0e03930fd0683681cc8bf3da47f8eabb45a32,kj-rs-io: expose the file watcher and error text to Rust callers,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/kj-rs-io/error.rs;src/rust/cxx/kj-rs-io/lib.rs +28a0e03930fd0683681cc8bf3da47f8eabb45a32,6ade48f76daa8329ad5876cad785a4c26318223f,"kj-rs-io: ""loopback:"" addresses, used by `workerd test`","Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/AGENTS.md;src/rust/cxx/kj-rs-io/async-io.c++;src/rust/cxx/kj-rs-io/async-io.h;src/rust/cxx/kj-rs-io/ffi.rs;src/rust/cxx/kj-rs-io/lib.rs;src/rust/cxx/kj-rs-io/loopback.rs;src/rust/cxx/kj-rs-io/net.rs;src/rust/cxx/kj-rs-io/tests/async-io-test.c++;src/workerd/server/workerd.c++ +085a080322db230141863a57765f70a9ee98127a,cb14d558d712aa1833c7a8f865f0f79b99030cc9,Take queued bytes whole on auto-allocate default reads,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/byob-reader.js;src/tests/streams/readable-byte/main.js +6ade48f76daa8329ad5876cad785a4c26318223f,cb14d558d712aa1833c7a8f865f0f79b99030cc9,Release 2026-09-24,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +733da15eda1cf03c1abcdebd95718d9732a48200,cb14d558d712aa1833c7a8f865f0f79b99030cc9,Document and pin slowest-branch tee backpressure,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/AGENTS.md;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/main.js;src/tests/streams/readable/tee.js +1b9b6ea023367d92591c1b51658d89eca4b41a23,c889d1dd2322420cb5c58740dc28ab20b6a7f681,Increase the SQLite row limit to 8 MiB,Ported: SQLite length limit 8 MiB + 34 bytes; shared constant reaches Node and WASM adapters.,src/workerd/io/actor-sqlite-test.c++;src/workerd/util/sqlite-kv-test.c++;src/workerd/util/sqlite.c++;src/workerd/util/sqlite.h +cb14d558d712aa1833c7a8f865f0f79b99030cc9,78d4a26acbe6bc970a627607db288bd41a9f4857 3dbc959b4d47a52584598a771e14d11e83e645e7,Merge pull request #7475 from cloudflare/jasnell/ts-streams-async-iterator-order,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +3dbc959b4d47a52584598a771e14d11e83e645e7,78d4a26acbe6bc970a627607db288bd41a9f4857,Pin async iterator interleavings that follow WebIDL,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/async-iteration.js;src/tests/streams/readable/main.js +718f53105ec99d2f9f0c88b66316e6b611fa2a2f,d02b8e4e643af94e572d8d429ce146ddaa5b89ab,Add actor wait-until task lifetime tracking,"Host seam: optional per-waitUntil lifetime handles for eviction policy; local task count and drain already exist, no bounded eviction service.",src/workerd/io/BUILD.bazel;src/workerd/io/io-context-task-test.c++;src/workerd/io/io-context.c++;src/workerd/io/worker.c++;src/workerd/io/worker.h;src/workerd/tests/test-fixture.c++;src/workerd/tests/test-fixture.h +d02b8e4e643af94e572d8d429ce146ddaa5b89ab,78d4a26acbe6bc970a627607db288bd41a9f4857,Add Durable Object I/O task eviction compat flag,Host policy: introduces opt-in eviction tracking flag; optional native WaitUntilTaskTracker has no local policy owner.,src/workerd/io/compatibility-date-test.c++;src/workerd/io/compatibility-date.capnp +78d4a26acbe6bc970a627607db288bd41a9f4857,fcf94867d5f30a404f18f38a36322172e989aece acec568cd3960ca2c6dca3e145fa6dbd935a2018,Merge pull request #7474 from cloudflare/jasnell/ts-streams-resizable-buffers,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +fcf94867d5f30a404f18f38a36322172e989aece,dafe64028652bb04dbec82dd0fd833e16c762972,Skip building an unobservable XThreadWaitList rejection,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/util/wait-list-test.c++;src/workerd/util/wait-list.c++;src/workerd/util/wait-list.h;src/workerd/util/xthread-wait-list-test.c++ +acec568cd3960ca2c6dca3e145fa6dbd935a2018,dafe64028652bb04dbec82dd0fd833e16c762972,Transfer byte-stream buffers to fixed length,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/per_isolate/primordials.ts;src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/node/net/AGENTS.md;src/tests/node/net/main.js;src/tests/node/net/onread.js;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/buffer-lifecycle.js;src/tests/streams/readable-byte/main.js +dafe64028652bb04dbec82dd0fd833e16c762972,3447953857c69665a8a35cbad27ec9b594b44531 d5856b89723f092bb9c28de76aced860e26f4bba,Merge pull request #7473 from cloudflare/jasnell/ts-streams-branch-error-callback,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +3447953857c69665a8a35cbad27ec9b594b44531,c889d1dd2322420cb5c58740dc28ab20b6a7f681 65e5eb999202e78b29dba6628f59ee5e81026b05,Merge pull request #7492 from cloudflare/websearch-forward-account-id,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +d5856b89723f092bb9c28de76aced860e26f4bba,9ae1f7fb12cab3cf77334973e7c0b07c6894bd8f,One additional node streams test,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/stream/AGENTS.md;src/tests/node/stream/finished-and-abort.js;src/tests/node/stream/main.js +65e5eb999202e78b29dba6628f59ee5e81026b05,13489ec2b2158fb5bc7e8183f7223fd53ea6d767,Use a class-based AI RPC mock,Ambient/service type contract or tests: supplied by updated Workers types; no matching local service implementation.,src/cloudflare/internal/test/ai/ai-mock.js +13489ec2b2158fb5bc7e8183f7223fd53ea6d767,9022f4dc45485e2b2fc619171674ae7065b6213c,Format web search mock,Ambient/service type contract or tests: supplied by updated Workers types; no matching local service implementation.,src/cloudflare/internal/test/ai/ai-mock.js +9022f4dc45485e2b2fc619171674ae7065b6213c,c889d1dd2322420cb5c58740dc28ab20b6a7f681,Forward web search RPC params,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,src/cloudflare/internal/ai-api.ts;src/cloudflare/internal/test/ai/ai-api-test.js;src/cloudflare/internal/test/ai/ai-mock.js +9ae1f7fb12cab3cf77334973e7c0b07c6894bd8f,71b390c76ed3ea55f71dea99765e31b9d3873d04,Additional refinement on the ts streams tee error handling,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/controller.js;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/tee.js +71b390c76ed3ea55f71dea99765e31b9d3873d04,a3d517dc0e1b90f824c8eb204a2a1e2a8551fd86,Place readableStreamErrorBranch ahead of the tee dispatch comment,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts +a3d517dc0e1b90f824c8eb204a2a1e2a8551fd86,c889d1dd2322420cb5c58740dc28ab20b6a7f681,Error a tee branch or detached byte stream on a fractional fill at close,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/controller.js;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/tee.js +c889d1dd2322420cb5c58740dc28ab20b6a7f681,b57a78af8b44cc0fa46edae495d6f5724cc97282 1c246981e264c05b623c692b1773baafc5d61b24,Merge pull request #7434 from cloudflare/jolio/use-weak-sel-6oxbqz,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +b57a78af8b44cc0fa46edae495d6f5724cc97282,cb62c89890547cfcceb1907485f50c4b9bc732ab 071cd12005c8b3ab9032e8c60c6b27d3104a2d10,Merge pull request #7472 from cloudflare/maizatskyi/2026-09-22-update-capnproto,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +cb62c89890547cfcceb1907485f50c4b9bc732ab,62935d76771b2361e507c7f18f064c5bab43c314 9ae136fa0b9c7ecb8557f0405cb6ae34366f5643,Merge pull request #7484 from cloudflare/apeacock/jsrpc-retry-buffer-capacity,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +62935d76771b2361e507c7f18f064c5bab43c314,c3f0074f43314583ea2ffd5da218a0dbb5a5451b,[o11y] Add `undefined` to tailStream return types,"Ambient type widening: tailStream may return undefined; supplied by Workers types pin, no local tail-stream service.",src/workerd/api/global-scope.h;types/defines/rpc.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +c3f0074f43314583ea2ffd5da218a0dbb5a5451b,3b647746ae45364834fd04cc7e0228c22496dff5 2ff63bad390cd746fcf8b7fccf501ea80642d8f6,Merge pull request #7470 from danielmlr/fix/message-event-init-null-source,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +071cd12005c8b3ab9032e8c60c6b27d3104a2d10,3b647746ae45364834fd04cc7e0228c22496dff5,capnproto update,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",build/deps/gen/deps.MODULE.bazel;src/rust/cxx/gen/src/write.rs;src/rust/cxx/kj-rs/maybe.rs;src/rust/cxx/kj-rs/refcount.rs;src/rust/cxx/kj-rs/tests/lib.rs;src/rust/cxx/kj-rs/tests/test-refcount.c++;src/rust/cxx/kj-rs/tests/test-refcount.h;src/rust/cxx/kj-rs/tests/test_refcount.rs +3b647746ae45364834fd04cc7e0228c22496dff5,d93eab6d391f4c4c153f15c80e4f6ca205fbdad9 2d6fc5717647cc48f78490f24ce27d05c53dc653,Merge pull request #7481 from cloudflare/maizatskyi/2026-09-22-tsan-history,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +d93eab6d391f4c4c153f15c80e4f6ca205fbdad9,db6465f24cdd4901dbe5cba2ee081f7ead254e13 40507849dc4bf8b74cfc76b775a67541c2ee75bf,Merge pull request #7487 from cloudflare/trubini/fix_udp_connect_tracer,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +db6465f24cdd4901dbe5cba2ee081f7ead254e13,9be8b36835484f0466509fd9cc657f8fef3e8c86,Merge pull request #7450 from Phanatic/aig-web-search,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,src/cloudflare/internal/ai-api.ts;src/cloudflare/internal/test/ai/ai-api-test.js;src/cloudflare/internal/test/ai/ai-mock.js;types/defines/ai.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/ai.ts +40507849dc4bf8b74cfc76b775a67541c2ee75bf,18d3f94faa272849073107bcb8db17072a06637e,fix: avoid initializing the UDP connect tracer twice,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.c++ +9be8b36835484f0466509fd9cc657f8fef3e8c86,9a6bd998223b6ca755bce8d66e687dcec6fe9ee7 7d9d512c96e5f150b576c570652c434013fd4a45,Merge pull request #7151 from cloudflare/jolio/preserve-vfs-r2y25y,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +9ae136fa0b9c7ecb8557f0405cb6ae34366f5643,d81212bae67ad29e9fab6f2cc8c4998c6f1e37a1,STOR-5489: Format serializer capacity changes,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/jsg/ser.c++;src/workerd/jsg/ser.h +d81212bae67ad29e9fab6f2cc8c4998c6f1e37a1,9a6bd998223b6ca755bce8d66e687dcec6fe9ee7,STOR-5489: Account for RPC serializer capacity,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h;src/workerd/jsg/ser.c++;src/workerd/jsg/ser.h +9a6bd998223b6ca755bce8d66e687dcec6fe9ee7,3f4f4eddc9237a4ca80530a33139999b1f295f9b 50c66ec0abf638f0734fde9b159ee8c659ddbe5e,Merge pull request #7445 from cloudflare/erikcorry/multi-group,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +3f4f4eddc9237a4ca80530a33139999b1f295f9b,86d612ef7d904e1fe49be5097f0410f7f013f69f e34b9662c7cd30e3b50f2353e439227bb05f21b6,Merge pull request #7461 from ghostwriternr/fix/local-system-image-pull,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +e34b9662c7cd30e3b50f2353e439227bb05f21b6,86d612ef7d904e1fe49be5097f0410f7f013f69f,Pull local system images before create,Separate Docker Containers service/client or tests: unrelated to local actor execution container.,src/workerd/server/container-client.c++;src/workerd/server/tests/container-client/test.js +50c66ec0abf638f0734fde9b159ee8c659ddbe5e,86d612ef7d904e1fe49be5097f0410f7f013f69f,Use fresh isolate groups when available.,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/jsg/jsg-test.h;src/workerd/jsg/modules-new-test.c++;src/workerd/jsg/multiple-typewrappers-test.c++;src/workerd/jsg/setup-test.c++;src/workerd/jsg/setup.c++;src/workerd/jsg/setup.h;src/workerd/server/server.c++;src/workerd/tests/test-fixture.c++ +86d612ef7d904e1fe49be5097f0410f7f013f69f,4bce6737323ab105890e4f69a652ef2343dde490 3e937ba26f0767d87994d8977cf741ab5ab2d084,Merge pull request #7471 from cloudflare/jasnell/ts-streams-native-tee-in-flight,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +4bce6737323ab105890e4f69a652ef2343dde490,91e4d4e2bf834cb39dc5a96aa69662e3042cad2c,Release 2026-09-23,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +3e937ba26f0767d87994d8977cf741ab5ab2d084,91e4d4e2bf834cb39dc5a96aa69662e3042cad2c,Allow tee() of a native body with an abandoned read in flight,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/native.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/tee.js;src/workerd/api/js-readable-stream-test.c++;src/workerd/api/js-readable-stream.c++;src/workerd/api/js-readable-stream.h +91e4d4e2bf834cb39dc5a96aa69662e3042cad2c,dab74a440225484c37495d3ea35e3423414c1f6f 2c5cd0a6d403e0b8dd1694a848033cab77708ab4,Merge pull request #7469 from cloudflare/jasnell/ts-streams-native-byob-elements,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +2d6fc5717647cc48f78490f24ce27d05c53dc653,dab74a440225484c37495d3ea35e3423414c1f6f,[tsan] increase tsan history,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.bazelrc +2c5cd0a6d403e0b8dd1694a848033cab77708ab4,dab74a440225484c37495d3ea35e3423414c1f6f,Deliver whole elements from native BYOB reads with multi-byte views,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/native.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/byob-reader.js;src/tests/streams/readable-byte/main.js;src/workerd/api/js-readable-stream-test.c++;src/workerd/api/js-readable-stream.c++;src/workerd/api/js-readable-stream.h +dab74a440225484c37495d3ea35e3423414c1f6f,119c71572526bbe59de89f2a6f22387766470f81 bd3e6e0e27ac50b96addf1b18def7235496935db,Merge pull request #7468 from cloudflare/jasnell/ts-streams-read-view-cancelled,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +119c71572526bbe59de89f2a6f22387766470f81,8a969e7ec0ccc1da9d577107f96f4c0177461c1a 24e18bcdda4f6277a385f90fd79fcb38d50f5505,Merge pull request #7467 from cloudflare/jasnell/ts-streams-closed-after-tail,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +bd3e6e0e27ac50b96addf1b18def7235496935db,fcb57db83a17fd673ed8b706761e5cfe263bae13,Enumerate a primitive expected value in WPT assert_object_equals,Upstream conformance/test infrastructure: host behavior; relevant local contracts verified separately.,src/wpt/harness/assertions.ts +fcb57db83a17fd673ed8b706761e5cfe263bae13,d977442d71897597af6736de4462bd4d21ba07d4,Match upstream testharness semantics in WPT assert_object_equals,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/js-compat.js;src/wpt/harness/assertions.ts;src/wpt/streams-test-ts.ts;src/wpt/streams-test.ts +d977442d71897597af6736de4462bd4d21ba07d4,8a969e7ec0ccc1da9d577107f96f4c0177461c1a,Return an empty view from read(view) on a cancelled byte stream,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/controller.js;src/tests/streams/readable-byte/main.js;src/wpt/streams-test-ts.ts;src/wpt/streams-test.ts +8a969e7ec0ccc1da9d577107f96f4c0177461c1a,3a7c0c2da4b024c841fa13ca276987dd48e2fe27 fcc475a13c21ac970437c121bf74e19b773007ea,Merge pull request #7465 from cloudflare/jasnell/ts-streams-respond-settle-order,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +24e18bcdda4f6277a385f90fd79fcb38d50f5505,48e0c97b036442a1c26d0f8fae8020931bc67a12,Correct readable-byte ledger #19: the unfilled BYOB read settles on both sides,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable-byte/AGENTS.md +48e0c97b036442a1c26d0f8fae8020931bc67a12,b4ee5bbed38d45c7761f31b2ceae682e0624a480,Pin where closed settles relative to the below-min tail read,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/read-min.js +7d9d512c96e5f150b576c570652c434013fd4a45,3a7c0c2da4b024c841fa13ca276987dd48e2fe27,Preserve VFS exceptions during SQLite open,Native VFS error tunnel: preserve callback exception during open; local database-open errors propagate from host drivers.,src/workerd/util/sqlite-test.c++;src/workerd/util/sqlite.c++ +2ff63bad390cd746fcf8b7fccf501ea80642d8f6,6c77ca7625331d17da6438d66482bccfd024aaa2,Accept a null source in MessageEventInit,Host MessageEvent accepts null source; local native MessageEvent already accepts null.,src/workerd/api/events.c++;src/workerd/api/events.h;src/workerd/api/tests/events-test.js;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +3a7c0c2da4b024c841fa13ca276987dd48e2fe27,5c70747654953f575cfd9853f42b903fd033e0a5 880f3cbf7a485e3ea969c23919b601ccb96ab973,Merge pull request #7431 from cloudflare/jolio/linting-impr-mjvxsi,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +880f3cbf7a485e3ea969c23919b601ccb96ab973,2aa070fe163d22d2dd9f35fd2a0cde920cceecd2,Linting(coroutine-hostile-raii): add support for co_yield AllowedAwaitables,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.clang-tidy;tools/clang-tidy/coroutine-hostile-raii-negative-test.c++;tools/clang-tidy/coroutine-hostile-raii-positive-test.c++;tools/clang-tidy/coroutine-hostile-raii-test.sh;tools/clang-tidy/coroutine-hostile-raii.c++ +2aa070fe163d22d2dd9f35fd2a0cde920cceecd2,ae37de62cdb89f5f2e9bd6124df604d53f77024f,Linting: improve coroutine-hostile-raii test to check declaration nodes too,"Build, dependency, release tooling or documentation: no local runtime behavior port.",tools/clang-tidy/BUILD.bazel;tools/clang-tidy/coroutine-hostile-raii-negative-test.c++;tools/clang-tidy/coroutine-hostile-raii-positive-test.c++;tools/clang-tidy/coroutine-hostile-raii-test.sh;tools/clang-tidy/coroutine-hostile-raii.c++ +ae37de62cdb89f5f2e9bd6124df604d53f77024f,0b5ed149cbc378023226b01f03cb04b77501829a,Linting: reformat LLVM upstream coroutine-hostile-raii check,"Build, dependency, release tooling or documentation: no local runtime behavior port.",tools/clang-tidy/coroutine-hostile-raii.c++;tools/clang-tidy/coroutine-hostile-raii.h +0b5ed149cbc378023226b01f03cb04b77501829a,5c70747654953f575cfd9853f42b903fd033e0a5,Linting: import LLVM coroutine-hostile-raii check,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.clang-tidy;tools/clang-tidy/BUILD.bazel;tools/clang-tidy/BUILD.headers;tools/clang-tidy/coroutine-hostile-raii.c++;tools/clang-tidy/coroutine-hostile-raii.h;tools/clang-tidy/workerd-lint.c++ +fcc475a13c21ac970437c121bf74e19b773007ea,b4ee5bbed38d45c7761f31b2ceae682e0624a480,Settle the head read first when respond() leaves a remainder,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/respond.js +5c70747654953f575cfd9853f42b903fd033e0a5,b4ee5bbed38d45c7761f31b2ceae682e0624a480,[build] Apply formatters to custom clang-tidy checks,Separate Docker Containers service/client or tests: unrelated to local actor execution container.,.devcontainer/devcontainer.json;.vscode/settings.json;build/deps/deps.schema.json;src/workerd/api/tests/opennextjs/src/wrangler.jsonc;tools/clang-tidy/angled-includes.c++;tools/clang-tidy/angled-includes.h;tools/clang-tidy/consume.c++;tools/clang-tidy/consume.h;tools/clang-tidy/promise-ignore-result.c++;tools/clang-tidy/promise-ignore-result.h;tools/clang-tidy/tests/unsafe-continuation-capture-test.c++;tools/clang-tidy/unsafe-continuation-capture.c++;tools/clang-tidy/unsafe-continuation-capture.h;tools/clang-tidy/visit-for-gc.c++;tools/clang-tidy/visit-for-gc.h;tools/clang-tidy/workerd-lint.c++;tools/cross/format.json;tools/windows/vsconfig.json;types/tsconfig.json +b4ee5bbed38d45c7761f31b2ceae682e0624a480,6c77ca7625331d17da6438d66482bccfd024aaa2 0ed2e1ef961d77593aed9295d465e4a57292ae92,Merge pull request #7426 from cloudflare/jasnell/ts-streams-cursor-walk,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +6c77ca7625331d17da6438d66482bccfd024aaa2,52ea4cfc840ceb016766ce5e64f2e1f69a3dda25 d1cee9e1cc2ccfef3e3d5807a39c3ddce616831f,Merge pull request #7298 from cloudflare/jasnell/js-rpc-streams-cancelation,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +0ed2e1ef961d77593aed9295d465e4a57292ae92,774bf15c40e991fc3580fb16d46aa6145dc9e7d2,Address cursor update review feedback,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/gc.js;src/tests/streams/readable-byte/main.js;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/main.js;src/tests/streams/readable/then-interceptors.js +52ea4cfc840ceb016766ce5e64f2e1f69a3dda25,1b2ece40cbd19519aecf189a2be8fb70083da6da 1e91b8264cd93a41b3cc694d8c24090f9a9aa6a5,Merge pull request #7303 from cloudflare/harris/2026-09-10-portable-skill-references,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +774bf15c40e991fc3580fb16d46aa6145dc9e7d2,3173ee7bba1690e7f876e2c98092512b5df05596,Walk the queued stream's cursors by index and skip the pinned cursor's deref,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/gc.js;src/tests/streams/readable/main.js +1b2ece40cbd19519aecf189a2be8fb70083da6da,3173ee7bba1690e7f876e2c98092512b5df05596,update dependencies to latest version,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/bigbonk.yml;.github/workflows/bonk.yml;.github/workflows/new-pr-review.yml;build/deps/gen/build_deps.MODULE.bazel;build/deps/gen/deps.MODULE.bazel;deps/rust/Cargo.lock +3173ee7bba1690e7f876e2c98092512b5df05596,e3a857711ea72f5ea67237a32b373f082365bec6 93280aa0d7c24b1fc2b3d22272bc00daf032506f,Merge pull request #7408 from cloudflare/apeacock/jsrpc-replay-memory-observation,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +e3a857711ea72f5ea67237a32b373f082365bec6,cb01bb63d94f5a0023f7319c961659147a70dd74,r2-rpc.c++: Copy put bodies out of the sandbox for MPK,Separate R2 native RPC body MPK ownership; no R2 service or native sandbox allocator locally.,src/workerd/api/r2-rpc.c++ +93280aa0d7c24b1fc2b3d22272bc00daf032506f,cb01bb63d94f5a0023f7319c961659147a70dd74,STOR-5489: Measure Durable Object RPC replay memory,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/jsrpc-call-observation-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h;src/workerd/io/observer.h +cb01bb63d94f5a0023f7319c961659147a70dd74,c22e7ae3b5e2fc5fc1cf382eee0110550497668d 9532cb4d93c289a71039ebea894539ce4033b82c,Merge pull request #7346 from cloudflare/apeacock/jsrpc-call-observation,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +9532cb4d93c289a71039ebea894539ce4033b82c,1c0ddb76a1bce77d736782b80de4b95da927af35,STOR-5489: Observe Durable Object RPC call attempts,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/BUILD.bazel;src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/actor-state.c++;src/workerd/api/actor.h;src/workerd/api/bench-jsrpc-sender.c++;src/workerd/api/fetch-body-rewindable-test.c++;src/workerd/api/http.c++;src/workerd/api/http.h;src/workerd/api/jsrpc-call-observation-test.c++;src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h;src/workerd/io/observer.h +1c0ddb76a1bce77d736782b80de4b95da927af35,c22e7ae3b5e2fc5fc1cf382eee0110550497668d,Add a per-attempt observer for outgoing actor RPC calls,Distributed retry observability: per-attempt RPC observer; no local retry-token/replay protocol.,src/workerd/api/actor-call-retry.h;src/workerd/io/observer.h +c22e7ae3b5e2fc5fc1cf382eee0110550497668d,761847b67636b6eaed5e0860e98772f8443bed5e,[ci] Fix automated deps update,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/update-deps.py +761847b67636b6eaed5e0860e98772f8443bed5e,e464148c744d0fd2caacc8e8662ec856852a2216,Release 2026-09-22,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +e464148c744d0fd2caacc8e8662ec856852a2216,3b946b9acc3ae3f141e90c567efe0a08310b843e 54de095daa62c03fc1e1fa23a4838bc3af2fa615,Merge pull request #7425 from cloudflare/jasnell/ts-streams-decompression-delivery,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +d1cee9e1cc2ccfef3e3d5807a39c3ddce616831f,ea50171cdd4b5ea936f026d1f182aa9442810e00,Implement proper js rpc stream cancel propagation,Native RPC stream pump cancellation; Capn Web transport and host WHATWG streams do not use KJ stream membranes.,docs/streams.md;src/workerd/api/js-readable-stream.c++;src/workerd/api/js-writable-stream.c++;src/workerd/api/streams/common.h;src/workerd/api/streams/internal.c++;src/workerd/api/streams/readable.c++;src/workerd/api/streams/standard.c++;src/workerd/api/streams/writable.c++;src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/js-rpc-streams-cancellation-test.js;src/workerd/api/tests/js-rpc-streams-cancellation-test.wd-test;src/workerd/io/io-context.h;src/workerd/io/worker-interface.capnp;src/workerd/util/autogate.h +3b946b9acc3ae3f141e90c567efe0a08310b843e,92069bfbb93b2ff368fb9e626abea1e84aeba4a3,Remove the C++ I/O backend (--//:io_backend=cxx),Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/_bazel.yml;.github/workflows/test.yml;BUILD.bazel;build/fixtures/rust_io_link_check.sh;build/kj_test.bzl;build/rust_io_backend.bzl;build/rust_io_graph_check.sh;compile_flags.txt;justfile;src/rust/cxx/kj-rs-io/BUILD.bazel;src/rust/cxx/kj-rs-io/async-io.c++;src/rust/cxx/kj-rs-io/async-io.h;src/rust/cxx/kj-rs-io/lib.rs;src/rust/cxx/kj-rs-io/signal.rs;src/rust/cxx/kj-rs-io/tests/file-watcher-test.c++;src/rust/cxx/kj-rs-io/watcher.rs;src/workerd/server/AGENTS.md;src/workerd/server/BUILD.bazel;src/workerd/server/cli-io-backend.c++;src/workerd/server/cli-io-backend.h;src/workerd/server/workerd.c++;src/workerd/util/AGENTS.md;src/workerd/util/BUILD.bazel;src/workerd/util/setup-async-io-test.c++;src/workerd/util/setup-async-io.c++ +54de095daa62c03fc1e1fa23a4838bc3af2fa615,cc10f59281826af6b5309f5418fb0051bf24ba69,Stop the compression drain when its enqueue tears the pair down,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/compression.ts;src/tests/streams/compression/AGENTS.md;src/tests/streams/compression/main.js;src/tests/streams/compression/reentrancy.js;src/workerd/api/compression.c++;src/workerd/api/compression.h +92069bfbb93b2ff368fb9e626abea1e84aeba4a3,c13a060e3cbbb1ac16b9ad233b61dc36ff3b84b8,build: let Rust crates live beside the C++ they belong to,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",.bazelrc;BUILD.bazel;build/rust_lint.bazelrc;build/wd_rust_binary.bzl;build/wd_rust_crate.bzl;clippy.toml;justfile;rustfmt.toml;src/rust/AGENTS.md;src/rust/BUILD.bazel +c13a060e3cbbb1ac16b9ad233b61dc36ff3b84b8,db31f1d0daec6b490cf074673de03e66dd2eaf42,Fix the UBSan reports from the asan CI lane,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,build/deps/gen/deps.MODULE.bazel;src/rust/jsg/ffi.c++;src/workerd/api/node/buffer.c++ +db31f1d0daec6b490cf074673de03e66dd2eaf42,8d4cbe664916a03a00a6ea0095cc18be6be0c465,build: enable UBSan in --config=asan,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.bazelrc +8d4cbe664916a03a00a6ea0095cc18be6be0c465,ea50171cdd4b5ea936f026d1f182aa9442810e00,build: instrument Rust under --config=asan,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",.bazelrc;build/deps/rust.MODULE.bazel;build/rust/BUILD.bazel;build/rust/build_std.bzl;build/rust/build_std.sh;build/rust/sanitizer_toolchain.bzl;build/rust/tsan_toolchain.bzl;src/rust/asan/BUILD.bazel;src/rust/asan/heap_buffer_overflow.rs;src/rust/cxx-integration-test/BUILD.bazel;src/rust/cxx-integration-test/lib.rs;src/rust/cxx/AGENTS.md +ea50171cdd4b5ea936f026d1f182aa9442810e00,5adb86cba92689e7b7d46a2a97b93b041318dbce,Make snapshotContainer options optional (#7453),Separate Docker Containers service/client or tests: unrelated to local actor execution container.,src/workerd/api/container.c++;src/workerd/api/container.h;src/workerd/server/tests/container-client/test.js;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +cc10f59281826af6b5309f5418fb0051bf24ba69,8d99027b9569b4dd19181d6fa4608f8cb2bf5cac,Queue the compression streams' output in bounded pieces per write,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/compression.ts;src/tests/streams/compression/AGENTS.md;src/tests/streams/compression/delivery-shape.js;src/tests/streams/compression/draining-reader.js;src/workerd/api/compression.c++;src/workerd/api/compression.h;src/workerd/util/ring-buffer-test.c++;src/workerd/util/ring-buffer.h +1c246981e264c05b623c692b1773baafc5d61b24,b93fa71f0b143e5f4fe4c116c107b62c6d49e92f,Use weak self captures for refcounted continuations,Native lifetime fix: weak captures for KJ continuations; local GC owns references and run rechecks context abort.,src/workerd/api/queue.c++;src/workerd/io/actor-sqlite.c++;src/workerd/io/io-channels.c++;src/workerd/io/io-context.h;src/workerd/server/channel-token-test.c++;src/workerd/server/server.c++ +8d99027b9569b4dd19181d6fa4608f8cb2bf5cac,ebac9b83d0c323cc822c54a22a25e584cd2fbe01,Deliver the compression streams' output to the readable in bounded pieces,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/compression.ts;src/tests/streams/compression/AGENTS.md;src/tests/streams/compression/compression-modules.capnp;src/tests/streams/compression/delivery-shape.js;src/tests/streams/compression/draining-reader.js;src/tests/streams/compression/main.js +ebac9b83d0c323cc822c54a22a25e584cd2fbe01,5adb86cba92689e7b7d46a2a97b93b041318dbce,Buffer the compression stage's output in blocks released as they are pulled,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/workerd/api/BUILD.bazel;src/workerd/api/compression-test.c++;src/workerd/api/compression.c++;src/workerd/api/compression.h +5adb86cba92689e7b7d46a2a97b93b041318dbce,d97bb1f730b483c1312a59ad48cfca9cf605ef0d c896040bc0a0a142538feb2502a0d873d2a2dec7,Merge pull request #7424 from cloudflare/jasnell/ts-streams-body-consumption-oom,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +d97bb1f730b483c1312a59ad48cfca9cf605ef0d,f44359f2f99aeff10e0615433a3fa514a0205862,[build] Silence clang-22 warnings in 3rd party code,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.bazelrc +f44359f2f99aeff10e0615433a3fa514a0205862,e1d1d7e50198d128690edce3e1c53087e986736a,[build] Fix libc++/libunwind package names,Separate Docker Containers service/client or tests: unrelated to local actor execution container.,.bazelrc;.devcontainer/Dockerfile;.github/actions/setup-runner/action.yml;Dockerfile.release;README.md;cfsetup.yaml;justfile +e1d1d7e50198d128690edce3e1c53087e986736a,540e88fe7c122c01088c035208487eeab746c803,[build] Update to LLVM 22,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.bazelrc;.devcontainer/Dockerfile;.devcontainer/devcontainer.json;.github/actions/setup-runner/action.yml;.github/workflows/_bazel.yml;.github/workflows/_wpt.yml;.github/workflows/bigbonk.yml;.github/workflows/bonk.yml;.github/workflows/codspeed.yml;.github/workflows/compat-flag-docs.yml;.github/workflows/daily-release.yml;.github/workflows/deps-updater.yml;.github/workflows/fixup.yml;.github/workflows/lint.yml;.github/workflows/new-pr-review.yml;.github/workflows/release-python-runtime.yml;.github/workflows/release-python-snapshots.yml;.github/workflows/release.yml;.github/workflows/semgrep.yml;.github/workflows/test.yml;.github/workflows/update-wpt.yml;Dockerfile.release;README.md;build/ci.bazelrc;cfsetup.yaml;docs/development.md;doxyfile;fuzzilli/README.md;justfile;src/workerd/tests/BUILD.bazel;src/workerd/tests/test-reprl.c++;tools/windows/install-deps.bat +540e88fe7c122c01088c035208487eeab746c803,18d3f94faa272849073107bcb8db17072a06637e 7ce4d6d427486a67d49407e38dcf4f45c8f1425a,Merge pull request #7416 from cloudflare/harris/2026-09-17-v8-15.5-compatibility,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +c896040bc0a0a142538feb2502a0d873d2a2dec7,f3401e54d88b9b27d09b66e7debb69bbdf06d2d4,Pin body assembly of a chunk wider than a collection block,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/integration-body-memory.js;src/tests/streams/readable/main.js +f3401e54d88b9b27d09b66e7debb69bbdf06d2d4,f7b94c6058015c6513114b249fe9d4fb7c8bd7cd,Accept SharedArrayBuffer-backed views in body consumption,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/integration-body.js +f7b94c6058015c6513114b249fe9d4fb7c8bd7cd,ea2aad5b2a1c52cd84e2e2b5484de57a67c03e8a,Refuse a declared length the memory limit cannot hold before reading,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/workerd/api/js-readable-stream-test.c++ +ea2aad5b2a1c52cd84e2e2b5484de57a67c03e8a,18d3f94faa272849073107bcb8db17072a06637e,Copy body bytes out as they arrive and cancel the source when consumption fails,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/tests/streams/encoding/AGENTS.md;src/tests/streams/encoding/body-integration.js;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/integration-body-failures.js;src/tests/streams/readable/integration-body-memory.js;src/tests/streams/readable/main.js;src/tests/streams/readable/readable-modules.capnp;src/workerd/api/js-readable-stream-test.c++ +18d3f94faa272849073107bcb8db17072a06637e,f7d869a9a1b935b2dafde1ba275e66b37e746c49 18de5f25ba997aa87ce48dbc5d28735ba88f6ffd,Merge pull request #7433 from cloudflare/trubini/udp_workers_rpc,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +f7d869a9a1b935b2dafde1ba275e66b37e746c49,8e83bcbb51a12ce51e3f7edb6f81f3cc3426bba3,Use 2 isolates for tests to exercise cross-isolate (#7447),Native two-isolate regression configuration; local same-realm runtime and Capn Web transport tested independently.,src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/abortable-fetch-test.wd-test;src/workerd/api/tests/blob-test.wd-test;src/workerd/api/tests/fetch-redirect-test.wd-test;src/workerd/api/tests/http-standard-test.wd-test;src/workerd/api/tests/js-rpc-socket-streams-ts-test.wd-test;src/workerd/api/tests/js-rpc-socket-test.wd-test;src/workerd/api/tests/js-rpc-streams-ts-test.wd-test;src/workerd/api/tests/js-rpc-test.js;src/workerd/api/tests/js-rpc-test.wd-test;src/workerd/api/tests/kv-resizable-arraybuffer-test.wd-test;src/workerd/api/tests/leak-fetch-test.wd-test;src/workerd/api/tests/queue-metadata-test.wd-test;src/workerd/api/tests/queue-metrics-sentinel-test.wd-test;src/workerd/api/tests/queue-metrics-test.wd-test;src/workerd/api/tests/queue-producer-metadata-test.wd-test;src/workerd/api/tests/queue-resizable-arraybuffer-test.wd-test;src/workerd/api/tests/r2-write-http-metadata-validation-test.wd-test;src/workerd/api/tests/response-used-body-test.wd-test;src/workerd/api/tests/ts-webstreams-test.wd-test +8e83bcbb51a12ce51e3f7edb6f81f3cc3426bba3,3ea9117c64c9fd29d734a60e066ef2872ee479aa eb076b3442b13de079e63c13dd497dfb0a40a246,Merge pull request #7446 from cloudflare/erikcorry/deflake-connect-handler,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +eb076b3442b13de079e63c13dd497dfb0a40a246,3ea9117c64c9fd29d734a60e066ef2872ee479aa,Deflake connect-handler tests,"Build, dependency, release tooling or documentation: no local runtime behavior port.",src/workerd/api/tests/BUILD.bazel +7ce4d6d427486a67d49407e38dcf4f45c8f1425a,16c681dac93f069b3622e746adecc9b810fff82b,Keep the Fast API test on TurboFan,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/jsg/fast-api-test.c++ +16c681dac93f069b3622e746adecc9b810fff82b,844b10841a1549e657923689db1bb67c5fb77f88,Silence unused JSG template warnings,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/jsg/jsg.h;src/workerd/jsg/web-idl-test.c++ +844b10841a1549e657923689db1bb67c5fb77f88,3ea9117c64c9fd29d734a60e066ef2872ee479aa,Use Promise-returning synthetic module callbacks,Native module registry callback plumbing; Worker Loader public configuration unchanged.,src/workerd/jsg/modules-new.c++;src/workerd/jsg/modules.c++ +3ea9117c64c9fd29d734a60e066ef2872ee479aa,e5c6854073477e4c475bd3ba8015a71421de10ca 0e32199bf473e5f10b7918a28a5552d88be4ead8,Merge pull request #7347 from cloudflare/apeacock/jsrpc-retry-claims,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +0e32199bf473e5f10b7918a28a5552d88be4ead8,3056c0d6936c68b35c1571321008e1447bec3179,STOR-5489: Attach retry metadata to Durable Object RPC calls,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/http.c++;src/workerd/api/http.h;src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h;src/workerd/tests/test-fixture.c++;src/workerd/tests/test-fixture.h;src/workerd/util/autogate.h +3056c0d6936c68b35c1571321008e1447bec3179,9e334ad92b682b00d16db1742f1af08645a73b4f,STOR-5489: Claim Durable Object RPC calls before dispatch,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/worker-rpc.c++ +9e334ad92b682b00d16db1742f1af08645a73b4f,e5c6854073477e4c475bd3ba8015a71421de10ca,Let TestFixture construct an actor class,Upstream C++ test fixture extension for actor task tracking; no application behavior.,src/workerd/tests/test-fixture.c++;src/workerd/tests/test-fixture.h +e5c6854073477e4c475bd3ba8015a71421de10ca,13fd9a8604db79ac58dda294956ae51accede2c7 b2ac12b35a810a10f9938f2eb1f6b17aada9e786,Merge pull request #7429 from cloudflare/gyeongjae/disable-snapshot,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +b2ac12b35a810a10f9938f2eb1f6b17aada9e786,13fd9a8604db79ac58dda294956ae51accede2c7,Add a bazel option to disable python prebuilt snapshot,"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",.bazelrc;build/config/BUILD.bazel;build/wd_test.bzl;src/pyodide/AGENTS.md;src/workerd/server/tests/python/py_wd_test.bzl +13fd9a8604db79ac58dda294956ae51accede2c7,90faec3319d87b3ca98f8f522a1cc4295538d5ef,Release 2026-09-21,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +90faec3319d87b3ca98f8f522a1cc4295538d5ef,552e0d9fb5671d43290cddf16e80c0d22a18a5cf,Release 2026-09-20,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +552e0d9fb5671d43290cddf16e80c0d22a18a5cf,16a7913467dd187f96b76ba8e334759e67ef3068 b77563644f6ebb0e09bb6ef5758a17af6b1d4631,Merge pull request #7421 from cloudflare/jasnell/ts-streams-queue-after-no-consumer,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +b77563644f6ebb0e09bb6ef5758a17af6b1d4631,6f6423754c073d4ec223c0770ada662472951d95,Address review feedback on streams changes,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/gc.js;src/tests/streams/readable-byte/main.js +6f6423754c073d4ec223c0770ada662472951d95,16a7913467dd187f96b76ba8e334759e67ef3068,Drop what a queued stream enqueues once every consumer is collected,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/gc.js;src/tests/streams/readable-byte/main.js;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/gc.js;src/tests/streams/readable/main.js +16a7913467dd187f96b76ba8e334759e67ef3068,e7b231c6dd726a8b66c71fdd11f791fbb60ccbb3 e77b962e586e2847b6dc90f12185d5309fe5c5af,Merge pull request #7417 from cloudflare/jasnell/ts-streams-transform-error-propagation,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +e77b962e586e2847b6dc90f12185d5309fe5c5af,26edffb8c3227fe002b2e05ce9adf70035fef6fb,"Drop the interopErrorHook when appropriate, fix some nits",Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/writable.ts +e7b231c6dd726a8b66c71fdd11f791fbb60ccbb3,b93fa71f0b143e5f4fe4c116c107b62c6d49e92f,Release 2026-09-19,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +26edffb8c3227fe002b2e05ce9adf70035fef6fb,b93fa71f0b143e5f4fe4c116c107b62c6d49e92f,Error both halves of a transform pair from the Node.js interop hook,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/compression.ts;src/per_isolate/webstreams/identity.ts;src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/transform.ts;src/per_isolate/webstreams/writable.ts;src/tests/node/stream/AGENTS.md;src/tests/node/stream/abort-transform-pairs.js;src/tests/node/stream/main.js;src/tests/node/stream/stream-modules.capnp +18de5f25ba997aa87ce48dbc5d28735ba88f6ffd,85928d5126f87a97d68faba45a230735ee789129,set EVENT_TYPE back to 14,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.h +85928d5126f87a97d68faba45a230735ee789129,b72c41569c3eafadc301490ca1d58765d305a4a8,support UDP events in workerd capnp server,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/server-test.c++;src/workerd/server/server.c++ +b72c41569c3eafadc301490ca1d58765d305a4a8,b93fa71f0b143e5f4fe4c116c107b62c6d49e92f,implement RPC support for inbound UDP connect() event,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.c++;src/workerd/api/sockets.h;src/workerd/io/worker-interface.capnp +b93fa71f0b143e5f4fe4c116c107b62c6d49e92f,c0c3691604192d1ae79d966ec7346fe5103e9c0c,[build] Re-enable bazel sandboxing on macOS,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/ci.bazelrc +c0c3691604192d1ae79d966ec7346fe5103e9c0c,8e4d15cdbcf50f6eda3871b8e05b678d133711e2,[nfc] Fix compiler warnings based on KJ_HEADER_WARNINGS,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/workerd/api/crypto/crypto.h;src/workerd/api/streams/common.h;src/workerd/io/actor-cache-test.c++;src/workerd/io/actor-sqlite-test.c++;src/workerd/jsg/jsvalue.h;src/workerd/jsg/util.h;src/workerd/server/server.c++ +8e4d15cdbcf50f6eda3871b8e05b678d133711e2,266d066e8bd1962e2e02cedd9718252f44aa1217,[nfc] Drop unused variables,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/api/r2-multipart.c++;src/workerd/api/worker-rpc.c++;src/workerd/jsg/modules.h;src/workerd/jsg/url.c++;src/workerd/jsg/util.c++;src/workerd/server/server.c++ +266d066e8bd1962e2e02cedd9718252f44aa1217,b7add5519b859012576e59c0b8d4a4d93525e8fc 7c183a8669e95a717c30bd6116a77488fed04cac,Merge pull request #7403 from cloudflare/jolio/document-cor-ocm4st,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +b7add5519b859012576e59c0b8d4a4d93525e8fc,973c10963095966ee2beee5587b2990ef79c4822 06f6bb3c3cda5f5b5c1cbde556c1b571a75c856b,Merge pull request #7414 from cloudflare/sol/actor-retry-policy,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +973c10963095966ee2beee5587b2990ef79c4822,1ed4b65ccdf861023a82f9639fd2d6d8d01cd67e,Add Analytics SQL binding types (#7396),Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/analytics-sql.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/analytics-sql.ts +06f6bb3c3cda5f5b5c1cbde556c1b571a75c856b,c7b5cdb96ec8c0dd5a59c5234e51fbda078f74cd,Increase actor retry backoff,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry.h +c7b5cdb96ec8c0dd5a59c5234e51fbda078f74cd,1ed4b65ccdf861023a82f9639fd2d6d8d01cd67e,Split actor retry exhaustion outcomes,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry-test.c++;src/workerd/api/actor-call-retry.c++;src/workerd/api/actor-fetch-retry-test.c++;src/workerd/io/observer.h +1ed4b65ccdf861023a82f9639fd2d6d8d01cd67e,8370bfb588f7f75995da53f0f5278088c7c0c5dc,Python: Hot fix for stack switching gc crash (upstream pyodide#6466) (#7422),"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",build/deps/pyodide.MODULE.bazel;build/python_metadata.bzl;src/pyodide/tools/patch_pyodide_asm.ts;src/workerd/server/tests/python/BUILD.bazel;src/workerd/server/tests/python/stack-switching-gc/stack-switching-gc.wd-test;src/workerd/server/tests/python/stack-switching-gc/worker.py +8370bfb588f7f75995da53f0f5278088c7c0c5dc,679c09e5eea0af8a04062e1875e99c75af532e3b ae8979d5414114127ce3cb59af28e59be074fe27,Merge pull request #7412 from cloudflare/jasnell/ts-streams-transform-write-stall,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +679c09e5eea0af8a04062e1875e99c75af532e3b,2299e4ecd2a88d62a4143dcb44663e3fa89658b4,Release 2026-09-18,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +2299e4ecd2a88d62a4143dcb44663e3fa89658b4,50c2e906f87c77bd658f16680783a4aaeccb7dcb 8e515f2ccd7634652493de776ce96319af256266,Merge pull request #7153 from cloudflare/jolio/add-coroutin-iivvz5,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +50c2e906f87c77bd658f16680783a4aaeccb7dcb,d5bc593bd5d21ad7fa2955761b92f91df131f411 ab47d9214ae7c0c4da455d12c284fffb5f31e4cd,Merge pull request #7130 from ThomasRubini/udp_handler,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +8e515f2ccd7634652493de776ce96319af256266,d5bc593bd5d21ad7fa2955761b92f91df131f411,Add coroutine-hostile-raii lint for UnwindDetector and fixes.,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,.clang-tidy;src/workerd/api/streams/standard.c++ +d5bc593bd5d21ad7fa2955761b92f91df131f411,4e5b3ec68206091e5c2eb6feed3b11f607f8a14b f257b204bb834c16c26c92fbd3156ce952110699,Merge pull request #7420 from cloudflare/maizatskyi/2026-09-17-update-capnptoro,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +ab47d9214ae7c0c4da455d12c284fffb5f31e4cd,842a58c790ba701aeaf9ae7bc1d68c34323ddbc9,remove packet truncation test on Windows,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/kj-rs-io/tests/async-io-test.c++ +842a58c790ba701aeaf9ae7bc1d68c34323ddbc9,981731730476aed0cb198f8ae5a901193bc80bfb,Add Tokio-backed UDP datagram support,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/rust/cxx/kj-rs-io/async-io.c++;src/rust/cxx/kj-rs-io/async-io.h;src/rust/cxx/kj-rs-io/ffi.rs;src/rust/cxx/kj-rs-io/lib.rs;src/rust/cxx/kj-rs-io/net.rs;src/rust/cxx/kj-rs-io/tests/async-io-test.c++ +f257b204bb834c16c26c92fbd3156ce952110699,4e5b3ec68206091e5c2eb6feed3b11f607f8a14b,update capnproto,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,build/deps/gen/deps.MODULE.bazel;src/workerd/api/streams/queue.c++;src/workerd/api/streams/queue.h +4e5b3ec68206091e5c2eb6feed3b11f607f8a14b,92b0c1d20e05850be7e2287ea593c6cdc7ae1f04 e47b503fb7ff83984efced4e5feb8c850e7450ac,Merge pull request #7386 from cloudflare/dominik/v8-15-4,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +92b0c1d20e05850be7e2287ea593c6cdc7ae1f04,688ba58e46eb1257ed0bdca9d5ccffa8a3b7e11c a02d77e23033d495069e9ef79b881ef4935d393d,Merge pull request #7415 from cloudflare/maizatskyi/2026-09-17-clangd,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +981731730476aed0cb198f8ae5a901193bc80bfb,4a9561ac785daef39a92bea39801c57d59a80170,remove new types from non-experimental types snapshot,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.h;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +4a9561ac785daef39a92bea39801c57d59a80170,6b1833e291224bef6e5a727a1afc8b95ea5b00fe,ensure `Datagram` and `Socket::protocol` are only available with the experimental flag,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/global-scope.h;src/workerd/api/sockets-test.c++;src/workerd/api/sockets.h;src/workerd/api/tests/global-scope-test.js +6b1833e291224bef6e5a727a1afc8b95ea5b00fe,be695a6f5417e19710e952c1748e0f9e09259a9e,reduce udp socket timeout to be lower than test harness timeout,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/tests/udp-datagram-drop/config.capnp +be695a6f5417e19710e952c1748e0f9e09259a9e,9b6f6f93b2fb80bb1ad23090ff91cd93f8ca57d5,ensure datagram channel gets destroyed on the right thread,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.c++ +9b6f6f93b2fb80bb1ad23090ff91cd93f8ca57d5,d908992713a4fbeba8f40d74488fe9a01e8ef8ae,fix test for large datagrams to work on macOS,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/tests/udp-connect-ts-streams/driver.mjs;src/workerd/server/tests/udp-connect/driver.mjs +d908992713a4fbeba8f40d74488fe9a01e8ef8ae,d0670c2b641c3d880bfa33f6e6e58500e120fb54,format,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/api/global-scope.c++;src/workerd/server/server.c++ +d0670c2b641c3d880bfa33f6e6e58500e120fb54,c2306666023191bacd93450a71ebac8335f6c08e,add comment explaining why listenUdp() lambda does not outlive Server,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/server.c++ +c2306666023191bacd93450a71ebac8335f6c08e,938c12d0e143ad7d2d0d7135f92ae315a839ad27,fix: make maxPendingBytes depend on Datagram type size too,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/server.c++;src/workerd/server/tests/udp-datagram-drop/config.capnp;src/workerd/server/tests/udp-datagram-drop/driver.mjs +938c12d0e143ad7d2d0d7135f92ae315a839ad27,fc2fd9dd704344e2fcc5f5c8adbed6c7e1aecb72,[nfc] Document UDP hostname bind limitation,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/workerd.capnp +fc2fd9dd704344e2fcc5f5c8adbed6c7e1aecb72,b311ad34103d0b3479e64a06c840d147a6a9a3a4,Drop truncated inbound UDP datagrams,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/server-test.c++;src/workerd/server/server.c++ +b311ad34103d0b3479e64a06c840d147a6a9a3a4,ac617d8eda2fe3fe030353215aab5c9b8d86634f,Snapshot UDP datagrams before asynchronous sends,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets-test.c++;src/workerd/api/sockets.c++ +ac617d8eda2fe3fe030353215aab5c9b8d86634f,159c3e6586bd945c8aa43fc0a56ae3da9696a540,chore: use WeakRc instead of raw pointers for Flow,Native UDP flow weak ownership; no local UDP listener substrate.,src/workerd/server/server.c++ +159c3e6586bd945c8aa43fc0a56ae3da9696a540,662492ac36bd456f563d91e4c23f157470bbfbf8,fix comment,Native UDP flow comment correction; no local UDP listener substrate.,src/workerd/server/server.c++ +662492ac36bd456f563d91e4c23f157470bbfbf8,09b8bd8e74b7909505dc3220e2c2405ecd7dd64c,fix: ensure flow key is not unregistered twice,Native UDP flow unregister fix; no local UDP listener substrate.,src/workerd/server/server.c++;src/workerd/server/tests/udp-connect/config.capnp;src/workerd/server/tests/udp-connect/driver.mjs;src/workerd/server/tests/udp-connect/index.mjs +09b8bd8e74b7909505dc3220e2c2405ecd7dd64c,a98a93c1ce0021670bece51f1f7b577ea0863318,re-add old setupSocket() signature so edgeworker does not need changes,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.c++;src/workerd/api/sockets.h +a98a93c1ce0021670bece51f1f7b577ea0863318,3ad3851b937995997af28fbc41f6c52896d75df3,gate UDP workers,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/global-scope.c++;src/workerd/server/tests/udp-connect/config.capnp;src/workerd/server/tests/udp-connect/driver.mjs;src/workerd/server/tests/udp-datagram-drop/config.capnp;src/workerd/server/tests/udp-datagram-drop/driver.mjs +3ad3851b937995997af28fbc41f6c52896d75df3,5123d29c09187c9f13a26047d408c8622570361e,make getProtocol() throw on unknown value,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.h +5123d29c09187c9f13a26047d408c8622570361e,ab88e5a43a111f5e13466120f784be3aef4279d2,Make Flow use kj::Own to reference UdpListener,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/server.c++ +ab88e5a43a111f5e13466120f784be3aef4279d2,7b57bf367d98787bae503f166f7ff52c36490c9e,ensure DatagramChannel::receive() only has one outstanding call at a time,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/server.c++ +7b57bf367d98787bae503f166f7ff52c36490c9e,89268572a03fb1646bfde05cec2d6348710997ff,Bound UDP flow receive queues by byte count,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/server/server.c++;src/workerd/server/server.h;src/workerd/server/tests/udp-datagram-drop/BUILD.bazel;src/workerd/server/tests/udp-datagram-drop/config.capnp;src/workerd/server/tests/udp-datagram-drop/driver.mjs;src/workerd/server/tests/udp-datagram-drop/index.mjs;src/workerd/server/workerd.capnp +89268572a03fb1646bfde05cec2d6348710997ff,41d0c232f8784fabb252415d8a09ffbc96da83d2,fix JsReadableStream::fromPull()'s legacy arm to be demand-driven,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/workerd/api/js-readable-stream.c++ +41d0c232f8784fabb252415d8a09ffbc96da83d2,23a968dcd84d87d8659a9d804366196941a0ca65,make UDP sockets use Datagram objects + handle TS streams,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/workerd/api/global-scope.h;src/workerd/api/js-writable-stream.c++;src/workerd/api/js-writable-stream.h;src/workerd/api/sockets.c++;src/workerd/api/sockets.h;src/workerd/server/tests/udp-connect-ts-streams/index.mjs;src/workerd/server/tests/udp-connect/index.mjs;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +23a968dcd84d87d8659a9d804366196941a0ca65,f59f80b140415d6f22bf485df8d265503fd4bb73,mark `protocol` getter as non standard,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.h +f59f80b140415d6f22bf485df8d265503fd4bb73,2b4b9f7b6f9f0a5c06dab804dd9d31e703518c9f,update wrong comment about internal stream buffering behaviour,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/sockets.c++ +2b4b9f7b6f9f0a5c06dab804dd9d31e703518c9f,f60caa8207542c04d9410914fca21ff42a94cf1f,use JsReadableStream method to create ReadableStream + handle TS flag,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/workerd/api/js-readable-stream.c++;src/workerd/api/js-readable-stream.h;src/workerd/api/sockets.c++;src/workerd/server/tests/server-harness.mjs;src/workerd/server/tests/udp-connect-ts-streams/BUILD.bazel;src/workerd/server/tests/udp-connect-ts-streams/config.capnp;src/workerd/server/tests/udp-connect-ts-streams/driver.mjs;src/workerd/server/tests/udp-connect-ts-streams/index.mjs +f60caa8207542c04d9410914fca21ff42a94cf1f,5cbe8cedb212f151c7b3aeb2e50515284a29f79a,add inbound UDP socket support,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/global-scope.c++;src/workerd/api/global-scope.h;src/workerd/api/sockets.c++;src/workerd/api/sockets.h;src/workerd/server/server.c++;src/workerd/server/server.h;src/workerd/server/tests/udp-connect/BUILD.bazel;src/workerd/server/tests/udp-connect/config.capnp;src/workerd/server/tests/udp-connect/driver.mjs;src/workerd/server/tests/udp-connect/index.mjs;src/workerd/server/workerd.capnp +5cbe8cedb212f151c7b3aeb2e50515284a29f79a,688ba58e46eb1257ed0bdca9d5ccffa8a3b7e11c,add Socket.protocol getter,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/cloudflare/internal/sockets.d.ts;src/workerd/api/global-scope.c++;src/workerd/api/hyperdrive.c++;src/workerd/api/sockets.c++;src/workerd/api/sockets.h +a02d77e23033d495069e9ef79b881ef4935d393d,3c8c5dc93d90563949ad4940ad794eed2723416a,Update justfile,"Build, dependency, release tooling or documentation: no local runtime behavior port.",justfile +3c8c5dc93d90563949ad4940ad794eed2723416a,688ba58e46eb1257ed0bdca9d5ccffa8a3b7e11c,fix compile_flags.txt,"Build, dependency, release tooling or documentation: no local runtime behavior port.",compile_flags.txt;justfile +ae8979d5414114127ce3cb59af28e59be074fe27,688ba58e46eb1257ed0bdca9d5ccffa8a3b7e11c,Transform a parked TransformStream write after one backpressure wait,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/transform.ts;src/tests/streams/transform/AGENTS.md;src/tests/streams/transform/backpressure.js;src/tests/streams/transform/main.js +688ba58e46eb1257ed0bdca9d5ccffa8a3b7e11c,9e507426061d2e99339a3a003401edeb2a02421f ba06f8d50eb38d12531a2df1a037ad6b33f9f043,Merge pull request #7409 from cloudflare/jasnell/ts-streams-primordial-gaps,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +9e507426061d2e99339a3a003401edeb2a02421f,1291d35acfcc43fcec1e681314a954dbd107f7f5 798d10610f476de4a0659ebbf1884c6a76e7fb3e,Merge pull request #7400 from cloudflare/mikea/2026-09-16-update-capnptoro,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +1291d35acfcc43fcec1e681314a954dbd107f7f5,17143186b375231689b60a23e53933315fd9e24e 64ae9494a2e06b2ae14911fa9c115cd2d9fdd61c,Merge pull request #7397 from cloudflare/feat/xthread-wait-list,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +e47b503fb7ff83984efced4e5feb8c850e7450ac,17143186b375231689b60a23e53933315fd9e24e,Updates v8 to 15.4,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/v8.MODULE.bazel;patches/v8/0001-Allow-manually-setting-ValueDeserializer-format-vers.patch;patches/v8/0002-Allow-manually-setting-ValueSerializer-format-versio.patch;patches/v8/0003-Allow-Windows-builds-under-Bazel.patch;patches/v8/0005-Speed-up-V8-bazel-build-by-always-using-target-cfg.patch;patches/v8/0006-Implement-Promise-Context-Tagging.patch;patches/v8/0009-Add-ValueSerializer-SetTreatFunctionsAsHostObjects.patch;patches/v8/0010-Modify-where-to-look-for-fp16-dependency.-This-depen.patch;patches/v8/0011-Revert-heap-Add-masm-specific-unwinding-annotations-.patch;patches/v8/0013-Implement-cross-request-context-promise-resolve-hand.patch;patches/v8/0014-Add-another-slot-in-the-isolate-for-embedder.patch;patches/v8/0015-Add-ValueSerializer-SetTreatProxiesAsHostObjects.patch;patches/v8/0016-Disable-memory-leak-assert-when-shutting-down-V8.patch;patches/v8/0017-Enable-V8-shared-linkage.patch;patches/v8/0018-Modify-where-to-look-for-fast_float-and-simdutf.patch;patches/v8/0019-Remove-unneded-latomic-linker-flag.patch;patches/v8/0020-Add-methods-to-get-heap-and-external-memory-sizes-di.patch;patches/v8/0021-Port-concurrent-mksnapshot-support.patch;patches/v8/0022-Port-V8_USE_ZLIB-support.patch;patches/v8/0023-Modify-where-to-look-for-dragonbox.patch;patches/v8/0024-Disable-slow-handle-check.patch;patches/v8/0026-Implement-additional-Exception-construction-methods.patch;patches/v8/0028-bind-icu-to-googlesource.patch;patches/v8/0029-Add-v8-String-IsFlat-API.patch;patches/v8/0030-Expose-AdjustAmountOfExternalAllocatedMemoryImpl-as-.patch;patches/v8/0031-Add-verify_write_barriers-flag-in-V8-s-bazel-config.patch;patches/v8/0032-Change-lamba-signature-to-get-around-windows-build-f.patch;patches/v8/0033-Return-false-on-Object.hasOwnProperty-with-intercept.patch;patches/v8/0034-Remove-V8-MODULE.bazel-llvm-toolchain-and-libcxx-rep.patch;patches/v8/0035-Remove-libcxx-dep-from-defs.bzl-not-resolvable-via-h.patch;patches/v8/0038-Properly-depend-on-llvm-libc.patch;patches/v8/0039-Fix-TSan-build-without-the-V8-sandbox.patch;patches/v8/0040-Enable-Perfetto-support-in-the-V8-Bazel-build.patch;patches/v8/0041-Disable-preserve_most-on-Windows-x64-before-Clang-22.patch +798d10610f476de4a0659ebbf1884c6a76e7fb3e,17143186b375231689b60a23e53933315fd9e24e,update capnproto,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",build/deps/gen/deps.MODULE.bazel;src/rust/cxx/kj-rs/convert.h +ba06f8d50eb38d12531a2df1a037ad6b33f9f043,113cde70b37d7e8edda986a7ed5194d7a5b6e397,Apply batched suggestions from code review,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/crypto/digest-stream.ts;src/per_isolate/webfs/writable-file-stream.ts;src/per_isolate/webstreams/compression.ts;src/per_isolate/webstreams/encoding.ts;src/per_isolate/webstreams/identity.ts;src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/transform.ts +113cde70b37d7e8edda986a7ed5194d7a5b6e397,2330da3f3f31639deb041b97e87370b10d341136,Guard the streams against prototype pollution,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/AGENTS.md;src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/compression/AGENTS.md;src/tests/streams/compression/compression-modules.capnp;src/tests/streams/compression/main.js;src/tests/streams/compression/pollution.js;src/tests/streams/encoding/AGENTS.md;src/tests/streams/encoding/encoding-modules.capnp;src/tests/streams/encoding/main.js;src/tests/streams/encoding/pollution.js;src/tests/streams/identity/AGENTS.md;src/tests/streams/identity/identity-modules.capnp;src/tests/streams/identity/main.js;src/tests/streams/identity/pollution.js;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/pollution.js;src/tests/streams/readable-byte/readable-byte-modules.capnp;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/main.js;src/tests/streams/readable/pollution.js;src/tests/streams/readable/readable-modules.capnp;src/tests/streams/transform/AGENTS.md;src/tests/streams/transform/main.js;src/tests/streams/transform/pollution.js;src/tests/streams/transform/transform-modules.capnp;src/tests/streams/writable/AGENTS.md;src/tests/streams/writable/main.js;src/tests/streams/writable/pollution.js;src/tests/streams/writable/writable-modules.capnp +2330da3f3f31639deb041b97e87370b10d341136,88526f8d02c00a2f56f6a1a5c8bf27ba984e9fb0,Give the streams' internal dictionaries a null prototype,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/crypto/digest-stream.ts;src/per_isolate/webfs/writable-file-stream.ts;src/per_isolate/webstreams/compression.ts;src/per_isolate/webstreams/identity.ts;src/per_isolate/webstreams/native.ts;src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/transform.ts;src/per_isolate/webstreams/writable.ts +88526f8d02c00a2f56f6a1a5c8bf27ba984e9fb0,ec1a8524dc169d8904485bbf9fcada616659fad4,Keep the streams' internal dispatch off user-patchable prototypes,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/encoding.ts;src/per_isolate/webstreams/native.ts;src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/writable.ts +ec1a8524dc169d8904485bbf9fcada616659fad4,5be1abd04ecfd78c903b3cf34d685d70cf612159,Tell settled promises from resolver records with isPromise,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/per_isolate-env.d.ts;src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/writable.ts +5be1abd04ecfd78c903b3cf34d685d70cf612159,a0cfe16d779b3bd716640da236b595e14022f9ba,Copy internal byte ranges without consulting species constructors,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts +a0cfe16d779b3bd716640da236b595e14022f9ba,9c8301a34c1113effa7c36ee391d572a440e717e,Iterate the streams' internal arrays by index,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts +9c8301a34c1113effa7c36ee391d572a440e717e,17143186b375231689b60a23e53933315fd9e24e,Capture Number in primordials,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/primordials.ts;src/per_isolate/webstreams/identity.ts;src/per_isolate/webstreams/readable.ts +17143186b375231689b60a23e53933315fd9e24e,50f47c35e6470fb0afe60919b292a679ab423cb2 806c5129af7c14d52ffd0e77dee66c3121c56ddc,Merge pull request #7407 from cloudflare/swallace/just-format,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +806c5129af7c14d52ffd0e77dee66c3121c56ddc,1a0348b06a8e4acb1f94cb8f1c0de125b85b3365,"Add `just format `, `just format-head`","Build, dependency, release tooling or documentation: no local runtime behavior port.",AGENTS.md;justfile;tools/cross/format.py +50f47c35e6470fb0afe60919b292a679ab423cb2,cefd15a9757daccbab7b9b15863eb0486d0512aa f6cc0d14c18017982019dc0875bf7568c6c330aa,Merge pull request #7230 from cloudflare/apeacock/stor-5489-claim-before-construction,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +cefd15a9757daccbab7b9b15863eb0486d0512aa,3d7772343e5ea2d2839149435253b3d5ed840ac2 9cfc9611756ef107bb9ce7c92cbcfb1021e2ef7b,Merge pull request #7244 from ghostwriternr/fix/container-sidecar-shutdown,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +f6cc0d14c18017982019dc0875bf7568c6c330aa,1a0348b06a8e4acb1f94cb8f1c0de125b85b3365,Move retry claim before actor construction,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/BUILD.bazel;src/workerd/api/fetch-retry-claim-hook-test.c++;src/workerd/api/global-scope.c++;src/workerd/io/observer.h;src/workerd/io/worker-entrypoint-test.c++;src/workerd/io/worker-entrypoint.c++ +3d7772343e5ea2d2839149435253b3d5ed840ac2,cc1012ec7da7baa6682a797ccd03429a29002ba8 da755c2ba1a835cb6e7763ba4ece3d9ec1d4ecd1,Merge pull request #7405 from cloudflare/jasnell/ts-streams-ring-buffer-queues,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +da755c2ba1a835cb6e7763ba4ece3d9ec1d4ecd1,d8650959d5c8fee860498d6c283cfd2a31bdb4f1,Take the scaling suite's C++ cell out of the default test run,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/AGENTS.md;src/tests/streams/scaling/AGENTS.md;src/tests/streams/scaling/BUILD.bazel +d8650959d5c8fee860498d6c283cfd2a31bdb4f1,2907afb8071599183f9004c89881336bfa29203d,Address comment updates from review,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/ring-buffer.ts +cc1012ec7da7baa6682a797ccd03429a29002ba8,466c666b67e6d9badc2753cbe44ea74e48ff4862 51e9947c619fb8870da960dfb0e1bc556d6492e9,Merge pull request #7402 from cloudflare/jolio/fix-containe-nyqjo6,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +466c666b67e6d9badc2753cbe44ea74e48ff4862,1782f7f96b4c9a2825c5087b715abee4a2875c78,workerd: make --//:io_backend=rust the default; cxx CI lane,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/test.yml;BUILD.bazel;compile_flags.txt;src/workerd/server/AGENTS.md;src/workerd/util/AGENTS.md +1782f7f96b4c9a2825c5087b715abee4a2875c78,8b2f1e7060c5f6637a79b36aa0a8f890f96f7dcd,build: dependency-graph and link checks for the rust I/O backend,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/_bazel.yml;.github/workflows/test.yml;BUILD.bazel;build/fixtures/BUILD.bazel;build/fixtures/rust_io_link_check.sh;build/rust_io_backend.bzl;build/rust_io_graph_check.sh;justfile;src/workerd/server/BUILD.bazel +8b2f1e7060c5f6637a79b36aa0a8f890f96f7dcd,34b0dc286ed991793bbe07bf1f89077ef9364ff0,cli-io-backend: tokio arms for --watch and SIGTERM under --//:io_backend=rust,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/server/BUILD.bazel;src/workerd/server/cli-io-backend.c++;src/workerd/server/cli-io-backend.h +34b0dc286ed991793bbe07bf1f89077ef9364ff0,8f39c1cc43fb47e19b0bc37ee27a9a4c9b8ca47a,build: --//:io_backend flag and the kj::setupAsyncIo() seam,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",BUILD.bazel;build/kj_test.bzl;build/rust_io_backend.bzl;build/wd_cc_benchmark.bzl;src/rust/cxx/kj-rs-io/BUILD.bazel;src/workerd/io/BUILD.bazel;src/workerd/server/BUILD.bazel;src/workerd/server/json-logger-test.c++;src/workerd/tests/BUILD.bazel;src/workerd/util/BUILD.bazel;src/workerd/util/setup-async-io-test.c++;src/workerd/util/setup-async-io-tokio.c++ +8f39c1cc43fb47e19b0bc37ee27a9a4c9b8ca47a,5aef66d2e23089a82b8634c896311e0b3a6c46df,server: move the --watch file watcher and SIGTERM handling into cli-io-backend,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/server/BUILD.bazel;src/workerd/server/cli-io-backend.c++;src/workerd/server/cli-io-backend.h;src/workerd/server/workerd.c++ +2907afb8071599183f9004c89881336bfa29203d,01fbacd45f322d379cb30387ef5adfe83a3852bc,Shrink the ring buffer as it drains,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/ring-buffer.ts +01fbacd45f322d379cb30387ef5adfe83a3852bc,6a458334eef8d3387d64978281b6f412864b57c9,Add a queue scaling suite for both streams implementations,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/AGENTS.md;src/tests/streams/scaling/AGENTS.md;src/tests/streams/scaling/BUILD.bazel;src/tests/streams/scaling/helpers.js;src/tests/streams/scaling/identity.js;src/tests/streams/scaling/main.js;src/tests/streams/scaling/readable-byte.js;src/tests/streams/scaling/readable.js;src/tests/streams/scaling/scaling-cpp.wd-test;src/tests/streams/scaling/scaling-modules.capnp;src/tests/streams/scaling/scaling-ts.wd-test;src/tests/streams/scaling/writable.js +6a458334eef8d3387d64978281b6f412864b57c9,8e1ca09e2f3cf49a68ce7581387b08af94b0d7a9,Back the native conduit's requests and the snapshot FIFOs with the ring buffer,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/AGENTS.md;src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/compression.ts;src/per_isolate/webstreams/identity.ts;src/per_isolate/webstreams/native.ts;src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/writable.ts +8e1ca09e2f3cf49a68ce7581387b08af94b0d7a9,8026ef28a99d54732388ed3cf7c4adb303c34703,Back the writable stream's queues with the ring buffer,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/writable.ts +8026ef28a99d54732388ed3cf7c4adb303c34703,802cb63330d0114e1440e45be623bedf5230ccc9,Back the queued backend's lists with the ring buffer,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts +802cb63330d0114e1440e45be623bedf5230ccc9,5aef66d2e23089a82b8634c896311e0b3a6c46df,Add a ring buffer for the streams' internal queues,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/ring-buffer.ts +7c183a8669e95a717c30bd6116a77488fed04cac,5aef66d2e23089a82b8634c896311e0b3a6c46df,Document coroutine cleanup patterns,"Build, dependency, release tooling or documentation: no local runtime behavior port.",AGENTS.md;docs/reference/detail/async-patterns.md +51e9947c619fb8870da960dfb0e1bc556d6492e9,5aef66d2e23089a82b8634c896311e0b3a6c46df,Fix container startup flags after cancellation,Separate Docker Containers service/client or tests: unrelated to local actor execution container.,src/workerd/server/container-client.c++ +5aef66d2e23089a82b8634c896311e0b3a6c46df,a0c6e25b38dd22a46c620b7aae0b5b0c9a45eff5 735a2d7d4614355f4dd9179dcac9b42e630a2632,Merge pull request #7399 from cloudflare/jasnell/ts-streams-its-fls-abort,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +735a2d7d4614355f4dd9179dcac9b42e630a2632,a0c6e25b38dd22a46c620b7aae0b5b0c9a45eff5,Stop identity stream aborts from waiting for a read,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/identity.ts;src/per_isolate/webstreams/writable.ts;src/tests/streams/identity/AGENTS.md;src/tests/streams/identity/abort-propagation.js;src/tests/streams/identity/main.js +a0c6e25b38dd22a46c620b7aae0b5b0c9a45eff5,c12bb46e50932659afbf3d4393fb9d9904c0d0ba 64ea3d94fc2480ea05dea02900eeb49ba9469a00,Merge pull request #7395 from cloudflare/jasnell/ts-streams-native-fast-path-fix,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +c12bb46e50932659afbf3d4393fb9d9904c0d0ba,cf7258d78d7fff5d59c682d2e8dfb0da2b97bb6c,Release 2026-09-17,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +64ea3d94fc2480ea05dea02900eeb49ba9469a00,cf7258d78d7fff5d59c682d2e8dfb0da2b97bb6c,Keep native pipes from consuming a destination with pending writes,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/writable.ts;src/tests/streams/sockets/AGENTS.md;src/tests/streams/sockets/main.js;src/tests/streams/sockets/socket-streams.js;src/workerd/api/js-writable-stream-test.c++;src/workerd/api/js-writable-stream.c++;src/workerd/api/js-writable-stream.h +cf7258d78d7fff5d59c682d2e8dfb0da2b97bb6c,e47654cf81ed26dcf2977f2ba9aaf811af1e3bba c7e4fa2425ff87610eb2f294d1f0ff79fecaf906,Merge pull request #7391 from cloudflare/jasnell/ts-stream-batched-pipe-drain-abort-fix,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +c7e4fa2425ff87610eb2f294d1f0ff79fecaf906,04281be694f489a76be4b8e794f281e23771ce49,Address streams update review comments,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/writable.ts;src/tests/streams/piping/AGENTS.md;src/tests/streams/piping/main.js;src/tests/streams/piping/piping-modules.capnp;src/tests/streams/piping/shutdown-pending-read.js +04281be694f489a76be4b8e794f281e23771ce49,1310763f08dfee9fdb2403846f7ed2fd73929348,Wake a pipe from its destination's write completions,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/writable.ts;src/wpt/streams-test-ts.ts +1310763f08dfee9fdb2403846f7ed2fd73929348,e47654cf81ed26dcf2977f2ba9aaf811af1e3bba,Stop pipes from reading more than the destination desires,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/writable.ts;src/tests/streams/piping/AGENTS.md;src/tests/streams/piping/close-propagation.js;src/tests/streams/piping/main.js;src/tests/streams/piping/pipe-matrix.js;src/tests/streams/piping/piping-modules.capnp;src/tests/streams/piping/shutdown-backlog.js;src/wpt/streams-test-ts.ts +e47654cf81ed26dcf2977f2ba9aaf811af1e3bba,92f250233aee48bc861df832ed680f10717be333 7b1bf6ed627f4993fe8b1cce5d02e94a834df54b,Merge pull request #7398 from cloudflare/maizatskyi/2026-09-16-actor-keys,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +92f250233aee48bc861df832ed680f10717be333,04812ee7243a0542b33880f78b234735a39a80c2 1d909916f65e3f5283047a9854d0c65f44079391,Merge pull request #7389 from cloudflare/jasnell/ts-streams-tee-fixes,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +1d909916f65e3f5283047a9854d0c65f44079391,16ff91bc7bbb9d14f88bc0dc6ee9a5f823b97c08,Guard against cursor prefix already existing,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/tee.js +9cfc9611756ef107bb9ce7c92cbcfb1021e2ef7b,04812ee7243a0542b33880f78b234735a39a80c2,Clean up containers on graceful shutdown,Separate Docker Containers service/client or tests: unrelated to local actor execution container.,src/workerd/server/container-client.c++;src/workerd/server/container-client.h;src/workerd/server/server.c++;src/workerd/server/tests/container-shutdown/BUILD.bazel;src/workerd/server/tests/container-shutdown/config.capnp;src/workerd/server/tests/container-shutdown/test.mjs;src/workerd/server/tests/container-shutdown/worker.mjs +04812ee7243a0542b33880f78b234735a39a80c2,74cd70f5100701cba3864ca3d9358a2d544bc917,node:fs: rename and copyFile replace an existing destination (#7394),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/workerd/api/filesystem.c++;src/workerd/api/node/tests/fs-nodejs-test.js +64ae9494a2e06b2ae14911fa9c115cd2d9fdd61c,064327cc3b834b5982fb486f96b4d76cafdcb2b0,Abstract CrossThreadWaitList into SyncWaitList and introduce XThreadWaitList,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/util/BUILD.bazel;src/workerd/util/sync-wait-list-test.c++;src/workerd/util/sync-wait-list.h;src/workerd/util/wait-list-test.c++;src/workerd/util/wait-list.c++;src/workerd/util/wait-list.h;src/workerd/util/xthread-wait-list-test.c++ +74cd70f5100701cba3864ca3d9358a2d544bc917,912cd94eb2720db4d542dcc474b5fcef561e486b,node:fs: open without O_CREAT is ENOENT for a missing path (#7393),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/filesystem.d.ts;src/node/internal/internal_fs_streams.ts;src/node/internal/internal_fs_sync.ts;src/workerd/api/filesystem.c++;src/workerd/api/filesystem.h;src/workerd/api/node/tests/fs-misc-test.js;src/workerd/api/node/tests/fs-nodejs-test.js;src/workerd/api/node/tests/fs-writestream-test.js;src/workerd/io/worker-fs.c++;src/workerd/io/worker-fs.h +7b1bf6ed627f4993fe8b1cce5d02e94a834df54b,912cd94eb2720db4d542dcc474b5fcef561e486b,make actor maps own their keys,Native lifetime fix: own actor/alarm map keys; local strings and actor identifiers are already owned JavaScript values.,src/workerd/server/alarm-scheduler-test.c++;src/workerd/server/alarm-scheduler.c++;src/workerd/server/alarm-scheduler.h;src/workerd/server/server.c++ +912cd94eb2720db4d542dcc474b5fcef561e486b,8f241d73693abaa74c19d59d44dd8218f92e31db,Fix browser run keepAlive units,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/browser-run.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +8f241d73693abaa74c19d59d44dd8218f92e31db,bb63a85a36bff6fafe871c8af4c09341a6a72c82,feat(types): add Browser Run binding methods,Separate Cloudflare product binding/types/tests: service remains host-owned; ambient types updated with oracle.,types/defines/browser-run.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +bb63a85a36bff6fafe871c8af4c09341a6a72c82,9c1ace9f38c4872bcef64eb6ed45f94346da547d 111dcddd1500ec2126d63971b0f81d685d088b91,Merge pull request #7374 from cloudflare/gv/be-able-to-set-debian-trixie,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +9c1ace9f38c4872bcef64eb6ed45f94346da547d,3103b25eaa5f090230fc17536d9ba22ec9b14252 1a0348b06a8e4acb1f94cb8f1c0de125b85b3365,Merge pull request #7387 from cloudflare/erikcorry/upstream-gc-timing,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +16ff91bc7bbb9d14f88bc0dc6ee9a5f823b97c08,bf21373abc20422b4d4eb209a169f8ddea6a357e,Invalidate a held byobRequest when a byte stream is teed,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/tee.js +bf21373abc20422b4d4eb209a169f8ddea6a357e,307c86a002ae3faffe461389d9e4c86583d1de67,Keep released BYOB bytes on tee branches and across tee(),Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/tee.js +111dcddd1500ec2126d63971b0f81d685d088b91,3103b25eaa5f090230fc17536d9ba22ec9b14252,container client: Add support for cloudflare/debian-trixie,Separate Docker Containers service/client or tests: unrelated to local actor execution container.,src/workerd/server/container-client.c++;src/workerd/server/tests/container-client/test.js +307c86a002ae3faffe461389d9e4c86583d1de67,3103b25eaa5f090230fc17536d9ba22ec9b14252,Stop released BYOB reads from taking later bytes,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/release-relock.js;src/tests/streams/readable-byte/tee.js +1a0348b06a8e4acb1f94cb8f1c0de125b85b3365,3103b25eaa5f090230fc17536d9ba22ec9b14252,Restrict GCs at inopportune moments.,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/jsg/wrappable.c++ +3103b25eaa5f090230fc17536d9ba22ec9b14252,d605e5257748dccb4a47adcfce960384906f3e5c 038850cc908f0362550ef2f2a24f44c68f70822d,Merge pull request #7384 from cloudflare/git-bruh-patch-1,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +038850cc908f0362550ef2f2a24f44c68f70822d,d605e5257748dccb4a47adcfce960384906f3e5c,.bazelrc: add native_arm64 no-op,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.bazelrc +d605e5257748dccb4a47adcfce960384906f3e5c,134630da9758c6b86695275931653c2385c8ff3b d07b3e55822c3e0c3e605e058d3aa950cccfb00b,Merge pull request #7371 from cloudflare/joaquim/STOR-5647,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +d07b3e55822c3e0c3e605e058d3aa950cccfb00b,134630da9758c6b86695275931653c2385c8ff3b,Expose hibernatable WebSocket count,Host introspection: side-effect-free native hibernatable socket count; local registry/mirror retains live references without native wakeup.,src/workerd/io/hibernation-manager-test.c++;src/workerd/io/hibernation-manager.c++;src/workerd/io/hibernation-manager.h;src/workerd/io/legacy-hibernation-manager.c++;src/workerd/io/legacy-hibernation-manager.h;src/workerd/io/worker.h +134630da9758c6b86695275931653c2385c8ff3b,d188b0448c0bd77ae02a6ed3c0982d254172b505,Update WPT to wpt-b875b21fd (#7381),Upstream conformance/test infrastructure: host behavior; relevant local contracts verified separately.,build/deps/gen/shared_deps.MODULE.bazel;build/deps/shared_deps.jsonc;src/wpt/WebCryptoAPI-test.ts;src/wpt/websockets-test.ts +d188b0448c0bd77ae02a6ed3c0982d254172b505,adda2635656d09e541b0feeea796da9d2a8bc10e,kj-rs-tokio: timer test allows for the loop's cached time,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/kj-rs-tokio/tests/tokio-event-port-test.c++ +adda2635656d09e541b0feeea796da9d2a8bc10e,d20512a6b1702058aabd2faded469ce78894d214,Release 2026-09-16,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +d20512a6b1702058aabd2faded469ce78894d214,7d18ad5f273762883d4caaa0970291db2104adaf 06873f66649f3c12d0c914bb09cdc86159331e89,Merge pull request #7344 from cloudflare/jasnell/node-streams-08-adapter-hardening,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +06873f66649f3c12d0c914bb09cdc86159331e89,3abd201e58ba0f801fde6199b144363d9f0c349a,Address streams impl feedback,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_readable.js;src/node/internal/streams_writable.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/gc.js;src/tests/node/stream/main.js +3abd201e58ba0f801fde6199b144363d9f0c349a,9befa203e0a5b3468e9cd0b74333066a75616ec3,Mark http client/server tests as large,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/http-client/BUILD.bazel;src/tests/node/http-server/BUILD.bazel +9befa203e0a5b3468e9cd0b74333066a75616ec3,35cf36ea69844b702b0a62da77ef845824df050d,Pin data volumes and chunk shapes through the stream adapters,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/stream/AGENTS.md;src/tests/node/stream/data-volumes.js;src/tests/node/stream/main.js;src/tests/node/stream/stream-modules.capnp +35cf36ea69844b702b0a62da77ef845824df050d,ed1ee9d8b79c51b24c917aece8461078974384df,Pin chunk shapes through Readable.fromWeb,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/readable-from-web.js +ed1ee9d8b79c51b24c917aece8461078974384df,08b0a55cd8898615ad403b66a2aa7078bbfd3179,Pin buffer hand-off and re-entrant teardown through the fromWeb adapters,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/stream/AGENTS.md;src/tests/node/stream/duplex-from-web.js;src/tests/node/stream/main.js;src/tests/node/stream/writable-from-web.js +08b0a55cd8898615ad403b66a2aa7078bbfd3179,b75904e53af4c60d8f137f8d1e66ab6a1473474e,"Pin re-entrant teardown, late errors and non-byte chunks through the toWeb adapters",Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/readable-to-web.js;src/tests/node/stream/writable-to-web.js +b75904e53af4c60d8f137f8d1e66ab6a1473474e,55acd4f5b03103ff7044401be8ea4c09aa82c065,Construct a toWeb stream before subscribing to the node stream it adapts,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_readable.js;src/node/internal/streams_writable.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/readable-to-web.js;src/tests/node/stream/writable-to-web.js +55acd4f5b03103ff7044401be8ea4c09aa82c065,486ec67708565d3170b113215e5e8af2f33db589,Destroy a Readable.toWeb source whose chunk cannot be enqueued,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_readable.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/readable-to-web.js;src/tests/node/stream/writable-to-web.js +486ec67708565d3170b113215e5e8af2f33db589,0a3ff36e948a0272cb2cdeeed7511bb704e22457,Subscribe end-of-stream to a legacy writable with two plain on() calls,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_end_of_stream.ts;src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/writable-to-web.js +0a3ff36e948a0272cb2cdeeed7511bb704e22457,225160966fa40d50f3e34751efff8aae9b82e17d,Keep a toWeb stream alive through the node stream it adapts,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_readable.js;src/node/internal/streams_writable.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/gc.js;src/tests/node/stream/main.js;src/tests/node/stream/stream-cpp-pedantic.wd-test;src/tests/node/stream/stream-cpp.wd-test;src/tests/node/stream/stream-modules.capnp;src/tests/node/stream/stream-ts.wd-test;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/gc.js;src/tests/streams/readable/main.js +225160966fa40d50f3e34751efff8aae9b82e17d,6a34018c0ecf2971e72f292cdc7dbd3c15fcc0b3,Leave no web stream locked when a fromWeb adapter's construction throws,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_duplex.js;src/node/internal/streams_readable.js;src/node/internal/streams_writable.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/helpers.js;src/tests/node/stream/main.js;src/tests/node/stream/stream-modules.capnp;src/tests/node/stream/then-pollution.js +6a34018c0ecf2971e72f292cdc7dbd3c15fcc0b3,f25a9fc3b5411a300f498fe2bc0179803acfca1a,Let Writable.toWeb's close() wait for a node side ended directly,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_writable.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/writable-to-web.js +f25a9fc3b5411a300f498fe2bc0179803acfca1a,7d18ad5f273762883d4caaa0970291db2104adaf,Destroy Readable.fromWeb on a chunk it cannot push,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_duplex.js;src/node/internal/streams_readable.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/duplex-from-web.js;src/tests/node/stream/main.js;src/tests/node/stream/readable-from-web.js +7d18ad5f273762883d4caaa0970291db2104adaf,287a3b8cff3d2f51a2332e8ccd31c34bf0f4f5ae ef2cd3b51cb6eda3f90dcedf9c11fcb150b8637a,Merge pull request #7343 from cloudflare/jasnell/node-streams-07-compose,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +287a3b8cff3d2f51a2332e8ccd31c34bf0f4f5ae,6c32b36057300e4fbc7c97b3e10f6bccafbe07ba b9104f0fcf0d520e160f12f957efa0dd62d2b3ae,Merge pull request #7377 from cloudflare/maizatskyi/2026-09-15-capnp-workerd,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +ef2cd3b51cb6eda3f90dcedf9c11fcb150b8637a,157bbeab1c8996794de501de5d5c74fbf9f44cd2,Address review feedback around the compose read loop,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_compose.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/compose-web.js;src/tests/node/stream/main.js +157bbeab1c8996794de501de5d5c74fbf9f44cd2,7363b6abaa6f60c14135bb4f838b2518a64c7ba5,Destroy a composition on a web tail chunk it cannot push,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_compose.js;src/tests/node/stream/compose-web.js;src/tests/node/stream/main.js +7363b6abaa6f60c14135bb4f838b2518a64c7ba5,43c109c9e455d2721e4d626c2599ba92a245698e,Tear down a compose() pipeline when the composed stream is destroyed,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_compose.js;src/node/internal/streams_pipeline.d.ts;src/node/internal/streams_pipeline.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/compose-web.js;src/tests/node/stream/main.js +43c109c9e455d2721e4d626c2599ba92a245698e,ec3d985fb0e7ecb752e06ca7e3d069122e992f05,Drain a compose() node tail into the composed stream as it is produced,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_compose.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/compose-web.js;src/tests/node/stream/main.js +ec3d985fb0e7ecb752e06ca7e3d069122e992f05,cbdf934e6befa376f8ee145eaefe6ee0c522efe0,Refuse a compose() shape that needs the interop hooks before taking any lock,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_compose.js;src/tests/node/stream/compose-web.js +cbdf934e6befa376f8ee145eaefe6ee0c522efe0,6c32b36057300e4fbc7c97b3e10f6bccafbe07ba,Support web streams in stream.compose(),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_compose.js;src/tests/node/AGENTS.md;src/tests/node/stream/AGENTS.md;src/tests/node/stream/compose-web.js;src/tests/node/stream/legacy-constructor-gate.js;src/tests/node/stream/legacy-main.js;src/tests/node/stream/main.js;src/tests/node/stream/stream-cpp-legacy.wd-test;src/tests/node/stream/stream-modules.capnp +6c32b36057300e4fbc7c97b3e10f6bccafbe07ba,67bb38ba0ee45fe0a3cbc6c09fb36328b99eb1ca e56984b15a87cfb8d8d49d4245c3dcfe13c1ec34,Merge pull request #7342 from cloudflare/jasnell/node-streams-06-interop-hooks,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +67bb38ba0ee45fe0a3cbc6c09fb36328b99eb1ca,216ed990ae4e55015b8e6798a05851b58249d53f,replace some recursive templates with auto deduce this,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/jsg/iterator.h;src/workerd/jsg/jsg.h;src/workerd/jsg/promise.h;src/workerd/jsg/struct.h;src/workerd/jsg/type-wrapper.h;src/workerd/jsg/value.h +216ed990ae4e55015b8e6798a05851b58249d53f,6113a07be7e2437fab5d91f6f12fe23e63a658f0,kj-rs-io: KJ async I/O interfaces backed by tokio,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",deps/rust/Cargo.lock;deps/rust/Cargo.toml;src/rust/cxx/AGENTS.md;src/rust/cxx/kj-rs-io/BUILD.bazel;src/rust/cxx/kj-rs-io/async-io.c++;src/rust/cxx/kj-rs-io/async-io.h;src/rust/cxx/kj-rs-io/bridge.h;src/rust/cxx/kj-rs-io/error.rs;src/rust/cxx/kj-rs-io/ffi.rs;src/rust/cxx/kj-rs-io/lib.rs;src/rust/cxx/kj-rs-io/net.rs;src/rust/cxx/kj-rs-io/peer-filter.c++;src/rust/cxx/kj-rs-io/peer-filter.h;src/rust/cxx/kj-rs-io/signal.rs;src/rust/cxx/kj-rs-io/stream.rs;src/rust/cxx/kj-rs-io/tests/BUILD.bazel;src/rust/cxx/kj-rs-io/tests/async-io-test.c++;src/rust/cxx/kj-rs-io/tests/capnp-rpc-test.c++;src/rust/cxx/kj-rs-io/tests/file-watcher-test.c++;src/rust/cxx/kj-rs-io/tests/http-test.c++;src/rust/cxx/kj-rs-io/tests/io-test-helpers.h;src/rust/cxx/kj-rs-io/tests/lib.rs;src/rust/cxx/kj-rs-io/tests/peer-filter-test.c++;src/rust/cxx/kj-rs-io/tests/test_helpers.rs;src/rust/cxx/kj-rs-io/watcher.rs +b9104f0fcf0d520e160f12f957efa0dd62d2b3ae,0afb71fd5fcdccaf8d39f5661ef51340ff662b89,update capnp,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,build/deps/gen/deps.MODULE.bazel;src/workerd/api/html-rewriter.c++;src/workerd/api/sockets.c++;src/workerd/api/streams/compression.c++;src/workerd/io/compatibility-date.c++;src/workerd/io/worker.c++;src/workerd/jsg/value.h;src/workerd/util/autogate.c++ +e56984b15a87cfb8d8d49d4245c3dcfe13c1ec34,20e498c80492a1cab19f2208c80a9eceb52cd82a,Fix flaky net timeout test,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/net/AGENTS.md;src/tests/node/net/timeouts.js +6113a07be7e2437fab5d91f6f12fe23e63a658f0,6bc976942411f36f47a5ddf136e54cf8064cc4c2,build: finish narrowing kj-async deps to the layer each target uses,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx-integration-test/BUILD.bazel;src/rust/worker/BUILD;src/workerd/server/BUILD.bazel;src/workerd/tests/BUILD.bazel +6bc976942411f36f47a5ddf136e54cf8064cc4c2,355237e112a924c1cef884da20258a51e09dc36c a40bc556e2cd2c8b0b258d490f6703c73edcceb5,Merge pull request #7364 from cloudflare/cormick/fix-code-cache,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +20e498c80492a1cab19f2208c80a9eceb52cd82a,a6253f0f7e720356304d029eac05c12a3abd0d5a,Ensure nodejs_compat finished(rs) works with teed sources,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/readable.ts;src/tests/node/stream/AGENTS.md;src/tests/node/stream/finished-and-abort.js;src/tests/node/stream/main.js +355237e112a924c1cef884da20258a51e09dc36c,0afb71fd5fcdccaf8d39f5661ef51340ff662b89,kj-rs: arm the poll event directly on a same-thread stored-waker wake,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/kj-rs-tokio/tests/lib.rs;src/rust/cxx/kj-rs-tokio/tests/test_helpers.rs;src/rust/cxx/kj-rs-tokio/tests/tokio-event-port-test.c++;src/rust/cxx/kj-rs/tests/awaitables-cc-test.c++;src/rust/cxx/kj-rs/tests/lib.rs;src/rust/cxx/kj-rs/tests/test_futures.rs;src/rust/cxx/kj-rs/waker.c++;src/rust/cxx/kj-rs/waker.h +0afb71fd5fcdccaf8d39f5661ef51340ff662b89,b4bbf3b8f4b26e8f63356fa9e61556d505d943cb 4886a6772b1275cabc8296fd8de5730dfe4e8900,Merge pull request #7327 from cloudflare/maizatskyi/2026-09-11-log-periodically,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +a6253f0f7e720356304d029eac05c12a3abd0d5a,40acccf4bd3a4fa320ceb43a4cbe20ebb53acc1f,Cancel a queued tee's source when its last consumer leaves,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/readable.ts;src/tests/node/stream/AGENTS.md;src/tests/node/stream/finished-and-abort.js;src/tests/node/stream/main.js;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/tee.js;src/wpt/streams-test-ts.ts +40acccf4bd3a4fa320ceb43a4cbe20ebb53acc1f,b4bbf3b8f4b26e8f63356fa9e61556d505d943cb,Support web streams in stream.finished() and addAbortSignal(),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_errors.ts;src/node/internal/streams_add_abort_signal.ts;src/node/internal/streams_end_of_stream.ts;src/per_isolate/per_isolate-env.d.ts;src/per_isolate/primordials.ts;src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/writable.ts;src/tests/node/AGENTS.md;src/tests/node/stream/AGENTS.md;src/tests/node/stream/finished-and-abort.js;src/tests/node/stream/main.js;src/tests/node/stream/stream-modules.capnp +b4bbf3b8f4b26e8f63356fa9e61556d505d943cb,b577d291c1bf960306bedc91ffc5b5a115266fcd 2d0c3dd00e66943585b1c0fe3207849adc5d13bd,Merge pull request #7341 from cloudflare/jasnell/node-streams-05-http-client,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +b577d291c1bf960306bedc91ffc5b5a115266fcd,b9bbbb3f411b8e05329482466460657b0867076f de1c21ac95cec3403bd4ffdb116e9da4bef36a14,Merge pull request #7308 from cloudflare/jasnell/streams-alloc-tidy-check,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +b9bbbb3f411b8e05329482466460657b0867076f,2413260068718138a8da7138b9ddcad35bec11ac,Python: More minor improvements to patch_pyodide_asm (#7376),"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",src/pyodide/internal/pool/builtin_wrappers.ts;src/pyodide/internal/util.ts;src/pyodide/tools/patch_pyodide_asm.ts +2d0c3dd00e66943585b1c0fe3207849adc5d13bd,325dff11ad993afc9572a8fdae4451374074cb4b,Address review feedback for the node/http-client tests,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/request-body.js +325dff11ad993afc9572a8fdae4451374074cb4b,84555d441bc8b1f8060c4a1b1b11f8961f75f223,Pin data volumes and chunk shapes through the node http client,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/data-volumes.js;src/tests/node/http-client/http-client-modules.capnp;src/tests/node/http-client/main.js +84555d441bc8b1f8060c4a1b1b11f8961f75f223,ab6b6c2cc472bdc6663067f137bdca4c50834907,Pin re-entrant teardown and invalid chunks through the node http client,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/http-client-modules.capnp;src/tests/node/http-client/main.js;src/tests/node/http-client/reentrancy.js;src/tests/node/http-client/request-body.js +ab6b6c2cc472bdc6663067f137bdca4c50834907,46ec18ee56a8ddfc9c795724de49d4bd1043761b,Fail a node ClientRequest whose send throws,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/http-client-modules.capnp;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/main.js;src/tests/node/http-client/then-pollution.js +46ec18ee56a8ddfc9c795724de49d4bd1043761b,5bd322dbdc661fe6e8b220fed910f4f1aff8c3ae,Refuse a write after end() on a node ClientRequest,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/main.js;src/tests/node/http-client/request-body.js +5bd322dbdc661fe6e8b220fed910f4f1aff8c3ae,a364cbdd880c8b6506dcd5097ff65cb00a087141,Make the node ClientRequest's timeout an idle timer,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/node/internal/internal_http_incoming.ts;src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/main.js +a364cbdd880c8b6506dcd5097ff65cb00a087141,7869f758ef749a90aaad8f5813f27dab16712b6e,Set the exchange's timer from a node client response's setTimeout(),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/node/internal/internal_http_incoming.ts;src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/main.js;src/workerd/api/node/tests/http-client-nodejs-test.js;src/workerd/api/node/tests/http-server-nodejs-test.js +7869f758ef749a90aaad8f5813f27dab16712b6e,923859e13f261d25adcbdbfbd96b7822464df0cc,Finish a node OutgoingMessage at its 'close' in end-of-stream,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_end_of_stream.ts;src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/main.js;src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/main.js;src/tests/node/http-server/response-body.js;src/workerd/api/node/tests/streams-nodejs-test.js +923859e13f261d25adcbdbfbd96b7822464df0cc,99bf4efb200dc0340bbbe4afd1acc62dc2863d80,Dump a node client response nobody listens for,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/main.js +99bf4efb200dc0340bbbe4afd1acc62dc2863d80,0b4bd80c3a666c66943b1136cc3437c594a121f1,Add framing-failure replies to the node:http client sidecar,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/BUILD.bazel;src/tests/node/http-client/harness.js;src/tests/node/http-client/http-client-cpp.wd-test;src/tests/node/http-client/http-client-ts.wd-test;src/tests/node/http-client/http-servers.js;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/main.js +0b4bd80c3a666c66943b1136cc3437c594a121f1,49810d3caf262ed1723ced1e277e78d97a9e7e56,Pin the node client response's pipe() backpressure,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/interop.js;src/tests/node/http-client/main.js +49810d3caf262ed1723ced1e277e78d97a9e7e56,4b557e8ba3733f70b8bb56d0d795ad58a5e2289e,Copy a node ClientRequest's written chunks at write(),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/tests/node/http-client/AGENTS.md;src/tests/node/http-client/main.js;src/tests/node/http-client/request-body.js +4b557e8ba3733f70b8bb56d0d795ad58a5e2289e,fcea7095f1dc2eb49c07572e579903b451caa6c5,Add the spec index to the node:http client suite,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/http-client/AGENTS.md +fcea7095f1dc2eb49c07572e579903b451caa6c5,270e1b9e385f1eed920f792d44e27e336fcdf660,Expose a node ClientRequest's response as req.res,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/tests/node/http-client/lifecycle.js +270e1b9e385f1eed920f792d44e27e336fcdf660,2069d75f0d61df3670b66d6ee5e0dbb72d61d58d,Fire a node ClientRequest's timeout once and tear the request down,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/main.js +2069d75f0d61df3670b66d6ee5e0dbb72d61d58d,6f708d676c47f81d5163c4ac38250bdec9532bcc,Make a node ClientRequest's abort() the quiet destroy Node defines,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/main.js +6f708d676c47f81d5163c4ac38250bdec9532bcc,844ec5972c150539eddbc393dfcb88ff3d5a41e4,Tear down a node ClientRequest as Node does when it is destroyed or fails,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_client.ts;src/node/internal/internal_http_outgoing.ts;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/main.js;src/workerd/api/node/tests/http-client-nodejs-test.js;src/workerd/api/node/tests/http-client-path-ssrf-test.js +844ec5972c150539eddbc393dfcb88ff3d5a41e4,10663d7a5eaec53bc5003f121089b5232c47ee2c,Emit a node client response's 'close' once,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_incoming.ts;src/tests/node/http-client/lifecycle.js +10663d7a5eaec53bc5003f121089b5232c47ee2c,2413260068718138a8da7138b9ddcad35bec11ac,Add node:http client suite,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/AGENTS.md;src/tests/node/http-client/BUILD.bazel;src/tests/node/http-client/harness.js;src/tests/node/http-client/http-client-cpp.wd-test;src/tests/node/http-client/http-client-modules.capnp;src/tests/node/http-client/http-client-ts.wd-test;src/tests/node/http-client/http-servers.js;src/tests/node/http-client/interop.js;src/tests/node/http-client/lifecycle.js;src/tests/node/http-client/main.js;src/tests/node/http-client/request-body.js;src/tests/node/http-client/response-body.js;src/tests/node/http-client/which-impl.js;src/workerd/api/node/tests/BUILD.bazel;src/workerd/api/node/tests/http-client-nodejs-server.js;src/workerd/api/node/tests/http-client-nodejs-test.js;src/workerd/api/node/tests/http-client-nodejs-test.wd-test +a40bc556e2cd2c8b0b258d490f6703c73edcceb5,2413260068718138a8da7138b9ddcad35bec11ac,"fix code cache; attach type of code being cached, flags used while evaluating","Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",build/config/BUILD.bazel;build/wd_js_bundle.bzl;build/wd_ts_script_bundle.bzl;src/rust/gen-compile-cache/cxx-bridge.c++;src/rust/gen-compile-cache/cxx-bridge.h;src/rust/gen-compile-cache/main.rs;src/workerd/io/BUILD.bazel;src/workerd/io/per-isolate-bootstrap.c++;src/workerd/io/per-isolate-compile-cache-test.c++;src/workerd/tests/test-fixture.c++;src/workerd/tests/test-fixture.h +2413260068718138a8da7138b9ddcad35bec11ac,42fa1532005ffb4606fa3236954dd22e2a87d712,Fix kj-rs waker result race during joined readiness,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/kj-rs/awaiter.c++;src/rust/cxx/kj-rs/awaiter.h;src/rust/cxx/kj-rs/tests/awaitables-cc-test.c++;src/rust/cxx/kj-rs/tests/lib.rs;src/rust/cxx/kj-rs/tests/test_futures.rs +42fa1532005ffb4606fa3236954dd22e2a87d712,836d5053cb0ec8598f12a38876a0c1a428b2cc54 dc2c6c0da11b0a09bedaefd8944e3b0eb7b7c935,Merge pull request #7369 from cloudflare/gbedford/fs-open-trunc,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +836d5053cb0ec8598f12a38876a0c1a428b2cc54,aed3512d78b8cf3132eb27625919bcf9ee94f36d 6155084d7785d869fc27286c62e13bb5ebaa752d,Merge pull request #7340 from cloudflare/jasnell/node-streams-04-http-server,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +aed3512d78b8cf3132eb27625919bcf9ee94f36d,05801ff6c1c4e7a9eea94494647525255e7cf4e2,Add scheduling time to alarm storage spans (#7359),Native observability: scheduled-time tags in alarm storage spans; no local native span observer.,src/workerd/api/actor-state.c++;src/workerd/api/tests/actor-kv-test-tail.js;src/workerd/api/tests/actor-kv-test.js;src/workerd/api/tests/tail-worker-test.js +6155084d7785d869fc27286c62e13bb5ebaa752d,0ecfdd7344bedf0406a8bde8de4104ea7acabe0b,Address multiple review comments,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_server.ts;src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/http-server-cpp-legacy.wd-test;src/tests/node/http-server/http-server-cpp.wd-test;src/tests/node/http-server/http-server-modules.capnp;src/tests/node/http-server/legacy-main.js;src/tests/node/http-server/legacy-rejection-tracking.js;src/tests/node/http-server/listener-rejections.js;src/tests/node/http-server/main.js;src/tests/node/http-server/reentrancy.js;src/tests/node/http-server/request-destroy.js;src/tests/node/http-server/response-body.js;src/tests/node/http-server/response-lifecycle.js;src/tests/streams/identity/AGENTS.md;src/tests/streams/identity/cancel-propagation.js;src/tests/streams/identity/main.js +0ecfdd7344bedf0406a8bde8de4104ea7acabe0b,5702ee2e047dd1ee31f4f8a05da1ee990ae88635,Pin data volumes and chunk shapes through the node http server,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/data-volumes.js;src/tests/node/http-server/http-server-modules.capnp;src/tests/node/http-server/main.js +5702ee2e047dd1ee31f4f8a05da1ee990ae88635,ef18a11251c8cc9b79040330e46c8912810e1bb0,"Pin body-stream failures, Content-Length lies and re-entrancy through the node http server",Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/http-server-modules.capnp;src/tests/node/http-server/main.js;src/tests/node/http-server/reentrancy.js;src/tests/node/http-server/request-body-failures.js;src/tests/node/http-server/response-body.js;src/tests/node/http-server/then-pollution.js +ef18a11251c8cc9b79040330e46c8912810e1bb0,4fa964dfcdf6ce911e6027b9e503490e4a4c73c0,Tear down a node ServerResponse whose async request listener rejects,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_server.ts;src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/main.js;src/tests/node/http-server/response-lifecycle.js +4fa964dfcdf6ce911e6027b9e503490e4a4c73c0,70ece7a9ff1edd2802029cfe3f34ef7396163ee3,Drop a node ServerResponse's buffered chunks once it is destroyed,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_server.ts;src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/harness.js;src/tests/node/http-server/main.js;src/tests/node/http-server/response-lifecycle.js +70ece7a9ff1edd2802029cfe3f34ef7396163ee3,4e1a644b86412dd508eb5da7805eee4bd7b6d904,Pipe a node IncomingMessage with the Readable's pipe(),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_incoming.ts;src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/http-server-modules.capnp;src/tests/node/http-server/main.js;src/tests/node/http-server/piping.js +4e1a644b86412dd508eb5da7805eee4bd7b6d904,a11810be9cb7f1508d53d1dd7dc7d0c96a5ba553,Copy the node ServerResponse's written chunks before enqueueing them,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_server.ts;src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/buffer-lifecycle.js;src/tests/node/http-server/http-server-modules.capnp;src/tests/node/http-server/main.js +a11810be9cb7f1508d53d1dd7dc7d0c96a5ba553,c17a94ab2bbc80d1d3bd2f40e5c85f7b3cf08de7,Honor the node http server's rejectNonStandardBodyWrites option,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_server.ts;src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/main.js;src/tests/node/http-server/response-body.js +c17a94ab2bbc80d1d3bd2f40e5c85f7b3cf08de7,aaad68f9966f62d0ce57a516d8df4e7b9386d147,Send no body in the node http server's reply to a HEAD,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_server.ts;src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/legacy-constructor-gate.js;src/tests/node/http-server/main.js;src/tests/node/http-server/response-body.js +aaad68f9966f62d0ce57a516d8df4e7b9386d147,2938927c0d837a299e74ec90a7e04fb85b491651,Add the legacy cell and the spec index to the node:http server suite,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/http-server/AGENTS.md;src/tests/node/http-server/BUILD.bazel;src/tests/node/http-server/http-server-cpp-legacy.wd-test;src/tests/node/http-server/legacy-constructor-gate.js;src/tests/node/http-server/legacy-main.js;src/tests/node/http-server/response-body.js +2938927c0d837a299e74ec90a7e04fb85b491651,a4747435f77d468424b6877ebc9dc2af4cad3f90,Tear down the node ServerResponse's Response and body when it is destroyed,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_server.ts;src/tests/node/http-server/main.js;src/tests/node/http-server/response-body.js;src/tests/node/http-server/response-lifecycle.js;src/workerd/api/node/tests/http-outgoing-nodejs-test.js +a4747435f77d468424b6877ebc9dc2af4cad3f90,7a463ad6a3889b0a59ccd7ca66761518fd1ce9c9,Cancel the node IncomingMessage's body stream when the message is destroyed,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_incoming.ts;src/tests/node/http-server/main.js;src/tests/node/http-server/request-destroy.js +7a463ad6a3889b0a59ccd7ca66761518fd1ce9c9,2a8cd7ec4083e652646e64a7933b2895c0589fb9,Keep the node IncomingMessage's body reader across backpressure pauses,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_incoming.ts;src/tests/node/http-server/main.js;src/tests/node/http-server/request-body.js +2a8cd7ec4083e652646e64a7933b2895c0589fb9,170d432f5e450e7cd91f6d7858dd6f4b62b02a70,Add node:http server suite,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/AGENTS.md;src/tests/node/http-server/BUILD.bazel;src/tests/node/http-server/harness.js;src/tests/node/http-server/http-server-cpp.wd-test;src/tests/node/http-server/http-server-modules.capnp;src/tests/node/http-server/http-server-ts.wd-test;src/tests/node/http-server/main.js;src/tests/node/http-server/request-body.js;src/tests/node/http-server/request-destroy.js;src/tests/node/http-server/response-body.js;src/tests/node/http-server/response-lifecycle.js;src/tests/node/http-server/which-impl.js;src/workerd/api/node/tests/http-server-nodejs-test.js +170d432f5e450e7cd91f6d7858dd6f4b62b02a70,05801ff6c1c4e7a9eea94494647525255e7cf4e2,Import Buffer in the node http OutgoingMessage,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_http_outgoing.ts +05801ff6c1c4e7a9eea94494647525255e7cf4e2,90c767007d78f81136a864c3ec732255c0a3ee10 b46ec6b2f6c4a9624bee77b7aa5e8fdc142410c5,Merge pull request #7339 from cloudflare/jasnell/node-streams-03-net,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +90c767007d78f81136a864c3ec732255c0a3ee10,f0811d88b94fb7ed7c5ad9799660b31090bb7fb6,node:fs: fix offset/length bounds validation for buffer read/write (#7368),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_fs_callback.ts;src/node/internal/internal_fs_promises.ts;src/node/internal/internal_fs_utils.ts;src/workerd/api/node/tests/fs-nodejs-test.js +f0811d88b94fb7ed7c5ad9799660b31090bb7fb6,446bff590e96a82c30dbb0d729918175f0da4489 32a19999f132d2f069c7500a526b69be3426441a,Merge pull request #7323 from cloudflare/apeacock/owned-jsrpc-replay-plan,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +446bff590e96a82c30dbb0d729918175f0da4489,980d3ceb44ac7424013f6761e44597f0ce0caaba 44e84d3f4d132824fd86e9fe48f783bd941b2752,Merge pull request #7295 from cloudflare/jasnell/expand-js-rpc-streams-coverage,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +4886a6772b1275cabc8296fd8de5730dfe4e8900,980d3ceb44ac7424013f6761e44597f0ce0caaba,thread-safe LOG_PERIODICALLY,Native observability/lifetime or tests: local public no-op tracing handled separately; no observer delivery backend.,src/workerd/util/sentry-test.c++;src/workerd/util/sentry.h +b46ec6b2f6c4a9624bee77b7aa5e8fdc142410c5,4c5dbb8580a47c5bc542478c78ade5a34b1e8920,Address review and fixups after rebase,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_net.ts;src/tests/node/net/AGENTS.md;src/tests/node/net/end-and-destroy.js;src/tests/node/net/half-close.js;src/tests/node/net/legacy-onread.js;src/tests/node/net/main.js;src/tests/node/net/onread.js +980d3ceb44ac7424013f6761e44597f0ce0caaba,4bad72c5c4d4d2f559e63bbb258544cc4e64cdf3 12ead33d0a942521745f34833317acf3cd2efabc,Merge pull request #7307 from ghostwriternr/fix/container-named-images-no-default,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +4c5dbb8580a47c5bc542478c78ade5a34b1e8920,a4ec14d4d5db2138216d7491f1bcd1f262f58dfd,"Pin re-entrancy, then pollution and a resizable onread buffer through the node socket",Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/net/AGENTS.md;src/tests/node/net/main.js;src/tests/node/net/net-modules.capnp;src/tests/node/net/onread.js;src/tests/node/net/reentrancy.js;src/tests/node/net/then-pollution.js +a4ec14d4d5db2138216d7491f1bcd1f262f58dfd,1025306aec2de95b429b9d8d769cb43e77ac1809,Pin data shapes and volumes through the node socket,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/net/AGENTS.md;src/tests/node/net/data-volumes.js;src/tests/node/net/main.js;src/tests/node/net/net-modules.capnp +1025306aec2de95b429b9d8d769cb43e77ac1809,6b8c0166518717b750950c28d6c5c3792ef3b119,Report every rejected node socket write to its callback,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_net.ts +6b8c0166518717b750950c28d6c5c3792ef3b119,3e736f236b834baaa3bd6fa55e5ea71e62f3c830,"Add reset, trickle and utf8-split servers to the node:net sidecar",Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/net/AGENTS.md;src/tests/node/net/BUILD.bazel;src/tests/node/net/end-and-destroy.js;src/tests/node/net/main.js;src/tests/node/net/net-cpp-legacy.wd-test;src/tests/node/net/net-cpp.wd-test;src/tests/node/net/net-ts.wd-test;src/tests/node/net/servers.js;src/tests/node/net/tcp-servers.js +3e736f236b834baaa3bd6fa55e5ea71e62f3c830,c4e38c2f0d66563ccedd8b869f78fabc8082c6d3,Report the node socket's read-loop failures,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_errors.ts;src/node/internal/internal_net.ts;src/node/internal/internal_tls_wrap.ts;src/tests/node/net/AGENTS.md;src/tests/node/net/main.js;src/tests/node/net/onread.js +c4e38c2f0d66563ccedd8b869f78fabc8082c6d3,9c01f565e9214ee8c490a77501380d88bcfe19b7,Leave a node socket without an idle timer after setTimeout(0),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_net.ts;src/tests/node/net/AGENTS.md;src/tests/node/net/servers.js;src/tests/node/net/timeouts.js +9c01f565e9214ee8c490a77501380d88bcfe19b7,ffb4ddae6c86c79d09083fb06a9392a706932b51,Add the legacy cell and the spec index to the node:net suite,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/net/AGENTS.md;src/tests/node/net/BUILD.bazel;src/tests/node/net/legacy-main.js;src/tests/node/net/legacy-onread.js;src/tests/node/net/net-cpp-legacy.wd-test +ffb4ddae6c86c79d09083fb06a9392a706932b51,ec1bb487183d3e9dac477eb407526b0ee7cd3d4f,Run one read loop per node socket and keep reading into a fixed onread buffer,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_net.ts;src/tests/node/net/main.js;src/tests/node/net/net-modules.capnp;src/tests/node/net/onread.js;src/tests/node/net/servers.js +ec1bb487183d3e9dac477eb407526b0ee7cd3d4f,3b840a57c28f299e94690949d6e64dad1a84fec0,Surface a node socket's EOF without a consumer,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_net.ts;src/tests/node/net/backpressure.js;src/tests/node/net/half-close.js;src/tests/node/net/main.js;src/workerd/api/node/tests/net-nodejs-test.js +3b840a57c28f299e94690949d6e64dad1a84fec0,ed735c389a6b9aef9d47dee0103919a1eb677fa0,Restart the node socket's idle timer without re-registering listeners,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_net.ts;src/tests/node/net/main.js;src/tests/node/net/timeouts.js +ed735c389a6b9aef9d47dee0103919a1eb677fa0,f7dd327d80199a233af122a41bdc31ccafd46caf,Emit the node socket's destroy error once,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_net.ts;src/tests/node/net/end-and-destroy.js;src/tests/node/net/main.js +f7dd327d80199a233af122a41bdc31ccafd46caf,67242a28b4fd8c10166466c957f7b261f7d8764a,Count string writes in the node socket's bytesWritten,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_net.ts;src/tests/node/net/connect-lifecycle.js;src/tests/node/net/echo-roundtrip.js;src/tests/node/net/main.js +67242a28b4fd8c10166466c957f7b261f7d8764a,4a67ea0c5a431c23d23fa97e349a7f48d3c6ba8e,Let the node socket alone end its writable side on peer EOF,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/internal_net.ts;src/tests/node/net/end-and-destroy.js;src/tests/node/net/half-close.js;src/tests/node/net/main.js +4a67ea0c5a431c23d23fa97e349a7f48d3c6ba8e,4bad72c5c4d4d2f559e63bbb258544cc4e64cdf3,Add node:net suite,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/AGENTS.md;src/tests/node/net/BUILD.bazel;src/tests/node/net/backpressure.js;src/tests/node/net/connect-lifecycle.js;src/tests/node/net/echo-roundtrip.js;src/tests/node/net/end-and-destroy.js;src/tests/node/net/half-close.js;src/tests/node/net/interop.js;src/tests/node/net/main.js;src/tests/node/net/net-cpp.wd-test;src/tests/node/net/net-modules.capnp;src/tests/node/net/net-ts.wd-test;src/tests/node/net/servers.js;src/tests/node/net/tcp-servers.js;src/tests/node/net/timeouts.js;src/tests/node/net/which-impl.js;src/workerd/api/node/tests/BUILD.bazel;src/workerd/api/node/tests/net-nodejs-tcp-server.js;src/workerd/api/node/tests/net-nodejs-test.js;src/workerd/api/node/tests/net-nodejs-test.wd-test +4bad72c5c4d4d2f559e63bbb258544cc4e64cdf3,4b8802572742f0de72c40ea3490eaaddccc4e8cd 0bb39e2495f1e0ad61a86f359830402aff2b893e,Merge pull request #7338 from cloudflare/jasnell/node-streams-02-pipeline,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +4b8802572742f0de72c40ea3490eaaddccc4e8cd,6ab017323b1f5b975e6811dce0f46e6cc59f8882 c50c1badec2fcfc63d742b3e83e4a01f352f5c23,Merge pull request #7292 from cloudflare/dependabot/npm_and_yarn/next-16.3.3,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +32a19999f132d2f069c7500a526b69be3426441a,07e22ef2fa8463c0f4182a1be5b60807f0db51d0,STOR-5621: Add JS RPC sender benchmarks,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/BUILD.bazel;src/workerd/api/bench-jsrpc-sender.c++;src/workerd/api/jsrpc-call-plan-test.c++ +6ab017323b1f5b975e6811dce0f46e6cc59f8882,bc591a45c6db518c8714b805bd70fc908f96df0b a41a74cfca87d23b4bd4313ecb66f0ae4020b128,Merge pull request #7345 from cloudflare/apeacock/actor-fetch-retry-eligibility,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +a41a74cfca87d23b4bd4313ecb66f0ae4020b128,bc591a45c6db518c8714b805bd70fc908f96df0b,Report whether an actor fetch target supports retries,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/fetch-body-rewindable-test.c++;src/workerd/api/http.c++;src/workerd/io/observer.h;src/workerd/tests/test-fixture.h +12ead33d0a942521745f34833317acf3cd2efabc,826ca8ac4139b5b872330f968a6a167b48094c92 bc591a45c6db518c8714b805bd70fc908f96df0b,Merge branch 'main' into fix/container-named-images-no-default,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +bc591a45c6db518c8714b805bd70fc908f96df0b,20d4ecd46d3a3409e35b48b0979189b523655cc7 60626a600bf06bebe8080174a424152ea4f3fa8b,Merge pull request #7353 from cloudflare/apeacock/fix-multireplica-do-retries,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +20d4ecd46d3a3409e35b48b0979189b523655cc7,edd9aaa8679dc35ce101eb3d50acf21e3050017a 95edab081eef9c3517ee499a701b80d6b70d1c1f,Merge pull request #7370 from cloudflare/pkhanna/facet-uaf,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +95edab081eef9c3517ee499a701b80d6b70d1c1f,e52fd0797ba2a46f73d03cece2109032aad5b447,fix(server): facet channel UaF after alarm timeout,Native facet lifetime fix: shared root access-time allocation; local facets retain explicit tree/context and no dangling native parent access pointer.,src/workerd/server/server-test.c++;src/workerd/server/server.c++ +60626a600bf06bebe8080174a424152ea4f3fa8b,edd9aaa8679dc35ce101eb3d50acf21e3050017a,Support disabling retries for multi-replica actors,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-call-retry.h;src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/actor.c++;src/workerd/api/actor.h;src/workerd/api/export-loopback.h;src/workerd/server/workerd-api.c++ +44e84d3f4d132824fd86e9fe48f783bd941b2752,146631de30a5d453360bc4d21a78e9a837dee4a5,Address jsrpc streams test review feedback,Native RPC stream regression coverage; KJ pumps and Capn Proto stream transfer absent locally.,src/workerd/api/tests/js-rpc-streams-crossflag-test.js;src/workerd/api/tests/js-rpc-writable-teardown-test.js +edd9aaa8679dc35ce101eb3d50acf21e3050017a,bdb80d4db55af1ea2271a71f6ef01a330541f37d,update dependencies to latest version,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/bigbonk.yml;.github/workflows/bonk.yml;.github/workflows/new-pr-review.yml;build/deps/gen/build_deps.MODULE.bazel;build/deps/gen/deps.MODULE.bazel;deps/rust/Cargo.lock +146631de30a5d453360bc4d21a78e9a837dee4a5,454835d8b33fb155eea0b510dc1219428f9e02c4,Expand cross-impl js-rpc streams failure coverage,Native RPC stream regression coverage; KJ pumps and Capn Proto stream transfer absent locally.,src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/js-rpc-streams-crossflag-test.js;src/workerd/api/tests/js-rpc-writable-teardown-crossflag-reverse-test.wd-test;src/workerd/api/tests/js-rpc-writable-teardown-crossflag-test.wd-test;src/workerd/api/tests/js-rpc-writable-teardown-test.js +454835d8b33fb155eea0b510dc1219428f9e02c4,bdb80d4db55af1ea2271a71f6ef01a330541f37d,Expand js-rpc streams happy-path tests,Native RPC stream regression coverage; KJ pumps and Capn Proto stream transfer absent locally.,src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/js-rpc-streams-crossflag-reverse-test.wd-test;src/workerd/api/tests/js-rpc-streams-crossflag-test.js;src/workerd/api/tests/js-rpc-streams-crossflag-test.wd-test +0bb39e2495f1e0ad61a86f359830402aff2b893e,32f84d256d7835cb14624f54dfdf2b27736335f2,Address streams test improvements reviews,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_pipeline.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/pipeline-web.js +dc2c6c0da11b0a09bedaefd8944e3b0eb7b7c935,e52fd0797ba2a46f73d03cece2109032aad5b447,node:fs: honour O_TRUNC in open,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/filesystem.d.ts;src/node/internal/internal_fs_sync.ts;src/workerd/api/filesystem.c++;src/workerd/api/filesystem.h;src/workerd/api/node/tests/fs-nodejs-test.js;src/workerd/io/worker-fs.c++;src/workerd/io/worker-fs.h +32f84d256d7835cb14624f54dfdf2b27736335f2,8f7a642195eaa4ff050910cae1270695545312a4,Fail a pipeline as soon as its web source errors,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_pipeline.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/pipeline-web.js +8f7a642195eaa4ff050910cae1270695545312a4,f89f3b60cf3a55e72c65323f3c14f56b29f5f29a,Pin an unconvertible web chunk and a pending-read abort through pipeline(),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/pipeline-web.js +f89f3b60cf3a55e72c65323f3c14f56b29f5f29a,717208912014a4a634bde4bb904370dedf0ec145,Fail a pipeline whose web destination is already locked,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_pipeline.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/pipeline-web.js +717208912014a4a634bde4bb904370dedf0ec145,9d2b78530680eaae11144deacc2e990546734e28,Fail a pipeline as soon as its web destination errors,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_pipeline.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/pipeline-web.js +9d2b78530680eaae11144deacc2e990546734e28,359f4062bc861e72cf62c04fbf8a7de7441d4243,Read a pipeline's web source through a reader its teardown can cancel,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_pipeline.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/main.js;src/tests/node/stream/pipeline-web.js +359f4062bc861e72cf62c04fbf8a7de7441d4243,bdb80d4db55af1ea2271a71f6ef01a330541f37d,Support web streams in stream.pipeline(),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_pipeline.js;src/node/internal/streams_promises.ts;src/tests/node/AGENTS.md;src/tests/node/stream/AGENTS.md;src/tests/node/stream/legacy-constructor-gate.js;src/tests/node/stream/legacy-main.js;src/tests/node/stream/main.js;src/tests/node/stream/pipeline-web.js;src/tests/node/stream/stream-cpp-legacy.wd-test;src/tests/node/stream/stream-modules.capnp +bdb80d4db55af1ea2271a71f6ef01a330541f37d,e52fd0797ba2a46f73d03cece2109032aad5b447 26e6ee69b8d4bc0de61c9b3eec2528d68313a67d,Merge pull request #7336 from cloudflare/jasnell/node-streams-01-stream-adapters,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +e52fd0797ba2a46f73d03cece2109032aad5b447,f75e6b45ffed96225991f129276d1659c050dc1b,Release 2026-09-15,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +f75e6b45ffed96225991f129276d1659c050dc1b,aec43b417e59211c5531ccfc060dac9e0a214f8b,chore: Tidy up Pyodide patches (#7367),"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",build/deps/pyodide.MODULE.bazel;build/python_metadata.bzl;src/pyodide/internal/pool/builtin_wrappers.ts;src/pyodide/internal/util.ts;src/pyodide/tools/patch_pyodide_asm.ts +26e6ee69b8d4bc0de61c9b3eec2528d68313a67d,db3b361fa3b68b29fa75ed6ee426a8d1e616b745,Bound the work of three node:stream adapter tests,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/stream/readable-from-web.js;src/tests/node/stream/readable-to-web.js +aec43b417e59211c5531ccfc060dac9e0a214f8b,d14feab2ef309488ad10d65cb59fc0abaaf01ba2 35125c9e9a37bcc3aeba8b495a69b1d16955abc1,Fix memory snapshots with Python 3.14 (#7311),Merge topology: component commits are indexed separately; final endpoint diff reviewed., +35125c9e9a37bcc3aeba8b495a69b1d16955abc1,18f1fbe6350440ddea1c5b0dd1706e701fcc80f4,"Add vendored packages tests for shapely, pillow and pywavelets","Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",build/deps/pyodide.MODULE.bazel;build/python_metadata.bzl;src/pyodide/default.profraw;src/workerd/server/tests/python/vendor_pkg_tests/BUILD;src/workerd/server/tests/python/vendor_pkg_tests/Pillow.py;src/workerd/server/tests/python/vendor_pkg_tests/Pillow_vendor.wd-test;src/workerd/server/tests/python/vendor_pkg_tests/pywavelets.py;src/workerd/server/tests/python/vendor_pkg_tests/pywavelets_vendor.wd-test +18f1fbe6350440ddea1c5b0dd1706e701fcc80f4,2a6975624c3e8174032d4e4240be76dd244e6b96,Add a mechanism for Pyodide-version-specific snapshot flags,"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",build/deps/pyodide.MODULE.bazel;build/python_metadata.bzl;src/pyodide/internal/snapshot.ts +2a6975624c3e8174032d4e4240be76dd244e6b96,4cfb37f741640d7a48a8692eac89d83b2221894b,Python snapshot release: make update-released flag only refer to baseline snapshots,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/release-python-snapshots.yml;src/pyodide/make_snapshots.py +4cfb37f741640d7a48a8692eac89d83b2221894b,81e7d3edaeb24f076119b8e16cc090ddeac3a23a,Fix memory snapshots with Python 3.14,"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",build/deps/pyodide.MODULE.bazel;build/python_metadata.bzl;src/pyodide/internal/snapshot.ts;src/pyodide/tools/patch_pyodide_asm.ts;src/pyodide/types/emscripten.d.ts;src/workerd/server/tests/python/vendor_pkg_tests/BUILD +d14feab2ef309488ad10d65cb59fc0abaaf01ba2,4cd51d96a3199748409f3126d895617f4b3d4ebe,[build] JSG: move TypeWrapper members that ignore the type list to a base,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/jsg/jsg.h;src/workerd/jsg/setup.h;src/workerd/jsg/type-wrapper.h +db3b361fa3b68b29fa75ed6ee426a8d1e616b745,7912065cb96b69549bcba09dda9d39ea35dd6ea6,"Pin the Duplex.fromWeb validation, locking, half-open and destroy semantics",Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/stream/AGENTS.md;src/tests/node/stream/duplex-from-web.js;src/tests/node/stream/main.js +7912065cb96b69549bcba09dda9d39ea35dd6ea6,4fccc0de721007bd9ba90c3c6d42828672489b98,Close a Readable.toWeb stream on a Duplex source's readable EOF alone,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_readable.js;src/tests/node/stream/AGENTS.md;src/tests/node/stream/duplex-to-web.js;src/tests/node/stream/main.js +81e7d3edaeb24f076119b8e16cc090ddeac3a23a,245a578ccac1a3e4a3dd10f224d84a569903f2a0,Make PYODIDE_VERSION refer to realPyodideVersion (not 'dev'),"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",src/pyodide/internal/const.ts;src/pyodide/internal/metadata.ts;src/pyodide/internal/python.ts;src/workerd/io/worker-modules.c++ +4fccc0de721007bd9ba90c3c6d42828672489b98,c8be269063e7b9d0620db7277a38ba1f0dacfa87,Add legacy and pedantic cells and the spec index to the node:stream suite,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/stream/AGENTS.md;src/tests/node/stream/BUILD.bazel;src/tests/node/stream/legacy-constructor-gate.js;src/tests/node/stream/legacy-main.js;src/tests/node/stream/stream-cpp-legacy.wd-test;src/tests/node/stream/stream-cpp-pedantic.wd-test +c8be269063e7b9d0620db7277a38ba1f0dacfa87,d5d3da554e9793c25cc090db4075f5d712d632d6,Fix Duplex.from() marking the wrong side finished for writable: false,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_duplex.js;src/tests/node/stream/duplex-from.js;src/tests/node/stream/main.js;src/tests/node/stream/stream-modules.capnp +d5d3da554e9793c25cc090db4075f5d712d632d6,0eef9edf7337b062e63271024bf44de9689a69ca,Expand the node:stream web-interop suite,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/stream/bodies.js;src/tests/node/stream/consumers.js;src/tests/node/stream/duplex-to-web.js;src/tests/node/stream/main.js;src/tests/node/stream/readable-from-web.js;src/tests/node/stream/readable-from.js;src/tests/node/stream/readable-to-web.js;src/tests/node/stream/stream-cpp.wd-test;src/tests/node/stream/stream-modules.capnp;src/tests/node/stream/stream-ts.wd-test;src/tests/node/stream/writable-from-web.js;src/tests/node/stream/writable-to-web.js +0eef9edf7337b062e63271024bf44de9689a69ca,45002850bd29758bf274845bfff74231b1a12906,Fix Duplex.fromWeb never destroying the duplex on web-side errors,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_duplex.js;src/tests/node/stream/duplex-from-web.js;src/tests/node/stream/main.js +45002850bd29758bf274845bfff74231b1a12906,2490a5d61834372b56bb5674debd349e1dfca904,Fix the fromWeb adapters' _writev completion after a failed write,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_duplex.js;src/node/internal/streams_writable.js;src/tests/node/stream/main.js;src/tests/node/stream/writable-from-web.js +2490a5d61834372b56bb5674debd349e1dfca904,77890f1d80637de255c7d51bc08b3c56c36b6f08,Fix Writable.fromWeb writing buffered-entry objects in _writev,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_writable.js;src/tests/node/stream/duplex-from-web.js;src/tests/node/stream/main.js;src/tests/node/stream/writable-from-web.js +77890f1d80637de255c7d51bc08b3c56c36b6f08,c6b11ad165bd7bece13f0c62fcd44a13d66cabfd,Fix the stream adapters destroying their counterpart with the wrong destroy,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_readable.js;src/node/internal/streams_writable.js;src/tests/node/stream/main.js;src/tests/node/stream/readable-to-web.js;src/tests/node/stream/writable-from-web.js;src/tests/node/stream/writable-to-web.js +c6b11ad165bd7bece13f0c62fcd44a13d66cabfd,4d8752757741511e6669972dc0306381cf99fe7f,Fix Writable.toWeb never observing the node stream's completion,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/node/internal/streams_writable.js;src/tests/node/stream/main.js;src/tests/node/stream/writable-to-web.js +4d8752757741511e6669972dc0306381cf99fe7f,4cd51d96a3199748409f3126d895617f4b3d4ebe,Add node:stream web-interop suite,Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/tests/node/AGENTS.md;src/tests/node/stream/BUILD.bazel;src/tests/node/stream/api-surface.js;src/tests/node/stream/bodies.js;src/tests/node/stream/duplex-from-web.js;src/tests/node/stream/duplex-to-web.js;src/tests/node/stream/main.js;src/tests/node/stream/readable-from-web.js;src/tests/node/stream/readable-to-web.js;src/tests/node/stream/stream-cpp.wd-test;src/tests/node/stream/stream-modules.capnp;src/tests/node/stream/stream-ts.wd-test;src/tests/node/stream/which-impl.js;src/tests/node/stream/writable-from-web.js;src/tests/node/stream/writable-to-web.js;src/tests/streams/AGENTS.md;src/workerd/api/node/tests/streams-test.js +4cd51d96a3199748409f3126d895617f4b3d4ebe,98c78568c28bf0547a00d583bcbd987dcba2b93a f958f1572012d10ada18644f568cacfa20a18943,Merge pull request #7335 from cloudflare/jasnell/streams-pin-error-pending-close,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +98c78568c28bf0547a00d583bcbd987dcba2b93a,daf75b0659248505add7101add5c2dc51767a477,node: make the isolate the port namespace for http and net servers (#7357),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/cloudflare/internal/http.ts;src/cloudflare/internal/sockets.d.ts;src/cloudflare/node.ts;src/node/internal/http.d.ts;src/node/internal/internal_http_server.ts;src/node/internal/internal_net.ts;src/workerd/api/node/tests/net-server-nodejs-test.js;src/workerd/api/node/tests/net-server-nodejs-test.wd-test;src/workerd/api/sockets.c++;src/workerd/api/sockets.h;src/workerd/io/io-context.c++;src/workerd/io/io-context.h +f958f1572012d10ada18644f568cacfa20a18943,e56ff79f4db27ab5f43e50f02119f7f1d0a6207d,Address review feedback on streams fix,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/controller.js +daf75b0659248505add7101add5c2dc51767a477,245a578ccac1a3e4a3dd10f224d84a569903f2a0,Update Cargo.toml dependencies and export Cargo.toml in BUILD.bazel,"Build, dependency, release tooling or documentation: no local runtime behavior port.",deps/rust/BUILD.bazel;deps/rust/Cargo.toml +245a578ccac1a3e4a3dd10f224d84a569903f2a0,ec2e9804302709317edb71048bd6a4cfc67da922 5305fbdeb484a5f287e869e288c1d56b0f8d187e,Merge pull request #7304 from ThomasRubini/trubini/connect_remote_addr_workerd,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +ec2e9804302709317edb71048bd6a4cfc67da922,7d85161d821b7f9cd31aee6aca86853a8736510d aac847986e4bb00eed857486bd52c63fc65bfe2b,Merge pull request #7355 from cloudflare/maizatskyi/2026-09-14-inspector-test,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +aac847986e4bb00eed857486bd52c63fc65bfe2b,1735073ee5bd914c2d41d6250715a4f8b7c1e7ea,disable profiler tests under tsan,Upstream inspector/profiler test configuration; no local V8 inspector implementation.,src/workerd/server/tests/inspector/BUILD.bazel;src/workerd/server/tests/inspector/driver.mjs;src/workerd/server/tests/inspector/inspector-test-harness.mjs;src/workerd/server/tests/inspector/profiler-driver.mjs +07e22ef2fa8463c0f4182a1be5b60807f0db51d0,7d85161d821b7f9cd31aee6aca86853a8736510d,STOR-5621: Prepare owned JS RPC call plans,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/BUILD.bazel;src/workerd/api/basics.c++;src/workerd/api/http.c++;src/workerd/api/http.h;src/workerd/api/js-writable-stream.c++;src/workerd/api/jsrpc-call-plan-test.c++;src/workerd/api/streams/writable.c++;src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/js-rpc-params-transfer-ownership-test.js;src/workerd/api/tests/js-rpc-params-transfer-ownership-test.wd-test;src/workerd/api/worker-rpc.c++;src/workerd/api/worker-rpc.h +7d85161d821b7f9cd31aee6aca86853a8736510d,ef476abe58cf77881a060364ea0910558436c1cb,Python workers: Replace string Pyodide patches with ast patches (#7325),"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",justfile;package.json;pnpm-lock.yaml;src/pyodide/helpers.bzl;src/pyodide/tools/BUILD.bazel;src/pyodide/tools/eslint.config.mjs;src/pyodide/tools/patch_pyodide_asm.ts;src/pyodide/tools/tsconfig.json;src/pyodide/tsconfig.json +ef476abe58cf77881a060364ea0910558436c1cb,c018b9f4680564bc5eeffe1f9ff31c8926ebe3a5,build: depend on the kj-async layer each target actually uses,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/memory-cache/ffi/BUILD.bazel;src/workerd/api/BUILD.bazel;src/workerd/io/BUILD.bazel;src/workerd/server/BUILD.bazel;src/workerd/tests/BUILD.bazel;src/workerd/util/BUILD.bazel +c018b9f4680564bc5eeffe1f9ff31c8926ebe3a5,db75e6012cdca18f08e0a7d1ce5f10ad3b0866ad,Release 2026-09-14,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +db75e6012cdca18f08e0a7d1ce5f10ad3b0866ad,17e4f5a73014286398fcf4e14f22c9caaffec42d,Release 2026-09-13,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +5305fbdeb484a5f287e869e288c1d56b0f8d187e,b03c003d0a3bb24d42fbb4a8d5882245220c1559,rename clientIp to clientAddress,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/api/global-scope.c++;src/workerd/api/global-scope.h;src/workerd/io/io-channels.h;src/workerd/io/worker-entrypoint.c++;src/workerd/io/worker-entrypoint.h;src/workerd/server/server.c++ +b03c003d0a3bb24d42fbb4a8d5882245220c1559,44a73b8960e0efb9489722a6aba258d7a9fdad87,chore: update capnproto,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/gen/deps.MODULE.bazel +44a73b8960e0efb9489722a6aba258d7a9fdad87,17e4f5a73014286398fcf4e14f22c9caaffec42d,feat: expose client IP as remoteAddress in TCP connect() handler,Host TCP/UDP/TLS transport or tests: no local cloudflare:sockets/connect event substrate.,src/workerd/api/global-scope.c++;src/workerd/api/global-scope.h;src/workerd/api/sockets.h;src/workerd/api/tests/connect-handler-test-proxy.js;src/workerd/api/tests/connect-handler-test.js;src/workerd/io/io-channels.h;src/workerd/io/worker-entrypoint.c++;src/workerd/io/worker-entrypoint.h;src/workerd/server/server.c++ +e56ff79f4db27ab5f43e50f02119f7f1d0a6207d,561bea4ba37989258820511c2dd0c6a205f34d74,Pin error() during a pending close in the readable stream suites,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/controller.js;src/tests/streams/readable-byte/main.js;src/tests/streams/readable/AGENTS.md;src/tests/streams/readable/controller.js;src/tests/streams/readable/main.js +17e4f5a73014286398fcf4e14f22c9caaffec42d,10c0673595ff30fc520e5d0da1c74be9b68b6977,node:net: add net.Server and cloudflare:node connectHandler (#7306),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/cloudflare/internal/http.ts;src/cloudflare/internal/sockets.d.ts;src/cloudflare/node.ts;src/node/internal/http.d.ts;src/node/internal/internal_errors.ts;src/node/internal/internal_http_server.ts;src/node/internal/internal_net.ts;src/workerd/api/global-scope.c++;src/workerd/api/node/tests/BUILD.bazel;src/workerd/api/node/tests/net-nodejs-test.js;src/workerd/api/node/tests/net-nodejs-test.wd-test;src/workerd/api/node/tests/net-server-nodejs-test.js;src/workerd/api/node/tests/net-server-nodejs-test.wd-test;src/workerd/api/sockets.c++;src/workerd/api/sockets.h;src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/connect-half-open-test.js;src/workerd/api/tests/connect-half-open-test.wd-test;src/workerd/io/io-context.c++;src/workerd/io/io-context.h;src/workerd/io/worker.h;src/workerd/server/server.c++;src/workerd/server/server.h;src/workerd/server/workerd-api.c++;src/workerd/server/workerd-api.h;types/defines/node.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/index.d.ts +10c0673595ff30fc520e5d0da1c74be9b68b6977,909e388c86905a217391cb557ac3260f1daff3d0,kj-rs-tokio: a kj::EventPort driven by a per-thread tokio runtime,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/AGENTS.md;src/rust/cxx/kj-rs-tokio/BUILD.bazel;src/rust/cxx/kj-rs-tokio/ffi.rs;src/rust/cxx/kj-rs-tokio/lib.rs;src/rust/cxx/kj-rs-tokio/port.rs;src/rust/cxx/kj-rs-tokio/tests/BUILD.bazel;src/rust/cxx/kj-rs-tokio/tests/lib.rs;src/rust/cxx/kj-rs-tokio/tests/test-helpers.h;src/rust/cxx/kj-rs-tokio/tests/test_helpers.rs;src/rust/cxx/kj-rs-tokio/tests/tokio-event-port-test.c++;src/rust/cxx/kj-rs-tokio/tokio-event-port.c++;src/rust/cxx/kj-rs-tokio/tokio-event-port.h +909e388c86905a217391cb557ac3260f1daff3d0,3e02c0f6d791ba21f9b4149be261453c022e383c,Release 2026-09-12,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +3e02c0f6d791ba21f9b4149be261453c022e383c,7d232930c8c14fd763a7b4ab09b6cdc30b16b755,Python: Add numpy vendor snapshot stability test (#7326),"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",build/deps/dep_pyodide.bzl;build/deps/pyodide.MODULE.bazel;build/python_metadata.bzl;src/pyodide/make_snapshots.py;src/workerd/server/tests/python/py_wd_test.bzl;src/workerd/server/tests/python/vendor_pkg_tests/BUILD +7d232930c8c14fd763a7b4ab09b6cdc30b16b755,3a1aba72bdb2baa351b068632c11bb9bc6091b7b,sockets: close() with a pipe close in flight logged an uncaught exception (#7313),Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/sockets/main.js;src/tests/streams/sockets/socket-streams.js;src/tests/streams/sockets/sockets-cpp.wd-test;src/tests/streams/sockets/sockets-ts.wd-test;src/workerd/api/sockets.c++;src/workerd/api/streams/internal.c++;src/workerd/server/tests/socket-close/BUILD.bazel;src/workerd/server/tests/socket-close/socket-close-pending-pipe.js;src/workerd/server/tests/socket-close/socket-close-pending-pipe.wd-test;src/workerd/server/tests/socket-close/socket-close-test.mjs +826ca8ac4139b5b872330f968a6a167b48094c92,3a1aba72bdb2baa351b068632c11bb9bc6091b7b,CC-8364 Allow containers without imageName,Separate Docker Containers service/client or tests: unrelated to local actor execution container.,src/workerd/api/container-test.c++;src/workerd/api/container.c++;src/workerd/server/container-client.c++;src/workerd/server/container-client.h;src/workerd/server/server-test.c++;src/workerd/server/server.c++;src/workerd/server/tests/container-client/container-client.wd-test;src/workerd/server/tests/container-client/test.js;src/workerd/server/workerd.capnp +c50c1badec2fcfc63d742b3e83e4a01f352f5c23,9038845f2bb7b8d88fdd8abbca40433ea7fae91c,Fix opennext-ssr-test for Next.js 16.3.3,Upstream OpenNext integration-test update; no local implementation change.,src/workerd/api/tests/opennextjs/README.md;src/workerd/api/tests/opennextjs/opennext-ssr-test.js;src/workerd/api/tests/opennextjs/opennext-ssr-test.wd-test +3a1aba72bdb2baa351b068632c11bb9bc6091b7b,999ef4b9f701831c6498d79d8045010cb008aa90,Add jsg::Lenient based on Rust jsg::Nullable,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/jsg-macros/lib.rs;src/rust/jsg-macros/resource.rs;src/rust/jsg-test/tests/eval.rs;src/rust/jsg-test/tests/resource_callback.rs;src/rust/jsg/README.md;src/rust/jsg/lenient.rs;src/rust/jsg/lib.rs;src/rust/jsg/resource.rs;src/rust/jsg/v8.rs;src/rust/jsg/wrappable.rs +999ef4b9f701831c6498d79d8045010cb008aa90,561bea4ba37989258820511c2dd0c6a205f34d74 644fa668526b6aceb93bdca49a7ae6df2813381e,Merge pull request #7317 from cloudflare/harris/2026-09-11-tokio-minimal-prerequisites,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +644fa668526b6aceb93bdca49a7ae6df2813381e,561bea4ba37989258820511c2dd0c6a205f34d74,[nfc] Keep kj-rs off the OS event loop,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/kj-rs/BUILD.bazel +561bea4ba37989258820511c2dd0c6a205f34d74,925464ba9fe5751e4468626ce77f7a5810df274f 1fc2f393e9c6f92114ff665453fbca57439cc199,Merge pull request #7261 from cloudflare/rcorreia/WOR-1435/workflows-subscribe-types,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +925464ba9fe5751e4468626ce77f7a5810df274f,6a5e11bb0918cbdb9d8a9afe61f651cffa255294,Release 2026-09-11,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +de1c21ac95cec3403bd4ffdb116e9da4bef36a14,5f2bdd8bffe4cdfdc83c7ad3fd3720940bc8eeaf,Add clang-tidy check for stream creation,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,.clang-tidy;build/AGENTS.md;src/workerd/api/AGENTS.md;src/workerd/api/js-readable-stream.c++;src/workerd/api/js-writable-stream-test.c++;src/workerd/api/streams-test.c++;src/workerd/api/streams/AGENTS.md;src/workerd/api/streams/compression.c++;src/workerd/api/streams/draining-read-uaf-test.c++;src/workerd/api/streams/identity-transform-stream.c++;src/workerd/api/streams/internal-test.c++;src/workerd/api/streams/internal.c++;src/workerd/api/streams/readable.c++;src/workerd/api/streams/standard-test.c++;src/workerd/api/streams/standard.c++;src/workerd/api/streams/writable.c++;tools/clang-tidy/BUILD.bazel;tools/clang-tidy/legacy-stream-alloc-negative-test.c++;tools/clang-tidy/legacy-stream-alloc-positive-test.c++;tools/clang-tidy/legacy-stream-alloc-test.sh;tools/clang-tidy/legacy-stream-alloc.c++;tools/clang-tidy/legacy-stream-alloc.h;tools/clang-tidy/workerd-lint.c++ +6a5e11bb0918cbdb9d8a9afe61f651cffa255294,f51abb75d256e6ab3063bdd4b588358de1ca2a37 e23e55dab16e8b9fb20bdedd992b99255df0ccdf,Merge pull request #7293 from cloudflare/hoodmane/patch-workers-waitUntil,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +e23e55dab16e8b9fb20bdedd992b99255df0ccdf,9fa7dd59a6673dd014741531b9a226047b46740d,Python: Make sure that `waitUntil()` releases a rejected future,"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",src/pyodide/python-entrypoint-helper.ts +9fa7dd59a6673dd014741531b9a226047b46740d,ffdd405ef41249721121cb45d742bb78650571d8,Python: Patch `workers.wait_until` as well as `ctx.waitUntil`,"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",src/pyodide/python-entrypoint-helper.ts;src/workerd/server/tests/python/python-rpc/worker.py +f51abb75d256e6ab3063bdd4b588358de1ca2a37,5f2bdd8bffe4cdfdc83c7ad3fd3720940bc8eeaf,node:net: add net.BoundSocket (#7299),Host Node compatibility implementation/tests: runtime does not port node modules; browser AsyncResource exception screened separately.,src/cloudflare/internal/http.ts;src/cloudflare/node.ts;src/node/internal/http.d.ts;src/node/internal/internal_errors.ts;src/node/internal/internal_http_server.ts;src/node/internal/internal_net.ts;src/node/net.ts;src/workerd/api/node/tests/http-server-nodejs-test.js;src/workerd/api/node/tests/http-server-nodejs-test.wd-test;src/workerd/api/node/tests/net-nodejs-test.js +5f2bdd8bffe4cdfdc83c7ad3fd3720940bc8eeaf,4e2f4cf7ecf3b42c938d0e8e97a616c82f019ab2 d6c6416f0ff7a1c8064bd5beed24d6efd1eca450,Merge pull request #7297 from cloudflare/maizatskyi/2026-09-09-identity-transformer-stream,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +d6c6416f0ff7a1c8064bd5beed24d6efd1eca450,4e2f4cf7ecf3b42c938d0e8e97a616c82f019ab2,fix identity transform stream resolve/state change order,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/identity/AGENTS.md;src/tests/streams/identity/cancel-propagation.js;src/tests/streams/identity/main.js;src/workerd/api/streams/identity-transform-stream.c++;src/workerd/api/streams/internal-test.c++ +1e91b8264cd93a41b3cc694d8c24090f9a9aa6a5,4e2f4cf7ecf3b42c938d0e8e97a616c82f019ab2,[nfc] Make skill reference links portable,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.opencode/skills/kj-style/SKILL.md;.opencode/skills/rust-review/SKILL.md;.opencode/skills/ts-style/SKILL.md;.opencode/skills/update-v8/SKILL.md;.opencode/skills/wd-test-format/SKILL.md;.opencode/skills/workerd-api-review/SKILL.md;.opencode/skills/workerd-safety-review/SKILL.md +4e2f4cf7ecf3b42c938d0e8e97a616c82f019ab2,94e65452649f6772fe5e79dc7cf6fa3d26f3decc 6d4fd6939ca917be160a10ef0e4c2d53bb9828f1,Merge pull request #7266 from cloudflare/apeacock/actor-call-retry-state,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +6d4fd6939ca917be160a10ef0e4c2d53bb9828f1,14dc9fcc825aae97b05527c7f0380b82c2751d08,Use shared retry state for actor fetches,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/BUILD.bazel;src/workerd/api/actor-call-retry-test.c++;src/workerd/api/actor-call-retry.c++;src/workerd/api/actor-call-retry.h;src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/actor.c++;src/workerd/api/actor.h;src/workerd/api/http.c++;src/workerd/api/http.h +14dc9fcc825aae97b05527c7f0380b82c2751d08,94e65452649f6772fe5e79dc7cf6fa3d26f3decc,Add shared actor call retry state,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/BUILD.bazel;src/workerd/api/actor-call-retry-test.c++;src/workerd/api/actor-call-retry.c++;src/workerd/api/actor-call-retry.h;src/workerd/io/BUILD.bazel;src/workerd/io/observer-test.c++;src/workerd/io/observer.c++;src/workerd/io/observer.h +9038845f2bb7b8d88fdd8abbca40433ea7fae91c,94e65452649f6772fe5e79dc7cf6fa3d26f3decc,Bump next from 16.2.12 to 16.3.3,Upstream OpenNext test dependency bump; unrelated to local dependency graph.,pnpm-lock.yaml;src/workerd/api/tests/opennextjs/src/package.json +94e65452649f6772fe5e79dc7cf6fa3d26f3decc,ffdd405ef41249721121cb45d742bb78650571d8 1735073ee5bd914c2d41d6250715a4f8b7c1e7ea,Merge pull request #7283 from cloudflare/gyeongjae/entropy-error-message,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +1735073ee5bd914c2d41d6250715a4f8b7c1e7ea,ffdd405ef41249721121cb45d742bb78650571d8,Improve error message when top-level randomness is used in Python workers,"Host Python interpreter/packages/tests: execution belongs to isolate channel, not local Worker Loader.",build/deps/pyodide.MODULE.bazel;build/python_metadata.bzl;src/pyodide/internal/topLevelEntropy/allow_entropy.py;src/pyodide/internal/topLevelEntropy/import_patch_manager.py;src/workerd/server/tests/python/BUILD.bazel;src/workerd/server/tests/python/random/worker.py;src/workerd/server/tests/python/top-level-entropy/top-level-entropy.wd-test;src/workerd/server/tests/python/top-level-entropy/worker.py +ffdd405ef41249721121cb45d742bb78650571d8,39270348f4a3c556a6ff599435073ab8606f93cf,Move actor-call detail IDs from jsg/util.h to jsg/exception.h,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/jsg/exception.h;src/workerd/jsg/util.h +39270348f4a3c556a6ff599435073ab8606f93cf,638d0eb9c835ded45f171f662ae8e82a575c3ab7,Drop the jsg/memory.h dependency from io/trace.h,Native observability/lifetime or tests: local public no-op tracing handled separately; no observer delivery backend.,src/workerd/api/trace.h;src/workerd/io/BUILD.bazel;src/workerd/io/trace.h +638d0eb9c835ded45f171f662ae8e82a575c3ab7,4e43e480e5c4066f5e0e297dff34eb0d17625e8f,Release 2026-09-10,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +4e43e480e5c4066f5e0e297dff34eb0d17625e8f,bbdc3f580d6a8547dc2052c8e51ec437c83f46a5 52d111cbea64dc72d95cb0ca590ad0b42691e2b0,Merge pull request #7183 from cloudflare/jasnell/streams-ts-defects,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +52d111cbea64dc72d95cb0ca590ad0b42691e2b0,91e727daa3ca836867c57c091b5e19fdbcad1f81,Describe stream contracts in comments instead of recording decision dates,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/native.ts;src/tests/streams/identity/AGENTS.md;src/tests/streams/identity/chunk-types.js;src/tests/streams/r2-patterns/AGENTS.md;src/tests/streams/r2-patterns/r2-consumption.js;src/tests/streams/readable-byte/read-min.js;src/tests/streams/writable/write-semantics.js +91e727daa3ca836867c57c091b5e19fdbcad1f81,c89e39586c851913bff8f24edbd1c73fad0acf2f,Correct the spec reading for close() below a read minimum,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/read-min.js +c89e39586c851913bff8f24edbd1c73fad0acf2f,c012bcdcf5f93a417ec2609c8fa17849ccb1725f,Factor the in-flight write completion bookkeeping into a helper,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/writable.ts +c012bcdcf5f93a417ec2609c8fa17849ccb1725f,0c50c757204594dc904763a69eac42bb7ce94063,Make CompressionStream reject shared memory and error both sides on invalid chunks,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/compression.ts;src/per_isolate/webstreams/writable.ts;src/tests/streams/compression/AGENTS.md;src/tests/streams/compression/chunk-types.js;src/tests/streams/compression/main.js;src/tests/streams/piping/AGENTS.md;src/tests/streams/piping/special-buffers.js;src/wpt/compression-test-ts.ts +0c50c757204594dc904763a69eac42bb7ce94063,b15e8b6615e6f5954c5302b190ebae10369fa3fe,Transfer the BYOB buffer at end-of-data settlement instead of copying it,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/queue.ts;src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/controller.js;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/respond.js +bbdc3f580d6a8547dc2052c8e51ec437c83f46a5,a42a33b0d43d80b9554d3f9d7f04c153d6b0c45f f46d7a611b5e924b99d17ee539c53914f3827fa5,Merge pull request #7294 from cloudflare/maizatskyi/2026-09-04-rust-tsan,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +f46d7a611b5e924b99d17ee539c53914f3827fa5,a42a33b0d43d80b9554d3f9d7f04c153d6b0c45f,[tsan] run all tests under tsan,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/test.yml;build/kj_test.bzl;build/linking.bzl;build/wd_cc_benchmark.bzl;build/wd_rust_crate.bzl;src/rust/cxx/kj-rs/BUILD.bazel;src/rust/cxx/kj-rs/tests/BUILD.bazel;src/rust/gen-compile-cache/BUILD.bazel;src/rust/kj/BUILD.bazel +a42a33b0d43d80b9554d3f9d7f04c153d6b0c45f,59596a0f6b6aa213d5525d755966af853c87ff56 6c49d6fb40c2a422ab1d530719070139ff2dd90e,Merge pull request #7280 from cloudflare/maizatskyi/2026-09-04-rust-tsan,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +6c49d6fb40c2a422ab1d530719070139ff2dd90e,59596a0f6b6aa213d5525d755966af853c87ff56,[tsan] fix rust std/tsan compatibility,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.bazelrc;.github/workflows/test.yml;build/BUILD.libunwind;build/BUILD.llvm-runtimes;build/ci.bazelrc;build/deps/build_deps.jsonc;build/deps/gen/build_deps.MODULE.bazel;build/kj_test.bzl;build/rust/build_std.bzl;build/rust/build_std.sh;build/wd_rust_test.bzl;patches/rust/0001-teach-tsan-about-fcntl-file-descriptor-duplication.patch;patches/rust/BUILD.bazel;src/rust/tsan/BUILD.bazel;src/rust/tsan/clone_fd.rs;src/rust/tsan/tokio_test.rs +59596a0f6b6aa213d5525d755966af853c87ff56,c14fef28a43e365ebffdf02751ff66f8c4c56c73 45f682d5bae7cd6b0298b5db38e2c221f11b1544,Merge pull request #7289 from cloudflare/maizatskyi/2026-09-09-wd_rules,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +b15e8b6615e6f5954c5302b190ebae10369fa3fe,597f2169ac20e1cf1ae50ddf628bab4d07c2e876,Correctly handle delayed respond(0) in byob reads,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/native.ts;src/per_isolate/webstreams/queue.ts;src/tests/streams/r2-patterns/AGENTS.md;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/controller.js;src/tests/streams/readable-byte/main.js;src/tests/streams/readable-byte/read-min.js;src/tests/streams/readable-byte/respond.js +c14fef28a43e365ebffdf02751ff66f8c4c56c73,58cacf10055c7b056238c3252e11ee52dc7d613b d8b5cacc599c7323baef800ad3f0506c8ee0e916,Merge pull request #7287 from cloudflare/pkhanna/fix-error-logging,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +597f2169ac20e1cf1ae50ddf628bab4d07c2e876,0d682925e80bc77db16c866c727d66678149dfae,Piping suite: pin the settled post-pipe lock state deterministically,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/piping/AGENTS.md;src/tests/streams/piping/pipe-matrix.js +0d682925e80bc77db16c866c727d66678149dfae,aa3f1901fde674611c26593165ad0d8422aea971,Honor the TransformStream expectedLength extension in the TS implementation,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/transform.ts;src/tests/streams/transform/AGENTS.md;src/tests/streams/transform/roundtrip.js +aa3f1901fde674611c26593165ad0d8422aea971,cea6007faa3e76924af27815d17ba08ded2f4712,Reject invalid transform chunks per-write; accept SAB compression chunks,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/compression.ts;src/per_isolate/webstreams/identity.ts;src/per_isolate/webstreams/readable.ts;src/per_isolate/webstreams/writable.ts;src/tests/streams/compression/AGENTS.md;src/tests/streams/compression/chunk-types.js;src/tests/streams/compression/main.js;src/tests/streams/identity/AGENTS.md;src/tests/streams/identity/buffer-lifecycle.js;src/tests/streams/identity/chunk-types.js;src/tests/streams/piping/AGENTS.md;src/tests/streams/piping/pipe-matrix.js;src/tests/streams/piping/special-buffers.js;src/wpt/compression-test-ts.ts +cea6007faa3e76924af27815d17ba08ded2f4712,7c697050622ffc9d80a3f223bbd8a25c84343bf2,Piping suite: correct the closed-source-to-closed-dest pin's spec reading,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/piping/AGENTS.md;src/tests/streams/piping/interop.js +7c697050622ffc9d80a3f223bbd8a25c84343bf2,5480110bd4c4c4af978047e634793e7e6edb4990,Readable-byte suite: correct the relock respond-overflow pin's spec reading,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/release-relock.js +5480110bd4c4c4af978047e634793e7e6edb4990,518caabc2e38d4db6505b2e7889e04d2b33b0346,Writable suite: reclassify the queued-write-at-release pin as a C++ deviation,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/writable/AGENTS.md;src/tests/streams/writable/write-semantics.js +518caabc2e38d4db6505b2e7889e04d2b33b0346,6b1f619fb83cce42a3d8f05d3aeaa1d43f9ab1a0,Synthesize the auto-allocate byobRequest for draining-reader wait-reads,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/readable.ts;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/draining-reader.js;src/tests/streams/readable-byte/respond.js +6b1f619fb83cce42a3d8f05d3aeaa1d43f9ab1a0,382de7a76182ad199373ab2cac90f428110e6a42,Settle parked BYOB reads at end-of-data with the C++-parity tail shape,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/per_isolate/webstreams/AGENTS.md;src/per_isolate/webstreams/native.ts;src/per_isolate/webstreams/queue.ts;src/tests/streams/r2-patterns/AGENTS.md;src/tests/streams/r2-patterns/r2-consumption.js;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/controller.js;src/tests/streams/readable-byte/data-volumes.js;src/tests/streams/readable-byte/read-min.js;src/workerd/api/js-readable-stream.c++;src/workerd/api/tests/ts-webstreams-test.js +382de7a76182ad199373ab2cac90f428110e6a42,58cacf10055c7b056238c3252e11ee52dc7d613b,R2-patterns suite: correct tee sources to the supported null-tolerant pattern,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/r2-patterns/AGENTS.md;src/tests/streams/r2-patterns/r2-consumption.js +45f682d5bae7cd6b0298b5db38e2c221f11b1544,58cacf10055c7b056238c3252e11ee52dc7d613b,cleanup: migrating cxx to wd_ rules,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/BUILD.bazel;src/rust/cxx/kj-rs/BUILD.bazel;src/rust/cxx/kj-rs/tests/BUILD.bazel +58cacf10055c7b056238c3252e11ee52dc7d613b,360a40dc3489497bcb23ccd17a3b312b8c1a900a 86693054751463df0cc8c4a0d1177a89d37581d6,Merge pull request #7284 from cloudflare/grpc-for-all,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +360a40dc3489497bcb23ccd17a3b312b8c1a900a,21ee4d018f48a2a01fc34cbd0f82f92804144787 3e8e74b7db62067e4989245f918110a0b4bec461,Merge pull request #7274 from cloudflare/harris/EW-10964-snapshot-global-scope,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +21ee4d018f48a2a01fc34cbd0f82f92804144787,5978b262b1037eb041067326618eb8186d657773 02552e4e92e1118d1cb7a068200ece344aa862b3,Merge pull request #7182 from cloudflare/jasnell/streams-test-consolidation-11,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +86693054751463df0cc8c4a0d1177a89d37581d6,5978b262b1037eb041067326618eb8186d657773,Remove experimental tag from auto_grpc_convert,Separate host feature: auto_grpc_convert flag loses experimental requirement; no local gRPC proxy.,src/workerd/io/compatibility-date.capnp +d8b5cacc599c7323baef800ad3f0506c8ee0e916,7a46b190e3f40d087c6358d9e24e783ba442587c,fix(web-socket): only log internal errors in abort task,Native WebSocket abort logging: only internal exceptions; public frame/close behavior unchanged.,src/workerd/api/web-socket.c++ +5978b262b1037eb041067326618eb8186d657773,2d632fe76c03e2a98a4556d8d8ac4c11cc9e9cf6 cb79223493e49e10226f7f8320922fd4b10736dc,Merge pull request #7285 from cloudflare/ketan/upstream-patches,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +cb79223493e49e10226f7f8320922fd4b10736dc,d9e597e347f0c835a23241de9600e0655c00ce4d,fix(kj-rs): cancel cross-thread promise in ArcWakerPromiseNode::destroy,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/rust/cxx/kj-rs/tests/awaitables-cc-test.c++;src/rust/cxx/kj-rs/tests/lib.rs;src/rust/cxx/kj-rs/tests/test_futures.rs;src/rust/cxx/kj-rs/waker.c++ +d9e597e347f0c835a23241de9600e0655c00ce4d,ea2f6d1fae8deba6bc9d536d9ae0c78316515977,VULN-142648: Remove handled rejection before callback,Security screened: native V8 rejection-handler reentry lifetime; no local warnedRejections table or V8 hook.,src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/unhandled-rejection-reentry-test.js;src/workerd/api/tests/unhandled-rejection-reentry-test.wd-test;src/workerd/jsg/promise.c++ +ea2f6d1fae8deba6bc9d536d9ae0c78316515977,66b794d363157eaebd4e81392b8dd817abc57ba3,VULN-144193: Reject encrypted DER private key exports,Security screened: workerd Node crypto DER encryption validation; local crypto implementation belongs to host.,src/node/internal/crypto_keys.ts;src/workerd/api/node/tests/BUILD.bazel;src/workerd/api/node/tests/crypto_private-key-der-encryption-test.js;src/workerd/api/node/tests/crypto_private-key-der-encryption-test.wd-test +66b794d363157eaebd4e81392b8dd817abc57ba3,2d632fe76c03e2a98a4556d8d8ac4c11cc9e9cf6,VULN-146189: Bind AsyncResource frames to request context,Security screened: AsyncResource creation-context validation; local browser AsyncResource already throws unsupported.,src/workerd/api/node/async-hooks.c++;src/workerd/api/node/async-hooks.h;src/workerd/api/node/tests/BUILD.bazel;src/workerd/api/node/tests/async-resource-request-context-test.js;src/workerd/api/node/tests/async-resource-request-context-test.wd-test +2d632fe76c03e2a98a4556d8d8ac4c11cc9e9cf6,7ddb3a267e7a795ac7ebb9723176f89c9ebf2a59,Update capnp-cpp to v2 head (851c45b),"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/gen/deps.MODULE.bazel +7ddb3a267e7a795ac7ebb9723176f89c9ebf2a59,9ff67695471e5dee7a60d19e030c0e56bf9576f0 c240f0e7b8d231ea54cca117d426559dfb34b370,Merge pull request #7246 from cloudflare/jolio/move-sqlite-cftsdt,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +9ff67695471e5dee7a60d19e030c0e56bf9576f0,590f9f99475ef34fb4902a36d868e261709f7366,Release 2026-09-09,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +590f9f99475ef34fb4902a36d868e261709f7366,f051f110f8195e0ed475b8838356b8df8109a4a0 89851b51716106516f982e9044f064d1459142b4,Merge pull request #7262 from cloudflare/apeacock/outgoing-actor-retry-telemetry,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +89851b51716106516f982e9044f064d1459142b4,595b88d43ed15248123922fc6d2ac17d0bce2471,Distinguish canceled actor fetch retries,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/http.c++;src/workerd/io/observer.h +595b88d43ed15248123922fc6d2ac17d0bce2471,f051f110f8195e0ed475b8838356b8df8109a4a0,Report actor fetch retry outcomes and latency,"Distributed actor retries: replay eligibility, claims, deduplication, budgets, observers or backoff require absent service protocol.",src/workerd/api/actor-fetch-retry-test.c++;src/workerd/api/http.c++;src/workerd/io/observer.h +f051f110f8195e0ed475b8838356b8df8109a4a0,223f09e3fbcb129d2129754e2861ecd0e4cba000 8b12a37f4bc564ce4f266817aaa7b21d3921c7f4,Merge pull request #7253 from cloudflare/maizatskyi/2026-09-04-tsan-libcxx,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +223f09e3fbcb129d2129754e2861ecd0e4cba000,cee5aefa1f5604ca4d19d5e8e2e92e102ac1e767,[build] Fix clang-tidy 23 violations,Native build/tooling/refactor or KJ ownership primitive: no additional local public behavior.,src/workerd/io/legacy-hibernation-manager.c++;src/workerd/io/worker.c++ +cee5aefa1f5604ca4d19d5e8e2e92e102ac1e767,8bfef8f421b2727c444e9c45d70179c6fa05410e,[build] Fix clang 23 warnings,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/api/pyodide/pyodide-test.c++;src/workerd/api/rtti.c++;src/workerd/io/worker-modules.h;src/workerd/jsg/iterator.h;src/workerd/jsg/jsg.h;src/workerd/jsg/modules.h;src/workerd/tests/test-fixture.c++ +02552e4e92e1118d1cb7a068200ece344aa862b3,5fdfa647297fd02bbd7224739a6d1af21dfd8d21,Address more streams test review comments,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/AGENTS.md;src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/byob-reader.js;src/tests/streams/readable-byte/controller.js;src/tests/streams/readable/AGENTS.md;src/tests/streams/transform/AGENTS.md;src/tests/streams/writable/AGENTS.md;src/tests/streams/writable/abort-matrix.js;src/tests/streams/writable/abort-semantics.js;src/tests/streams/writable/main.js +5fdfa647297fd02bbd7224739a6d1af21dfd8d21,d0a82d036dad85dbbed61ae9779f166115060afe,Address review comments in stream tests,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/piping/error-propagation.js;src/tests/streams/writable/abort-semantics.js +d0a82d036dad85dbbed61ae9779f166115060afe,e00de4376450d8ceb5dc889a482577f4d186d675,Readable-byte suite: per-test map of the WPT general.any.js failures,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable-byte/byob-reader.js;src/tests/streams/readable-byte/controller.js;src/tests/streams/readable-byte/main.js +e00de4376450d8ceb5dc889a482577f4d186d675,85bf30b28755cbc1f04cd06e4600cccc5e158db1,Piping and writable suites: WPT abort-state and settlement-order residue,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/piping/error-propagation.js;src/tests/streams/piping/main.js;src/tests/streams/writable/abort-semantics.js;src/tests/streams/writable/main.js +85bf30b28755cbc1f04cd06e4600cccc5e158db1,8bfef8f421b2727c444e9c45d70179c6fa05410e,Streams suites: note the IDL-shape enforcement boundary (WPT idlharness owns it),Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/readable-byte/AGENTS.md;src/tests/streams/readable/AGENTS.md;src/tests/streams/transform/AGENTS.md;src/tests/streams/writable/AGENTS.md +8bfef8f421b2727c444e9c45d70179c6fa05410e,e6cdecfd9923b6ae4e9dc0af7e8962017bc7206b 620e9071471d4a7bb6adfd820005936ddd6ca09f,Merge pull request #7181 from cloudflare/jasnell/streams-test-consolidation-10,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +e6cdecfd9923b6ae4e9dc0af7e8962017bc7206b,8b5ea4a1a2d14f16e33d5e2c0d572c84d87bcb3f b4ee17837951212b5601be6f9f7944a93c05b4d3,Merge pull request #7212 from cloudflare/felix/090126-fix-stw-report,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +8b5ea4a1a2d14f16e33d5e2c0d572c84d87bcb3f,59ce3fa9cea761af11b28e71e702a4571deab631,Regenerate Workers types snapshots,Ambient/service type contract or tests: supplied by updated Workers types; no matching local service implementation.,types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts +59ce3fa9cea761af11b28e71e702a4571deab631,d3c7030661a22249ab1178039c4b65ea3f01233b,Add Workers cf.originRangeRequests types,Ambient/service type contract or tests: supplied by updated Workers types; no matching local service implementation.,src/workerd/api/tests/cf-cache-control-test.js;types/defines/cf.d.ts;types/test/types/cf.ts +b4ee17837951212b5601be6f9f7944a93c05b4d3,d3c7030661a22249ab1178039c4b65ea3f01233b,[o11y] Make BaseTracer::markUnused() virtual,Native observability/lifetime or tests: local public no-op tracing handled separately; no observer delivery backend.,src/workerd/io/tracer.c++;src/workerd/io/tracer.h +8b12a37f4bc564ce4f266817aaa7b21d3921c7f4,6637171a4dd18a15f25f2f5ee74c5709f092efd7,[tsan] build libc++,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.bazelrc;.github/workflows/test.yml;build/BUILD.libunwind;build/BUILD.llvm-runtimes;build/deps/BUILD;build/deps/build_deps.jsonc;build/deps/deps.schema.json;build/deps/gen/build_deps.MODULE.bazel;build/deps/update-deps.py;build/kj_test.bzl;build/platforms/BUILD.bazel;build/rust/BUILD.bazel;build/rust/build_std.sh;build/wd_cc_binary.bzl;build/wd_rust_crate.bzl;build/wd_rust_test.bzl;src/rust/cxx/kj-rs/tests/BUILD.bazel;src/rust/cxx/tests/BUILD.bazel;src/rust/tsan-test/BUILD.bazel;src/rust/tsan-test/verify.sh;src/rust/tsan/BUILD.bazel;src/rust/tsan/race.rs;src/workerd/tests/tsan/BUILD.bazel;src/workerd/tests/tsan/libcxx-tsan-test.c++ +620e9071471d4a7bb6adfd820005936ddd6ca09f,d3c7030661a22249ab1178039c4b65ea3f01233b,Piping suite: absorb special-buffer pipe writes,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/AGENTS.md;src/tests/streams/piping/AGENTS.md;src/tests/streams/piping/main.js;src/tests/streams/piping/piping-modules.capnp;src/tests/streams/piping/special-buffers.js;src/workerd/api/tests/BUILD.bazel;src/workerd/api/tests/pipe-write-special-buffer-test.js;src/workerd/api/tests/pipe-write-special-buffer-test.wd-test +d3c7030661a22249ab1178039c4b65ea3f01233b,6637171a4dd18a15f25f2f5ee74c5709f092efd7 31c33a2b560266cb1c4bf8533b6802d54f842b7e,Merge pull request #7180 from cloudflare/jasnell/streams-test-consolidation-9,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +31c33a2b560266cb1c4bf8533b6802d54f842b7e,c4ca7e95067f6399258bd99fc48feba1d94432f1,Exercise cancelation of a live read in socket tests,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/sockets/AGENTS.md;src/tests/streams/sockets/socket-streams.js +c4ca7e95067f6399258bd99fc48feba1d94432f1,6637171a4dd18a15f25f2f5ee74c5709f092efd7,Add sockets streams suite,Host streams/compression implementation or tests: native WHATWG streams/Capn Web supply local substrate; no KJ pump port.,src/tests/streams/AGENTS.md;src/tests/streams/sockets/AGENTS.md;src/tests/streams/sockets/BUILD.bazel;src/tests/streams/sockets/echo-server.js;src/tests/streams/sockets/main.js;src/tests/streams/sockets/socket-streams.js;src/tests/streams/sockets/sockets-cpp.wd-test;src/tests/streams/sockets/sockets-modules.capnp;src/tests/streams/sockets/sockets-ts.wd-test;src/tests/streams/sockets/which-impl.js +3e8e74b7db62067e4989245f918110a0b4bec461,c3f70be36f3e43bddb9961579e2ff0e8d4e0048a,EW-10965 Document compatibility requirements for API enablement,"Build, dependency, release tooling or documentation: no local runtime behavior port.",AGENTS.md +c3f70be36f3e43bddb9961579e2ff0e8d4e0048a,6637171a4dd18a15f25f2f5ee74c5709f092efd7,EW-10964 Export the compatibility schema for snapshot generation,"Build, dependency, release tooling or documentation: no local runtime behavior port.",src/workerd/io/BUILD.bazel +6637171a4dd18a15f25f2f5ee74c5709f092efd7,414bfe5b98e97e3f4ba07ff779e858a7902b7a53 cd17a53c952aaa11bb310c3a78d9f2757fa0e48e,bazelrc: try-import .local/bazelrc,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +414bfe5b98e97e3f4ba07ff779e858a7902b7a53,3c46d5fa8e93ab6e6cef86ce017b882f636d9d89 e1b4d5ceb0c4e83958f2b282398f606c38a11cf6,Merge pull request #7278 from cloudflare/ketan/fix-html-fiber,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +e1b4d5ceb0c4e83958f2b282398f606c38a11cf6,38a710968c726427e51f76ee7bcf57ca707913db,Increase HTMLRewriter fiber stack size under ASan,Native HTMLRewriter fiber stack under ASan; no local HTMLRewriter engine.,src/workerd/api/html-rewriter.c++ +3c46d5fa8e93ab6e6cef86ce017b882f636d9d89,5a941fcc17e762cd94255ce9261036e57e3b52bd,update dependencies to latest version,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/bigbonk.yml;.github/workflows/bonk.yml;.github/workflows/new-pr-review.yml;build/deps/gen/build_deps.MODULE.bazel;build/deps/gen/deps.MODULE.bazel;deps/rust/Cargo.lock +5a941fcc17e762cd94255ce9261036e57e3b52bd,bf0d2ff6d78fef5ddd093572e0238f677e96a0d6 09b42d566b616976cffe6f587ef866acd79f2930,Merge pull request #7189 from cloudflare/mar/v8/15.3,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +09b42d566b616976cffe6f587ef866acd79f2930,a3368dfe726dbdf779d62d48c7d6468a0ce0a09d,[build] Update to V8 15.3.76.11,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/v8.MODULE.bazel +a3368dfe726dbdf779d62d48c7d6468a0ce0a09d,d6c577944e49d1fc7aad5a59538efc0e6a95aeba,Make EventSource GC test use precise collection,Native EventSource GC test; local host owns EventSource/GC.,src/workerd/api/tests/eventsource-gc-test.js +d6c577944e49d1fc7aad5a59538efc0e6a95aeba,9027667b084c0bd2b310e09fb7dbd3cf9b18145b,[build] Disable preserve_most on affected Windows Clang,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/v8.MODULE.bazel;patches/v8/0041-Disable-preserve-most-on-Windows-x64-before-Clang-22.patch +9027667b084c0bd2b310e09fb7dbd3cf9b18145b,bf0d2ff6d78fef5ddd093572e0238f677e96a0d6,[build] Update to V8 15.3.76.7,"Build, dependency, release tooling or documentation: no local runtime behavior port.",build/deps/deps.jsonc;build/deps/gen/deps.MODULE.bazel;build/deps/v8.MODULE.bazel;build/perfetto/perfetto_cfg.bzl;patches/perfetto/0001-Don-t-attempt-to-use-rules_android.patch;patches/perfetto/0002-disable-info-level-logging-re2.patch;patches/v8/0001-Allow-manually-setting-ValueDeserializer-format-vers.patch;patches/v8/0002-Allow-manually-setting-ValueSerializer-format-versio.patch;patches/v8/0003-Allow-Windows-builds-under-Bazel.patch;patches/v8/0005-Speed-up-V8-bazel-build-by-always-using-target-cfg.patch;patches/v8/0006-Implement-Promise-Context-Tagging.patch;patches/v8/0007-Randomize-the-initial-ExecutionContextId-used-by-the.patch;patches/v8/0008-increase-visibility-of-virtual-method.patch;patches/v8/0009-Add-ValueSerializer-SetTreatFunctionsAsHostObjects.patch;patches/v8/0010-Modify-where-to-look-for-fp16-dependency.-This-depen.patch;patches/v8/0011-Revert-heap-Add-masm-specific-unwinding-annotations-.patch;patches/v8/0012-Update-illegal-invocation-error-message-in-v8.patch;patches/v8/0013-Implement-cross-request-context-promise-resolve-hand.patch;patches/v8/0014-Add-another-slot-in-the-isolate-for-embedder.patch;patches/v8/0015-Add-ValueSerializer-SetTreatProxiesAsHostObjects.patch;patches/v8/0017-Enable-V8-shared-linkage.patch;patches/v8/0018-Modify-where-to-look-for-fast_float-and-simdutf.patch;patches/v8/0019-Remove-unneded-latomic-linker-flag.patch;patches/v8/0020-Add-methods-to-get-heap-and-external-memory-sizes-di.patch;patches/v8/0021-Port-concurrent-mksnapshot-support.patch;patches/v8/0022-Port-V8_USE_ZLIB-support.patch;patches/v8/0023-Modify-where-to-look-for-dragonbox.patch;patches/v8/0024-Disable-slow-handle-check.patch;patches/v8/0026-Implement-additional-Exception-construction-methods.patch;patches/v8/0028-bind-icu-to-googlesource.patch;patches/v8/0029-Add-v8-String-IsFlat-API.patch;patches/v8/0030-Expose-AdjustAmountOfExternalAllocatedMemoryImpl-as-.patch;patches/v8/0031-Add-verify_write_barriers-flag-in-V8-s-bazel-config.patch;patches/v8/0032-Change-lamba-signature-to-get-around-windows-build-f.patch;patches/v8/0033-Return-false-on-Object.hasOwnProperty-with-intercept.patch;patches/v8/0035-Remove-libcxx-dep-from-defs.bzl-not-resolvable-via-h.patch;patches/v8/0036-Fix-ExtendedMap-layout-on-Windows.patch;patches/v8/0037-Fix-CFunction-MemorySpan-declarations-on-Windows.patch;patches/v8/0038-Properly-depend-on-llvm-libc.patch;patches/v8/0039-Fix-TSan-build-without-the-V8-sandbox.patch;patches/v8/0040-Enable-Perfetto-support-in-the-V8-Bazel-build.patch +1fc2f393e9c6f92114ff665453fbca57439cc199,bf0d2ff6d78fef5ddd093572e0238f677e96a0d6,Add workflow event subscriptions public type definitions,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,src/cloudflare/internal/workflows.d.ts;types/defines/workflows.d.ts;types/generated-snapshot/experimental/index.d.ts;types/generated-snapshot/experimental/index.ts;types/generated-snapshot/index.d.ts;types/generated-snapshot/index.ts;types/test/types/rpc.ts +bf0d2ff6d78fef5ddd093572e0238f677e96a0d6,37d70e441156306dd20590f439ffa2560b0d1b18 38a710968c726427e51f76ee7bcf57ca707913db,Merge pull request #7137 from cloudflare/apeacock/fix-request-teardown-order,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +38a710968c726427e51f76ee7bcf57ca707913db,6cd3cd4f6c391d4980d66912a6756183f64f64d9,Gate final request cleanup on JSRPC tracing,"Stateless request teardown rollout gate; endpoint gate later removed by d099c3f21, shared actors remain excluded.",src/workerd/io/BUILD.bazel;src/workerd/io/incoming-request-test.c++;src/workerd/io/io-context.c++ +6cd3cd4f6c391d4980d66912a6756183f64f64d9,37d70e441156306dd20590f439ffa2560b0d1b18,Cancel final context work before request outcome,Stateless request teardown/tracing: cancels final work only for non-shared contexts; DO shared context behavior retained.,src/workerd/io/incoming-request-test.c++;src/workerd/io/io-context.c++;src/workerd/io/io-context.h +37d70e441156306dd20590f439ffa2560b0d1b18,bab9c1a274b21c431a5291a8103548b88bd90c2d,Release 2026-09-08,Release metadata: oracle/types pinned at final release; compatibility date not advanced.,src/workerd/io/maximum-compatibility-date.txt;src/workerd/io/release-version.txt +bab9c1a274b21c431a5291a8103548b88bd90c2d,e8a5fc72849cbb80e33ce002ab7ef8423903a40c 316022051a82025f4bbc813f8322acb34b7ff0d2,Merge pull request #7249 from cloudflare/felix/081226-api-shrink-p1,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +316022051a82025f4bbc813f8322acb34b7ff0d2,757ad3bcd73228f1c4df26633503578f4570c458,[build] JSG: store struct field wrappers in a flat array,"Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/jsg/struct.h +757ad3bcd73228f1c4df26633503578f4570c458,7726c8e9bdeb8a5c4cbe8f9ef321ac0ec77ad762,"[build] JSG: key struct field wrappers on the field type, not on the field","Native JSG/V8/Rust/KJ implementation, build or tests: ownership, GC and event-loop substrate is host-owned.",src/workerd/jsg/jsg.h;src/workerd/jsg/struct.h;src/workerd/jsg/type-wrapper.h +e8a5fc72849cbb80e33ce002ab7ef8423903a40c,beb7bd5c370d898e5ea81947aaa80ba5f48cd47e 271d97b1558ba8f0c7f22a13019d40e7140e96cf,Merge pull request #7243 from cloudflare/ketan/fix-internal-build-fork,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +271d97b1558ba8f0c7f22a13019d40e7140e96cf,34c9b79d0f0d7460e2f03737760f4cc8c19ec443,Run internal_build.py from trusted base checkout,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/internal-build.yml +cd17a53c952aaa11bb310c3a78d9f2757fa0e48e,5967200b706162a6747b4a44e4cc97d949a75a63 fb814ad10ea778820b5e24b82f21edfb8c0f6556,Merge branch 'main' into mikea-patch-5,Merge topology: component commits are indexed separately; final endpoint diff reviewed., +5967200b706162a6747b4a44e4cc97d949a75a63,dc27e996c4ab8e8849cc6229ae816b3d426f08ef,bazelrc: try-import .local/bazelrc,"Build, dependency, release tooling or documentation: no local runtime behavior port.",.bazelrc +c240f0e7b8d231ea54cca117d426559dfb34b370,6f5cf2e7f47633360cea259b997d0475b4cd93b5,Move Existing SQLite Sentry routing to exception details,Native observability: SQLite Sentry detail routing; no local Sentry sink.,src/workerd/io/BUILD.bazel;src/workerd/io/actor-sqlite-test.c++;src/workerd/util/BUILD.bazel;src/workerd/util/sqlite-test.c++;src/workerd/util/sqlite.c++ +34c9b79d0f0d7460e2f03737760f4cc8c19ec443,d3a915bd26157192933f243cc2e079ab4adb3243,Fix internal build for forks of org members,Separate Workflows service/types: no local engine; ambient contract comes from updated Workers types.,.github/workflows/internal-build.yml diff --git a/docs/workerd-sync.md b/docs/workerd-sync.md index e7af0de..7468b8a 100644 --- a/docs/workerd-sync.md +++ b/docs/workerd-sync.md @@ -1,11 +1,95 @@ -# workerd sync: September 7, 2026 +# workerd sync: October 2, 2026 + +The oracle is now pinned to `v1.20261002.1` +([`51a48a5bb786`](https://github.com/cloudflare/workerd/tree/51a48a5bb7863fbeab791358bee8dff22c3ce83f)), +with Workers types `5.20261002.1`. The September audit below records the prior +behavioral baseline; the October audit covers the previously unaudited +[`v1.20260907.1...v1.20261002.1`](https://github.com/cloudflare/workerd/compare/v1.20260907.1...v1.20261002.1) +range. + +## October audit + +The [official release](https://github.com/cloudflare/workerd/releases/tag/v1.20261002.1) +and [npm latest metadata](https://registry.npmjs.org/workerd/latest) agreed on +`1.20261002.1`, commit `51a48a5bb7863fbeab791358bee8dff22c3ce83f`, when checked +on October 2. The source audit starts at September 7, rather than the September +11 oracle pin, to include the four days that had only been conformance-tested. +The range contains **688 commits: 537 non-merge commits and 151 merges**. The +endpoint diff changes 1,013 files, with 89,535 insertions and 16,719 deletions. + +The [commit ledger](workerd-sync-2026-10-02.csv) records every SHA, its parents, +subject, changed paths, and disposition. History was fetched without a shallow +boundary; `git log --full-history` preserves merged changes. Every commit's +subject and changed paths were screened. Applicable source patches, callers, +and regression tests were inspected, then checked against endpoint diffs so +reverts and intermediate implementations do not become separate port work. +The ledger distinguishes this scope review from the behavioral ports below: +it does not claim that every line of a native engine or unrelated product was +translated or independently verified. + +### Behavioral ports + +| Upstream change | Local result and evidence | +| --- | --- | +| [SQLite row limit, `1b9b6ea02`](https://github.com/cloudflare/workerd/commit/1b9b6ea023367d92591c1b51658d89eca4b41a23) | The shared length constant is now `8 * 1024 * 1024 + 34`, including upstream's V8 serialization allowance. It feeds both the WASM native `sqlite3_limit` call and Node's bound/returned-value checks. The upstream large-key regression failed at 8,000,000 bytes before the port. The shared oracle probe accepts exactly 8 MiB + 34 and rejects the next byte in workerd, Node, and the browser. Node's existing inability to constrain aggregate rows or unreturned computed values remains a host limitation. | +| [Sticky gate notifications, `275f7b2a4`](https://github.com/cloudflare/workerd/commit/275f7b2a47e95109c9d51a2b8ee6fc5ef7ff4782) | `OutputGate.onBroken()` permits multiple observers. Existing observers receive the first failure; observers registered after another failure receive the latest exception. The second-observer upstream regression failed before the port. The obsolete SQLite-test harness workaround for the one-observer restriction was removed. InputGate already supported multiple observers and retained the latest exception; no new gate abstraction was needed. | +| [Tracing span updates, `1f6faa79b`](https://github.com/cloudflare/workerd/commit/1f6faa79bc3dfc266c3bc1d2f9149699e6c5f819) | The existing no-op tracing surface now has chainable `updateName()` and `setStatus()`. `setStatus()` validates `unset`, `ok`, and `error`, including on an ended span. The shared conformance row measures the same synchronous contract in all three runtimes. Native span-update delivery, observers, and asynchronous tracing propagation remain outside the local no-op contract. | + +These changes retain the existing compatibility dates. Updating the oracle and +ambient Workers types does not automatically opt local hosts into newer +compatibility-date policy. -**September 11 re-pin.** The oracle is now pinned to `v1.20260911.1` +### Reviewed host and protocol changes + +| Surface | Disposition | +| --- | --- | +| Actor storage, transactions, Sync-KV, alarms | Endpoint changes outside the length limit are span tags, native ownership, or diagnostics. [Weak transaction/context captures, `1c246981e`](https://github.com/cloudflare/workerd/commit/1c246981e264c05b623c692b1773baafc5d61b24), [owned actor/alarm keys, `7b1bf6ed6`](https://github.com/cloudflare/workerd/commit/7b1bf6ed627f4993fe8b1cce5d02e94a834df54b), and [Sync-KV prefix move, `1c21cdb55`](https://github.com/cloudflare/workerd/commit/1c21cdb558aa43fe37435e1a2d8bceadc9bce39a) repair borrowed C++ lifetimes; local immutable strings and GC-owned contexts already retain those values. [In-memory alarm cancellation, `5d450132f`](https://github.com/cloudflare/workerd/commit/5d450132f6e3b69616d8609d74f4e1fb784c23e1) avoids destroying a running KJ callback; JavaScript promises do not have that destruction behavior, and the local scheduler owns completion/replacement bookkeeping. | +| SQLite VFS and observers | [Open-time VFS exceptions, `7d9d512c9`](https://github.com/cloudflare/workerd/commit/7d9d512c96e5f150b576c570652c434013fd4a45), [internal database context, `757419a73`](https://github.com/cloudflare/workerd/commit/757419a73abd634d278b5c8db2a52a4d2bd1abe2), [prepare-failure query events, `42a71fe42`](https://github.com/cloudflare/workerd/commit/42a71fe42268ef9af0ce489a22e21eb1eb33f85f), and Sentry routing change workerd's native VFS/observer channel. Local driver-open failures already propagate; the port has neither that VFS exception tunnel nor a SqliteObserver/Sentry delivery backend. The previously documented function/default-expression authorizer gap remains unresolved. | +| Facets | [Facet access timestamp lifetime, `95edab081`](https://github.com/cloudflare/workerd/commit/95edab081eef9c3517ee499a701b80d6b70d1c1f) shares a root-owned allocation so a surviving native facet channel cannot dereference a destroyed parent. Local facets already use explicit owned contexts and a root-owned tree index. There is no native expiration timestamp or borrowed parent pointer to repair. Facet limits, clone/delete semantics, and storage ownership are unchanged in the endpoint diff. | +| Worker Loader | Its API source has no endpoint change. [Shared module source ownership, `a745140dc`](https://github.com/cloudflare/workerd/commit/a745140dc8543085dabdf13cbfd9c2e233556924) and promise-returning native synthetic-module callbacks change JSG compilation ownership; local WorkerSource retains JS strings, copied byte inputs, and compiled modules. Server loader linking now includes configured Workflow namespaces, whose service is not implemented here. | +| WebSockets and hibernation | The sole WebSocket implementation change [narrows abort-task logging, `d8b5cacc5`](https://github.com/cloudflare/workerd/commit/d8b5cacc599c7323baef800ad3f0506c8ee0e916). [Hibernatable socket count, `d07b3e558`](https://github.com/cloudflare/workerd/commit/d07b3e55822c3e0c3e605e058d3aa950cccfb00b) is native embedder introspection that avoids waking parked wrappers. Local registry/mirror entries already hold live references and have no native wakeup operation. No application-facing frame, close, attachment, tag, or auto-response semantic changed. | +| Wait-until and eviction | [Task lifetime handles, `718f53105`](https://github.com/cloudflare/workerd/commit/718f53105ec99d2f9f0c88b66316e6b611fa2a2f) add an optional host-supplied tracker attached until each task settles/cancels. Local `waitUntilTaskCount()`, `quiescence().pendingWaitUntil`, and `drainWaitUntil()` already expose task lifetime. There is no local timed idle-eviction service or bounded per-task protection policy to port. The final `durable_object_io_tasks_prevent_eviction` enable date is October 1: `1132cf4b1` temporarily moved it and `50226a61a` reverted that move. | +| Final request cleanup | [`6cd3cd4f6`](https://github.com/cloudflare/workerd/commit/6cd3cd4f6c391d4980d66912a6756183f64f64d9) cancels stateless final-context work before reporting the request outcome. `38a710968` gated it and `d099c3f21` removed the rollout gate; the endpoint still excludes shared actor contexts. Local actor `waitUntil` therefore retains its existing lifetime. | +| Distributed Durable Object fetch/RPC retries | The STOR-5489/STOR-5615 sequence adds owned replay plans, payload eligibility, retry-token claims, predecessor/committed-failure classification, replay-memory budgets, attempt observers, configurable counts/timeouts, property-read retries, cancellation, and output-gate coordination. Claim placement moves before construction in `f6cc0d14c`, then back after construction in [the final design, `354a44cfd`](https://github.com/cloudflare/workerd/commit/354a44cfdda95115b6931d30d7f493915826441b). Local calls have no claim/deduplication or replay protocol. Repeating them after an arbitrary error could duplicate side effects, so none of this sequence is approximated with generic retries. | +| `@retryable` | [`bc75cc988`](https://github.com/cloudflare/workerd/commit/bc75cc988c6c0945ace821db0b9267d3206dd479) adds a standard method decorator in the new `cloudflare:durable-objects` module; [`946ff26b0`](https://github.com/cloudflare/workerd/commit/946ff26b028f644960e8d2d7f8bc5f1c4e788654) carries its marker to the retry-token claim. That module has no local alias, so use already fails closed at resolution. No no-op decorator is exported and no retry support is claimed. | +| Native streams and RPC transport | The range changes BYOB ownership, tee/backpressure, transform settlement, compression chunks, stream adapter teardown, prototype-pollution protection, and [RPC stream cancellation, `d1cee9e1c`](https://github.com/cloudflare/workerd/commit/d1cee9e1cc2ccfef3e3d5807a39c3ddce616831f). The runtime uses host WHATWG streams and Cap'n Web rather than workerd's KJ pumps/Cap'n Proto stream membranes. [Pipe abort algorithms, `fdfeb0431`](https://github.com/cloudflare/workerd/commit/fdfeb04318a0ed9544e101c73f6b72f98cba9a81) reinforce the native stream implementation; the locally owned cancellation paths already use the private dependent signal in `onAbort`. Gated BYOB remains explicitly unsupported. | +| Separate services and native runtime | Workflow exports/createBatch/subscription types, Docker Containers, TCP/UDP/TLS/connect handlers, shared memory cache, R2, Workers AI, Browser Run, Analytics SQL, and artifact bindings require separate host services. New ambient declarations arrive through Workers types. Node compatibility, Python/Pyodide, JSG/V8/cppgc, Rust/KJ event-loop and CLI changes remain native host implementations. The full ledger records each commit, including tests, build changes, releases, and merges. | + +### Security review + +The security-labelled commits were inspected independently of their path +classification. [AsyncResource creation-context binding, `66b794d36`](https://github.com/cloudflare/workerd/commit/66b794d363157eaebd4e81392b8dd817abc57ba3) +changes `AsyncResource.bind()` and `runInAsyncScope()`; the browser shim already +rejects `new AsyncResource()` by name. Its documented Node-like +AsyncLocalStorage contract is unchanged. [Reentrant rejection-handler lifetime, +`d9e597e34`](https://github.com/cloudflare/workerd/commit/d9e597e347f0c835a23241de9600e0655c00ce4d) +fixes workerd's V8 warned-rejection table, absent locally. [Encrypted DER export, +`ea2f6d1fa`](https://github.com/cloudflare/workerd/commit/ea2f6d1fae8deba6bc9d536d9ae0c78316515977) +fixes workerd's Node crypto implementation, also absent locally. Native wrapper +identity checks and serializer pointer ownership were checked alongside these; +local JavaScript wrappers carry no cppgc pointers or V8 serializer externals. + +### Focused validation + +The changed gate regression failed before implementation and passed afterward; +217 gate, actor-SQLite, and Worker Loader unit tests passed together. The +8,000,000-byte SQLite regression failed before implementation and passed +afterward; 143 SQLite-KV, actor-SQLite, and WASM-backend tests passed together. +The SQL conformance file passed all 14 tests in each of workerd, Node, and the +browser, including the exact new length boundary. These unit selections overlap +and are not an aggregate count. Integrated runtime validation then passed: 1,021 unit tests; 82 workerd, +82 Node, and 95 browser conformance/smoke tests; and 82 tests in each transformed +Node/browser lane. Package and SDK validation are tracked separately from this +runtime audit. + +## September audit + +**September 11 re-pin.** The oracle was pinned to `v1.20260911.1` ([`925464ba9fe5`](https://github.com/cloudflare/workerd/tree/925464ba9fe5751e4468626ce77f7a5810df274f)), with Workers types `5.20260911.1` and `@sqlite.org/sqlite-wasm` `3.53.4-build1` (SQLite 3.53.4), since 0.8.2. Conformance was re-validated on those pins, but the [`v1.20260907.1...v1.20260911.1`](https://github.com/cloudflare/workerd/compare/v1.20260907.1...v1.20260911.1) -upstream range has not been audited the way this document audits the July range. +upstream range had not yet been source-audited. The October audit above now includes it. A direct probe on SQLite 3.53.4 reproduced the default-expression findings below, so the [engine work](#sqlite-engine-work-still-required) is unchanged. diff --git a/examples/extension/package.json b/examples/extension/package.json index 6839861..a96a6df 100644 --- a/examples/extension/package.json +++ b/examples/extension/package.json @@ -19,8 +19,9 @@ }, "devDependencies": { "@babel/plugin-proposal-decorators": "8.0.2", - "@cloudflare/workers-types": "5.20260911.1", + "@cloudflare/workers-types": "5.20261002.1", "chrome-types": "^0.1.447", + "node-stdlib-browser": "1.3.1", "vite": "^8.3.0" } } diff --git a/examples/extension/scripts/e2e.mjs b/examples/extension/scripts/e2e.mjs index a99a25d..bc27592 100644 --- a/examples/extension/scripts/e2e.mjs +++ b/examples/extension/scripts/e2e.mjs @@ -782,14 +782,15 @@ async function main() { ); check("recovery kept one user message", recoveredThinkStatus.userMessages, 1); check( - "recovery retained the partial and completed continuation", + "recovery reconciled the partial and continuation into one assistant message", recoveredThinkStatus.assistantMessages, - 2, + 1, ); check( - "the recovered continuation reached its final chunk", - recoveredThinkStatus.assistantText.includes("chunk12"), - true, + "recovery retained the exact durable prefix and complete continuation", + recoveredThinkStatus.assistantText, + recoveredThinkStatus.recoveryPartial + + Array.from({ length: 12 }, (_, index) => `chunk${index + 1} `).join(""), ); const finalStatus = await op(popup, "status"); diff --git a/examples/extension/vite.config.ts b/examples/extension/vite.config.ts index 2e5a96f..085f477 100644 --- a/examples/extension/vite.config.ts +++ b/examples/extension/vite.config.ts @@ -2,12 +2,17 @@ import { createRequire } from "node:module"; import { fileURLToPath } from "node:url"; import { browserHost, doRuntimeAwaitTransform } from "@mcp-b/do-runtime/vite"; import agents from "agents/vite"; +import nodeStdlib from "node-stdlib-browser"; import { defaultClientConditions, defineConfig } from "vite"; const packageRoot = fileURLToPath(new URL("../../", import.meta.url)); const resolvePackage = createRequire(import.meta.url).resolve; const cloudflareShellModule = `${packageRoot}vendor/agents/packages/shell/dist/index.js`; const unenvNode = (name: string): string => resolvePackage(`unenv/node/${name}`); +const browserGlobals = { + process: nodeStdlib.process, + Buffer: [nodeStdlib.buffer, "Buffer"] as [string, string], +}; const actorAwaitTransformInclude = [ "**/examples/extension/src/worker/**", @@ -34,6 +39,7 @@ const facetEntries = new Map([ ]); export default defineConfig(({ mode }) => ({ + define: { global: "globalThis", "process.env": "{}" }, plugins: [ ...agents(), ...browserHost({ @@ -63,6 +69,7 @@ export default defineConfig(({ mode }) => ({ minify: false, modulePreload: false, rollupOptions: { + transform: { inject: browserGlobals }, input: facetEntries.get(mode), // The actor worker imports the facet's class exports at runtime, so // they are the extension's host ABI rather than dead entry code. @@ -88,6 +95,7 @@ export default defineConfig(({ mode }) => ({ // Extensions load from disk. Preload hints buy nothing and add a chunk. modulePreload: false, rollupOptions: { + transform: { inject: browserGlobals }, // Relative to `root`, which is this directory. The two HTML entries sit at // the example root rather than under `src/`, so their built copies land at // `dist/offscreen.html` and `dist/popup.html` — the flat paths the manifest @@ -109,6 +117,7 @@ export default defineConfig(({ mode }) => ({ // await and module chunks need; they keep class names and run the transform. worker: { plugins: () => agents(), + rollupOptions: { transform: { inject: browserGlobals } }, }, resolve: { @@ -119,14 +128,18 @@ export default defineConfig(({ mode }) => ({ ...(mode === "think-probe" ? { "@cloudflare/shell": cloudflareShellModule, - crypto: unenvNode("crypto"), - "node:crypto": unenvNode("crypto"), - "node:events": unenvNode("events"), "node:stream/promises": unenvNode("stream/promises"), - "node:stream": unenvNode("stream"), "node:zlib": unenvNode("zlib"), } : {}), + // Sessions hashes persisted content synchronously. Reuse the same Node + // crypto implementation exercised by the SDK's browser suite. + ...Object.fromEntries( + (["crypto", "buffer", "stream", "events"] as const).flatMap((name) => [ + [name, nodeStdlib[name]], + [`node:${name}`, nodeStdlib[name]], + ]), + ), "node:diagnostics_channel": unenvNode("diagnostics_channel"), "node:os": unenvNode("os"), path: unenvNode("path"), diff --git a/examples/vibe-platform/package.json b/examples/vibe-platform/package.json index 177025e..8c4ebb2 100644 --- a/examples/vibe-platform/package.json +++ b/examples/vibe-platform/package.json @@ -16,7 +16,8 @@ "unenv": "2.0.0-rc.24" }, "devDependencies": { - "@cloudflare/workers-types": "5.20260911.1", + "@cloudflare/workers-types": "5.20261002.1", + "node-stdlib-browser": "1.3.1", "vite": "^8.3.0" } } diff --git a/examples/vibe-platform/src/main.ts b/examples/vibe-platform/src/main.ts index 8619f10..c6a70ec 100644 --- a/examples/vibe-platform/src/main.ts +++ b/examples/vibe-platform/src/main.ts @@ -565,7 +565,7 @@ Run \`pnpm exec wrangler deploy\` when you are ready to deploy. type: "module", scripts: { deploy: "wrangler deploy", "deploy:dry": "wrangler deploy --dry-run" }, // The vendored fork's version; scripts/e2e.mjs checks it against the installed package. - dependencies: { agents: "0.24.0" }, + dependencies: { agents: "0.26.0" }, devDependencies: { wrangler: "^4.114.0" }, }, null, diff --git a/examples/vibe-platform/vite.config.ts b/examples/vibe-platform/vite.config.ts index 3967ff1..0f7dd44 100644 --- a/examples/vibe-platform/vite.config.ts +++ b/examples/vibe-platform/vite.config.ts @@ -1,5 +1,6 @@ import { fileURLToPath } from "node:url"; import { workersModuleAliases } from "@mcp-b/do-runtime/vite"; +import nodeStdlib from "node-stdlib-browser"; import { defineConfig } from "vite"; const repoRoot = fileURLToPath(new URL("../../", import.meta.url)); @@ -30,6 +31,17 @@ const crossOriginIsolation = { }; export default defineConfig({ + define: { global: "globalThis", "process.env": "{}" }, + worker: { + rollupOptions: { + transform: { + inject: { + process: nodeStdlib.process, + Buffer: [nodeStdlib.buffer, "Buffer"], + }, + }, + }, + }, resolve: { alias: [ // The package's own `cloudflare:workers` and `cloudflare:email`, so @@ -37,6 +49,11 @@ export default defineConfig({ // identity, while authored source keeps the exact platform specifier it // will deploy with. ...workersModuleAliases(), + // Agents sessions hash stored content synchronously, including in browsers. + ...(["crypto", "buffer", "stream", "events"] as const).flatMap((name) => [ + { find: name, replacement: nodeStdlib[name] }, + { find: `node:${name}`, replacement: nodeStdlib[name] }, + ]), { find: "node:async_hooks", replacement: "unenv/node/async_hooks" }, { find: "node:diagnostics_channel", replacement: "unenv/node/diagnostics_channel" }, { find: "node:os", replacement: "unenv/node/os" }, diff --git a/package.json b/package.json index 12d1374..20e6d20 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "sdk:build": "pnpm --dir vendor/agents build", "sdk:sync": "pnpm sdk:build && pnpm install --filter \"do-runtime-example-*\" --frozen-lockfile --ignore-scripts", "sdk:check": "pnpm --dir vendor/agents check", - "sdk:test": "pnpm --dir vendor/agents test", + "sdk:test": "node scripts/test-sdk.mjs", "build": "pnpm build:package", "typecheck": "pnpm build:package && tsc -b tsconfig.json && tsc -p conformance/tsconfig.json && tsc -p examples/extension/tsconfig.page.json && tsc -p examples/extension/tsconfig.worker.json && tsc -p examples/vibe-platform/tsconfig.page.json && tsc -p examples/vibe-platform/tsconfig.worker.json", "test": "pnpm test:unit && pnpm test:conformance", @@ -138,7 +138,7 @@ "@arethetypeswrong/cli": "0.18.5", "@changesets/cli": "^3.0.2", "@cloudflare/vitest-pool-workers": "^0.22.0", - "@cloudflare/workers-types": "5.20260911.1", + "@cloudflare/workers-types": "5.20261002.1", "@sqlite.org/sqlite-wasm": "3.53.4-build1", "@types/node": "^26.5.1", "@types/ungap__structured-clone": "1.2.0", @@ -148,7 +148,7 @@ "publint": "0.3.24", "typescript": "^6.0.3", "vitest": "4.1.11", - "workerd": "1.20260911.1", + "workerd": "1.20261002.1", "wrangler": "^4.131.1" }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 496f729..537adbc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,13 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + sharp@0.35.2: 0.35.4 + undici@>=7 <7.29.1: 7.29.1 + brace-expansion@>=5 <5.0.12: 5.0.12 + fast-uri@>=3 <3.1.8: 3.1.8 + ip-address@>=10 <10.7.1: 10.7.1 + importers: .: @@ -29,10 +36,10 @@ importers: version: 3.0.2 '@cloudflare/vitest-pool-workers': specifier: ^0.22.0 - version: 0.22.0(@cloudflare/workers-types@5.20260911.1)(@vitest/runner@4.1.11)(@vitest/snapshot@4.1.11)(vitest@4.1.11) + version: 0.22.0(@cloudflare/workers-types@5.20261002.1)(@types/node@26.5.1)(@vitest/runner@4.1.11)(@vitest/snapshot@4.1.11)(vitest@4.1.11) '@cloudflare/workers-types': - specifier: 5.20260911.1 - version: 5.20260911.1 + specifier: 5.20261002.1 + version: 5.20261002.1 '@sqlite.org/sqlite-wasm': specifier: 3.53.4-build1 version: 3.53.4-build1 @@ -47,7 +54,7 @@ importers: version: 4.1.11(playwright@1.63.0)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(vitest@4.1.11) drizzle-orm: specifier: ^0.45.2 - version: 0.45.2(@cloudflare/workers-types@5.20260911.1)(sql.js@1.14.2) + version: 0.45.2(@cloudflare/workers-types@5.20261002.1)(sql.js@1.14.2) playwright: specifier: 1.63.0 version: 1.63.0 @@ -61,17 +68,17 @@ importers: specifier: 4.1.11 version: 4.1.11(@types/node@26.5.1)(@vitest/browser-playwright@4.1.11)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1)) workerd: - specifier: 1.20260911.1 - version: 1.20260911.1 + specifier: 1.20261002.1 + version: 1.20261002.1 wrangler: specifier: ^4.131.1 - version: 4.131.1(@cloudflare/workers-types@5.20260911.1)(@types/node@26.5.1) + version: 4.131.1(@cloudflare/workers-types@5.20261002.1)(@types/node@26.5.1) examples/extension: dependencies: '@cloudflare/think': specifier: file:../../vendor/agents/packages/think - version: file:vendor/agents/packages/think(@ai-sdk/provider@4.0.9)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(agents@file:vendor/agents/packages/agents(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4) + version: file:vendor/agents/packages/think(@ai-sdk/provider@4.0.9)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(agents@file:vendor/agents/packages/agents(@ai-sdk/provider@4.0.9)(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4) '@mcp-b/do-runtime': specifier: workspace:* version: link:../.. @@ -83,7 +90,7 @@ importers: version: 3.53.4-build1 agents: specifier: file:../../vendor/agents/packages/agents - version: file:vendor/agents/packages/agents(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4) + version: file:vendor/agents/packages/agents(@ai-sdk/provider@4.0.9)(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4) ai: specifier: 7.0.18 version: 7.0.18(zod@4.6.4) @@ -101,11 +108,14 @@ importers: specifier: 8.0.2 version: 8.0.2(@babel/core@8.0.1) '@cloudflare/workers-types': - specifier: 5.20260911.1 - version: 5.20260911.1 + specifier: 5.20261002.1 + version: 5.20261002.1 chrome-types: specifier: ^0.1.447 version: 0.1.447 + node-stdlib-browser: + specifier: 1.3.1 + version: 1.3.1 vite: specifier: ^8.3.0 version: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1) @@ -123,7 +133,7 @@ importers: version: 3.53.4-build1 agents: specifier: file:../../vendor/agents/packages/agents - version: file:vendor/agents/packages/agents(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4) + version: file:vendor/agents/packages/agents(@ai-sdk/provider@4.0.9)(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4) capnweb: specifier: 0.12.0 version: 0.12.0 @@ -132,8 +142,11 @@ importers: version: 2.0.0-rc.24 devDependencies: '@cloudflare/workers-types': - specifier: 5.20260911.1 - version: 5.20260911.1 + specifier: 5.20261002.1 + version: 5.20261002.1 + node-stdlib-browser: + specifier: 1.3.1 + version: 1.3.1 vite: specifier: ^8.3.0 version: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1) @@ -426,12 +439,12 @@ packages: '@cloudflare/think@file:vendor/agents/packages/think': resolution: {directory: vendor/agents/packages/think, type: directory} peerDependencies: - '@ai-sdk/react': ^3.0.0 || ^4.0.0 + '@ai-sdk/react': ^4.0.0 '@chat-adapter/discord': 4.38.0 '@chat-adapter/slack': 4.38.0 '@chat-adapter/telegram': 4.38.0 - agents: '>=0.24.0 <1.0.0' - ai: ^6.0.0 || ^7.0.0 + agents: '>=0.25.0 <1.0.0' + ai: ^7.0.0 react: ^19.0.0 zod: ^4.0.0 peerDependenciesMeta: @@ -474,6 +487,12 @@ packages: cpu: [x64] os: [darwin] + '@cloudflare/workerd-darwin-64@1.20261002.1': + resolution: {integrity: sha512-PW3AYxxO6W2cCYCPrx0ZOqivb/2/R2zGtPgNiUgzZBGDl2MtVxWKvzDDXvTGVCmuL4aiTCziNcZktDpCcR7NnQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + '@cloudflare/workerd-darwin-arm64@1.20260815.1': resolution: {integrity: sha512-60wtg8ng7FVWeOg/UMbZ9Ye0sslpRRAKoftPbdtuH2volq676quxVr6Zm2EjVULH/JFZeCn72dbLlrnbh0Mpcw==} engines: {node: '>=16'} @@ -486,6 +505,12 @@ packages: cpu: [arm64] os: [darwin] + '@cloudflare/workerd-darwin-arm64@1.20261002.1': + resolution: {integrity: sha512-vv6t7a11NBEX9eS9mfMRvUymJszXVnnWCH8VEq1f65sxsFli3O4sI4pzFcIvG+P1BKVZZDBv4gwvxWLQXuM37g==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + '@cloudflare/workerd-linux-64@1.20260815.1': resolution: {integrity: sha512-MuqKIHPo0Qyo8MZMmy0lP2B5PeAL7f4T9Fu4Usk3QdbV4JIrKG/OoybN3Ign7m/Dff+L1Oo/ZHydB+hEg1ueFw==} engines: {node: '>=16'} @@ -498,6 +523,12 @@ packages: cpu: [x64] os: [linux] + '@cloudflare/workerd-linux-64@1.20261002.1': + resolution: {integrity: sha512-uOU1eCBoDnR4CQLkm4tqBlM1lHMgzW14VNEWWVOohi/qvmbLAwapwyLDCytxpb4U55+mXgcMFc91y+Ibh1EssA==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + '@cloudflare/workerd-linux-arm64@1.20260815.1': resolution: {integrity: sha512-XNFtJ5rIqJxnY6ISjkfbhT/ODiWJ6LcBvNbntuPD6I/F2k7aZeKgPaXrvWvKde66LXyzFKzc8Hn+Ydx4shevQg==} engines: {node: '>=16'} @@ -510,6 +541,12 @@ packages: cpu: [arm64] os: [linux] + '@cloudflare/workerd-linux-arm64@1.20261002.1': + resolution: {integrity: sha512-p3Zcrj4EAYc1+yDUjRZ3ygjPUj/8Dg03ux+QyfL0UT5d1OG0BJnBSto2OVJuGQ3J3cCRsjhjYs7gzB727eKBTw==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + '@cloudflare/workerd-windows-64@1.20260815.1': resolution: {integrity: sha512-PiIUWrhbMg3quolwjgMvPOd75vKESjT4aDm7nL6mSjL5IOgmpO/zKstXnYfnEH3pq7sC0UCvKlF8ZPcfsh8NMw==} engines: {node: '>=16'} @@ -522,8 +559,14 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workers-types@5.20260911.1': - resolution: {integrity: sha512-yiAvknjulcU85B3yB4aKOn9+l+garWP+AbHgsdCFckeRYDdhZ1rPULi64BDf52R3VTaKqxi47kF+o9ZbjsCt5g==} + '@cloudflare/workerd-windows-64@1.20261002.1': + resolution: {integrity: sha512-S9lnFnKRUNZ6umIBjCCbdfo5cTk1fR7SKi2BcQuCUKTmOzAjLsIFV49yiwPLSH33c0TDUJn8eavX4S7bORwfBA==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@5.20261002.1': + resolution: {integrity: sha512-4DJVJoQrKkB/Q1IJJE5hd793Nupqmn2J+zuikAh2isHq/1s44G5drucgL/RtCa7/7UeJ3y6J7cmhrCZcIVfNVg==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -867,163 +910,81 @@ packages: resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.35.2': - resolution: {integrity: sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [darwin] - '@img/sharp-darwin-arm64@0.35.4': resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.35.2': - resolution: {integrity: sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [darwin] - '@img/sharp-darwin-x64@0.35.4': resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==} engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-freebsd-wasm32@0.35.2': - resolution: {integrity: sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==} - engines: {node: '>=20.9.0'} - os: [freebsd] - '@img/sharp-freebsd-wasm32@0.35.4': resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==} engines: {node: '>=20.9.0'} os: [freebsd] - '@img/sharp-libvips-darwin-arm64@1.3.1': - resolution: {integrity: sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==} - cpu: [arm64] - os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.3.3': resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.3.1': - resolution: {integrity: sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-darwin-x64@1.3.3': resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.3.1': - resolution: {integrity: sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@img/sharp-libvips-linux-arm64@1.3.3': resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.3.1': - resolution: {integrity: sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==} - cpu: [arm] - os: [linux] - libc: [glibc] - '@img/sharp-libvips-linux-arm@1.3.3': resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.3.1': - resolution: {integrity: sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.3.3': resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.3.1': - resolution: {integrity: sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.3.3': resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.3.1': - resolution: {integrity: sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.3.3': resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.3.1': - resolution: {integrity: sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@img/sharp-libvips-linux-x64@1.3.3': resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.3.1': - resolution: {integrity: sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==} - cpu: [arm64] - os: [linux] - libc: [musl] - '@img/sharp-libvips-linuxmusl-arm64@1.3.3': resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.3.1': - resolution: {integrity: sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==} - cpu: [x64] - os: [linux] - libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.3.3': resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.35.2': - resolution: {integrity: sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@img/sharp-linux-arm64@0.35.4': resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==} engines: {node: '>=20.9.0'} @@ -1031,13 +992,6 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.35.2': - resolution: {integrity: sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==} - engines: {node: '>=20.9.0'} - cpu: [arm] - os: [linux] - libc: [glibc] - '@img/sharp-linux-arm@0.35.4': resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==} engines: {node: '>=20.9.0'} @@ -1045,13 +999,6 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.35.2': - resolution: {integrity: sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==} - engines: {node: '>=20.9.0'} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@img/sharp-linux-ppc64@0.35.4': resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==} engines: {node: '>=20.9.0'} @@ -1059,13 +1006,6 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.35.2': - resolution: {integrity: sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==} - engines: {node: '>=20.9.0'} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@img/sharp-linux-riscv64@0.35.4': resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==} engines: {node: '>=20.9.0'} @@ -1073,13 +1013,6 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.35.2': - resolution: {integrity: sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==} - engines: {node: '>=20.9.0'} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@img/sharp-linux-s390x@0.35.4': resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==} engines: {node: '>=20.9.0'} @@ -1087,13 +1020,6 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.35.2': - resolution: {integrity: sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - '@img/sharp-linux-x64@0.35.4': resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==} engines: {node: '>=20.9.0'} @@ -1101,13 +1027,6 @@ packages: os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.35.2': - resolution: {integrity: sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - '@img/sharp-linuxmusl-arm64@0.35.4': resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==} engines: {node: '>=20.9.0'} @@ -1115,13 +1034,6 @@ packages: os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.35.2': - resolution: {integrity: sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [linux] - libc: [musl] - '@img/sharp-linuxmusl-x64@0.35.4': resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==} engines: {node: '>=20.9.0'} @@ -1129,54 +1041,27 @@ packages: os: [linux] libc: [musl] - '@img/sharp-wasm32@0.35.2': - resolution: {integrity: sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==} - engines: {node: '>=20.9.0'} - '@img/sharp-wasm32@0.35.4': resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==} engines: {node: '>=20.9.0'} - '@img/sharp-webcontainers-wasm32@0.35.2': - resolution: {integrity: sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==} - engines: {node: '>=20.9.0'} - cpu: [wasm32] - '@img/sharp-webcontainers-wasm32@0.35.4': resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==} engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.35.2': - resolution: {integrity: sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [win32] - '@img/sharp-win32-arm64@0.35.4': resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.35.2': - resolution: {integrity: sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==} - engines: {node: ^20.9.0} - cpu: [ia32] - os: [win32] - '@img/sharp-win32-ia32@0.35.4': resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==} engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.35.2': - resolution: {integrity: sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [win32] - '@img/sharp-win32-x64@0.35.4': resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==} engines: {node: '>=20.9.0'} @@ -1550,8 +1435,11 @@ packages: agents@file:vendor/agents/packages/agents: resolution: {directory: vendor/agents/packages/agents, type: directory} peerDependencies: + '@ai-sdk/provider': ^4.0.0 '@ai-sdk/react': ^3.0.0 || ^4.0.0 '@cloudflare/codemode': '>=0.5.0' + '@earendil-works/pi-ai': ^1.0.0 + '@earendil-works/pi-durable': ^1.0.0 '@modelcontextprotocol/client': 2.0.0 '@modelcontextprotocol/sdk': 1.30.0 '@modelcontextprotocol/server': 2.0.0 @@ -1565,10 +1453,16 @@ packages: vite: '>=6.0.0 <9.0.0' zod: ^4.0.0 peerDependenciesMeta: + '@ai-sdk/provider': + optional: true '@ai-sdk/react': optional: true '@cloudflare/codemode': optional: true + '@earendil-works/pi-ai': + optional: true + '@earendil-works/pi-durable': + optional: true '@tanstack/ai': optional: true '@x402/core': @@ -1625,6 +1519,12 @@ packages: anynum@1.0.1: resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1657,25 +1557,63 @@ packages: blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + bn.js@4.12.5: + resolution: {integrity: sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==} + + bn.js@5.2.5: + resolution: {integrity: sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==} + body-parser@2.3.0: resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} - brace-expansion@5.0.9: - resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} engines: {node: 20 || >=22} + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.1: + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} + + browserify-sign@4.2.6: + resolution: {integrity: sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==} + engines: {node: '>= 0.10'} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + browserslist@4.28.9: resolution: {integrity: sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1745,6 +1683,10 @@ packages: chrome-types@0.1.447: resolution: {integrity: sha512-vnLekNSOKI2iah8spVZ+8TfYzg+I1YvANug3nAmQlMe32gzQXMPYZ0tUWldj8IyUanKN3nkf8BSxQSWQPkZDDg==} + cipher-base@1.0.7: + resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} + engines: {node: '>= 0.10'} + cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} @@ -1778,6 +1720,12 @@ packages: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + content-disposition@1.1.0: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} @@ -1808,6 +1756,9 @@ packages: core-js-pure@3.50.0: resolution: {integrity: sha512-6GP3Pxz4IKyWjAfa747vIu/jilB5z29JWROLqH/b+pXVcpgh6tM06ZIBwSuglgVqzDYURhOK6oEzTrG0bCHitA==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.6: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} @@ -1817,6 +1768,18 @@ packages: engines: {node: '>=0.8'} hasBin: true + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cron-schedule@6.0.0: resolution: {integrity: sha512-BoZaseYGXOo5j5HUwTaegIog3JJbuH4BbrY9A1ArLjXpy+RWb3mV28F/9Gv1dDA7E2L8kngWva4NWisnLTyfgQ==} engines: {node: '>=20'} @@ -1825,6 +1788,10 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypto-browserify@3.12.1: + resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} + engines: {node: '>= 0.10'} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1849,6 +1816,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1857,6 +1828,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -1871,6 +1845,13 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + domain-browser@4.22.0: + resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} + engines: {node: '>=10'} + drizzle-orm@0.45.2: resolution: {integrity: sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==} peerDependencies: @@ -1973,6 +1954,9 @@ packages: electron-to-chromium@1.5.427: resolution: {integrity: sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==} + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2059,6 +2043,9 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -2089,8 +2076,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.7: - resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==} + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} @@ -2122,6 +2109,10 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -2145,6 +2136,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2183,6 +2178,17 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hash-base@3.0.5: + resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} + engines: {node: '>= 0.10'} + + hash-base@3.1.2: + resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} + engines: {node: '>= 0.8'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} @@ -2190,6 +2196,9 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hono@4.13.7: resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==} engines: {node: '>=16.9.0'} @@ -2198,6 +2207,9 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + human-id@4.2.1: resolution: {integrity: sha512-zPGsiS+dWoTZtZ4AtpA9Y+BdSFSNWvnouNlWNoUFyAM6xHOHmdCvqO3k8AIbdamCOv4gUFUVNPf6rJFfc4UiJw==} hasBin: true @@ -2226,22 +2238,38 @@ packages: resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} engines: {node: ^20.17.0 || >=22.9.0} - ip-address@10.7.0: - resolution: {integrity: sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==} + ip-address@10.7.1: + resolution: {integrity: sha512-4OUAqU9Z1i3vCnS05hzGiFnEMDpQ+62pAD/MVQOp83fYyNC8GleCqaS0QikQBmcWCrKFiUs/B8ztRRiYOAXuCA==} engines: {node: '>= 12'} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} + is-core-module@2.17.0: + resolution: {integrity: sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -2249,6 +2277,10 @@ packages: is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -2256,6 +2288,9 @@ packages: is-unsafe@2.0.2: resolution: {integrity: sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2267,6 +2302,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} @@ -2387,6 +2426,10 @@ packages: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -2418,6 +2461,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -2543,6 +2589,10 @@ packages: micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2574,6 +2624,12 @@ packages: resolution: {integrity: sha512-CRieJmvHx+7rNqnA5SKdsYsER6rfkUIE/jruIUw+fLhsQ4sORfuMtr3+FQzsQ9/y8lhk061V4Fl1DFdHiyBB6g==} engines: {node: '>=22.0.0'} + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.2.6: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} @@ -2647,6 +2703,10 @@ packages: resolution: {integrity: sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==} engines: {node: '>=18'} + node-stdlib-browser@1.3.1: + resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} + engines: {node: '>=10'} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -2655,6 +2715,18 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + obug@2.1.4: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} @@ -2670,6 +2742,17 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} @@ -2679,6 +2762,10 @@ packages: papaparse@5.7.0: resolution: {integrity: sha512-qBGxg/7Q3Kl9Wfhrz2Z74UnvnHTXLNG6jmKJFeBvP2+y4lV7So+7SR62+Zd47JvdrCkX+nDcnr0ObPzek/+6RA==} + parse-asn1@5.1.9: + resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} + engines: {node: '>= 0.10'} + parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} @@ -2700,6 +2787,13 @@ packages: react: optional: true + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + path-expression-matcher@1.6.2: resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} engines: {node: '>=14.0.0'} @@ -2708,6 +2802,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -2717,6 +2814,10 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pbkdf2@3.1.7: + resolution: {integrity: sha512-nS4mvFgVwUrecPTRdpdseM2fwpdfnX0/HibA8DgBRQtihUAzHQYJFU2l+OlEtiXtpqkrMvCPDwyXMUnASDt6Qw==} + engines: {node: '>= 0.10'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2736,6 +2837,10 @@ packages: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + playwright-core@1.63.0: resolution: {integrity: sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==} engines: {node: '>=20'} @@ -2767,6 +2872,9 @@ packages: deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -2775,6 +2883,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + publint@0.3.24: resolution: {integrity: sha512-9zS56KrKBoqi5Qt8h92uMP8TTM9AYZSgnmCo4u2priMqkOZvQnTsziZ2p5LJ2ywbYkAjoCDp2jda9u4cgFefIw==} engines: {node: '>=18'} @@ -2783,10 +2894,17 @@ packages: pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + qs@6.16.0: resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==} engines: {node: '>=0.6'} + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + quickjs-emscripten-core@0.32.0: resolution: {integrity: sha512-QFnPfjFey8EqknSrSxe1hZrf1/8z7/6s1QzGOmKo6++02r7QRRX7ZoyNaZh7JuVjWsVW87KnQrbZqnHkOAzUyg==} @@ -2794,6 +2912,12 @@ packages: resolution: {integrity: sha512-So0Sqw869y/S2oE3Nuc0uT3Dhqgvsj8FSrwBdsuTosVsG8ME5/OcudU1GxsrIFdFABgy17GHnTVO9TYV/bLQcA==} engines: {node: '>=16.0.0'} + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + range-parser@1.3.0: resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} engines: {node: '>= 0.6'} @@ -2809,6 +2933,9 @@ packages: re2js@1.3.3: resolution: {integrity: sha512-s/I5zEAo79SUK0Qw4dpZKpiMwbQ6Gz0KU2NRr7eaO4x/p2g7Vvmn3hdeXDg8VsaUjfj/ora+e9oi27LX/C9+mw==} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -2837,6 +2964,15 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + ripemd160@2.0.3: + resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} + engines: {node: '>= 0.8'} + rolldown@1.2.8: resolution: {integrity: sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2850,9 +2986,16 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2877,6 +3020,9 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -2885,10 +3031,6 @@ packages: engines: {node: '>= 0.10'} hasBin: true - sharp@0.35.2: - resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==} - engines: {node: '>=20.9.0'} - sharp@0.35.4: resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==} engines: {node: '>=20.9.0'} @@ -2970,10 +3112,19 @@ packages: std-env@4.2.0: resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -3004,6 +3155,10 @@ packages: resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} engines: {node: '>=14.18'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + tar-fs@2.1.5: resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} @@ -3018,6 +3173,10 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3055,6 +3214,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -3087,10 +3249,6 @@ packages: undici-types@8.9.0: resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} - undici@7.29.0: - resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} - engines: {node: '>=20.18.1'} - undici@7.29.1: resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==} engines: {node: '>=20.18.1'} @@ -3127,9 +3285,16 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3232,6 +3397,9 @@ packages: jsdom: optional: true + vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + which-typed-array@1.1.22: resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} @@ -3256,6 +3424,11 @@ packages: engines: {node: '>=16'} hasBin: true + workerd@1.20261002.1: + resolution: {integrity: sha512-HFTb9FGAEWB5AVnHP/czY/vy9tqtyV7rreb9MKntsAJi8aElBkyq7P0MLPQLgTtKOk6A+EivoS39gDH/lwzu3Q==} + engines: {node: '>=16'} + hasBin: true + workers-ai-provider@4.0.0: resolution: {integrity: sha512-FkhwMP1EP/MKXR8Jv1o7wLVKfTqu0h/PUaEmhZ7gyDiioib5Wsh3oPAKhG+7+SWfU3roTDHaEWlJpkJjpXu+fQ==} peerDependencies: @@ -3327,6 +3500,10 @@ packages: resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} engines: {node: '>=16.0.0'} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3349,6 +3526,10 @@ packages: resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} engines: {node: '>=10'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + youch-core@0.3.3: resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} @@ -3396,7 +3577,7 @@ snapshots: '@standard-schema/spec': 1.1.0 '@workflow/serde': 4.1.0 eventsource-parser: 3.1.1 - undici: 7.29.0 + undici: 7.29.1 zod: 4.6.4 '@ai-sdk/provider-utils@5.0.6(zod@4.6.4)': @@ -3750,13 +3931,13 @@ snapshots: - ai - zod - '@cloudflare/think@file:vendor/agents/packages/think(@ai-sdk/provider@4.0.9)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(agents@file:vendor/agents/packages/agents(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4)': + '@cloudflare/think@file:vendor/agents/packages/think(@ai-sdk/provider@4.0.9)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(agents@file:vendor/agents/packages/agents(@ai-sdk/provider@4.0.9)(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4)': dependencies: '@ai-sdk/anthropic': 4.0.46(zod@4.6.4) '@ai-sdk/openai': 4.0.52(zod@4.6.4) '@cloudflare/codemode': 0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4) '@cloudflare/shell': 0.4.3(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4) - agents: file:vendor/agents/packages/agents(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4) + agents: file:vendor/agents/packages/agents(@ai-sdk/provider@4.0.9)(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4) ai: 7.0.18(zod@4.6.4) chat: 4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4) just-bash: 3.4.2 @@ -3782,18 +3963,19 @@ snapshots: optionalDependencies: workerd: 1.20260911.1 - '@cloudflare/vitest-pool-workers@0.22.0(@cloudflare/workers-types@5.20260911.1)(@vitest/runner@4.1.11)(@vitest/snapshot@4.1.11)(vitest@4.1.11)': + '@cloudflare/vitest-pool-workers@0.22.0(@cloudflare/workers-types@5.20261002.1)(@types/node@26.5.1)(@vitest/runner@4.1.11)(@vitest/snapshot@4.1.11)(vitest@4.1.11)': dependencies: '@vitest/runner': 4.1.11 '@vitest/snapshot': 4.1.11 cjs-module-lexer: 1.2.3 esbuild: 0.28.1 - miniflare: 5.20260815.0-alpha + miniflare: 5.20260815.0-alpha(@types/node@26.5.1) vitest: 4.1.11(@types/node@26.5.1)(@vitest/browser-playwright@4.1.11)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1)) - wrangler: 4.124.0(@cloudflare/workers-types@5.20260911.1) + wrangler: 4.124.0(@cloudflare/workers-types@5.20261002.1)(@types/node@26.5.1) zod: 4.4.3 transitivePeerDependencies: - '@cloudflare/workers-types' + - '@types/node' - bufferutil - utf-8-validate @@ -3803,31 +3985,46 @@ snapshots: '@cloudflare/workerd-darwin-64@1.20260911.1': optional: true + '@cloudflare/workerd-darwin-64@1.20261002.1': + optional: true + '@cloudflare/workerd-darwin-arm64@1.20260815.1': optional: true '@cloudflare/workerd-darwin-arm64@1.20260911.1': optional: true + '@cloudflare/workerd-darwin-arm64@1.20261002.1': + optional: true + '@cloudflare/workerd-linux-64@1.20260815.1': optional: true '@cloudflare/workerd-linux-64@1.20260911.1': optional: true + '@cloudflare/workerd-linux-64@1.20261002.1': + optional: true + '@cloudflare/workerd-linux-arm64@1.20260815.1': optional: true '@cloudflare/workerd-linux-arm64@1.20260911.1': optional: true + '@cloudflare/workerd-linux-arm64@1.20261002.1': + optional: true + '@cloudflare/workerd-windows-64@1.20260815.1': optional: true '@cloudflare/workerd-windows-64@1.20260911.1': optional: true - '@cloudflare/workers-types@5.20260911.1': {} + '@cloudflare/workerd-windows-64@1.20261002.1': + optional: true + + '@cloudflare/workers-types@5.20261002.1': {} '@colors/colors@1.5.0': optional: true @@ -4016,211 +4213,107 @@ snapshots: '@img/colour@1.1.0': {} - '@img/sharp-darwin-arm64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.3.1 - optional: true - '@img/sharp-darwin-arm64@0.35.4': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.3.3 optional: true - '@img/sharp-darwin-x64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.3.1 - optional: true - '@img/sharp-darwin-x64@0.35.4': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.3.3 optional: true - '@img/sharp-freebsd-wasm32@0.35.2': - dependencies: - '@img/sharp-wasm32': 0.35.2 - optional: true - '@img/sharp-freebsd-wasm32@0.35.4': dependencies: '@img/sharp-wasm32': 0.35.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.3.1': - optional: true - '@img/sharp-libvips-darwin-arm64@1.3.3': optional: true - '@img/sharp-libvips-darwin-x64@1.3.1': - optional: true - '@img/sharp-libvips-darwin-x64@1.3.3': optional: true - '@img/sharp-libvips-linux-arm64@1.3.1': - optional: true - '@img/sharp-libvips-linux-arm64@1.3.3': optional: true - '@img/sharp-libvips-linux-arm@1.3.1': - optional: true - '@img/sharp-libvips-linux-arm@1.3.3': optional: true - '@img/sharp-libvips-linux-ppc64@1.3.1': - optional: true - '@img/sharp-libvips-linux-ppc64@1.3.3': optional: true - '@img/sharp-libvips-linux-riscv64@1.3.1': - optional: true - '@img/sharp-libvips-linux-riscv64@1.3.3': optional: true - '@img/sharp-libvips-linux-s390x@1.3.1': - optional: true - '@img/sharp-libvips-linux-s390x@1.3.3': optional: true - '@img/sharp-libvips-linux-x64@1.3.1': - optional: true - '@img/sharp-libvips-linux-x64@1.3.3': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.3.1': - optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.3.3': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.3.1': - optional: true - '@img/sharp-libvips-linuxmusl-x64@1.3.3': optional: true - '@img/sharp-linux-arm64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.3.1 - optional: true - '@img/sharp-linux-arm64@0.35.4': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.3.3 optional: true - '@img/sharp-linux-arm@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.3.1 - optional: true - '@img/sharp-linux-arm@0.35.4': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.3.3 optional: true - '@img/sharp-linux-ppc64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.3.1 - optional: true - '@img/sharp-linux-ppc64@0.35.4': optionalDependencies: '@img/sharp-libvips-linux-ppc64': 1.3.3 optional: true - '@img/sharp-linux-riscv64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.3.1 - optional: true - '@img/sharp-linux-riscv64@0.35.4': optionalDependencies: '@img/sharp-libvips-linux-riscv64': 1.3.3 optional: true - '@img/sharp-linux-s390x@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.3.1 - optional: true - '@img/sharp-linux-s390x@0.35.4': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.3.3 optional: true - '@img/sharp-linux-x64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.3.1 - optional: true - '@img/sharp-linux-x64@0.35.4': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.3.3 optional: true - '@img/sharp-linuxmusl-arm64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 - optional: true - '@img/sharp-linuxmusl-arm64@0.35.4': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 optional: true - '@img/sharp-linuxmusl-x64@0.35.2': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.3.1 - optional: true - '@img/sharp-linuxmusl-x64@0.35.4': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.3.3 optional: true - '@img/sharp-wasm32@0.35.2': - dependencies: - '@emnapi/runtime': 1.11.3 - optional: true - '@img/sharp-wasm32@0.35.4': dependencies: '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-webcontainers-wasm32@0.35.2': - dependencies: - '@img/sharp-wasm32': 0.35.2 - optional: true - '@img/sharp-webcontainers-wasm32@0.35.4': dependencies: '@img/sharp-wasm32': 0.35.4 optional: true - '@img/sharp-win32-arm64@0.35.2': - optional: true - '@img/sharp-win32-arm64@0.35.4': optional: true - '@img/sharp-win32-ia32@0.35.2': - optional: true - '@img/sharp-win32-ia32@0.35.4': optional: true - '@img/sharp-win32-x64@0.35.2': - optional: true - '@img/sharp-win32-x64@0.35.4': optional: true @@ -4576,7 +4669,7 @@ snapshots: acorn@8.18.0: {} - agents@file:vendor/agents/packages/agents(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4): + agents@file:vendor/agents/packages/agents(@ai-sdk/provider@4.0.9)(@babel/core@8.0.1)(@babel/runtime@7.29.7)(@cloudflare/codemode@0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(@modelcontextprotocol/server@2.0.0)(ai@7.0.18(zod@4.6.4))(chat@4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4))(just-bash@3.4.2)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(yaml@2.9.1))(zod@4.6.4): dependencies: '@babel/plugin-proposal-decorators': 8.0.2(@babel/core@8.0.1) '@cfworker/json-schema': 4.1.1 @@ -4594,6 +4687,7 @@ snapshots: yaml: 2.9.1 zod: 4.6.4 optionalDependencies: + '@ai-sdk/provider': 4.0.9 '@cloudflare/codemode': 0.5.1(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.4))(ai@7.0.18(zod@4.6.4))(zod@4.6.4) ai: 7.0.18(zod@4.6.4) chat: 4.38.0(ai@7.0.18(zod@4.6.4))(zod@4.6.4) @@ -4619,7 +4713,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.7 + fast-uri: 3.1.8 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -4639,6 +4733,20 @@ snapshots: anynum@1.0.1: {} + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.5 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + assert@2.1.0: + dependencies: + call-bind: 1.0.9 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + assertion-error@2.0.1: {} async-lock@1.4.1: {} @@ -4664,6 +4772,10 @@ snapshots: blake3-wasm@2.1.5: {} + bn.js@4.12.5: {} + + bn.js@5.2.5: {} + body-parser@2.3.0: dependencies: bytes: 3.1.2 @@ -4678,10 +4790,60 @@ snapshots: transitivePeerDependencies: - supports-color - brace-expansion@5.0.9: + brace-expansion@5.0.12: dependencies: balanced-match: 4.0.4 + brorand@1.1.0: {} + + browser-resolve@2.0.0: + dependencies: + resolve: 1.22.12 + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.7 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.7 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.1: + dependencies: + bn.js: 5.2.5 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + browserify-sign@4.2.6: + dependencies: + bn.js: 5.2.5 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.6.1 + inherits: 2.0.4 + parse-asn1: 5.1.9 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + browserslist@4.28.9: dependencies: baseline-browser-mapping: 2.11.23 @@ -4690,17 +4852,20 @@ snapshots: node-releases: 2.0.55 update-browserslist-db: 1.3.3(browserslist@4.28.9) + buffer-xor@1.0.3: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - optional: true buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + builtin-status-codes@3.0.0: {} + bytes@3.1.2: {} cac@7.0.0: {} @@ -4761,6 +4926,12 @@ snapshots: chrome-types@0.1.447: {} + cipher-base@1.0.7: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + cjs-module-lexer@1.2.3: {} clean-git-ref@2.0.1: {} @@ -4796,6 +4967,10 @@ snapshots: commander@6.2.1: {} + console-browserify@1.2.0: {} + + constants-browserify@1.0.0: {} + content-disposition@1.1.0: {} content-type@1.0.5: {} @@ -4812,6 +4987,8 @@ snapshots: core-js-pure@3.50.0: {} + core-util-is@1.0.3: {} + cors@2.8.6: dependencies: object-assign: 4.1.1 @@ -4819,6 +4996,30 @@ snapshots: crc-32@1.2.2: {} + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.5 + elliptic: 6.6.1 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.7 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.3 + sha.js: 2.4.12 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.7 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + + create-require@1.1.1: {} + cron-schedule@6.0.0: {} cross-spawn@7.0.6: @@ -4827,6 +5028,21 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypto-browserify@3.12.1: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.6 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + hash-base: 3.0.5 + inherits: 2.0.4 + pbkdf2: 3.1.7 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + debug@4.4.3: dependencies: ms: 2.1.3 @@ -4848,10 +5064,21 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + depd@2.0.0: {} dequal@2.0.3: {} + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + detect-libc@2.1.2: {} devlop@1.1.0: @@ -4862,9 +5089,17 @@ snapshots: diff@8.0.4: {} - drizzle-orm@0.45.2(@cloudflare/workers-types@5.20260911.1)(sql.js@1.14.2): + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.5 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + + domain-browser@4.22.0: {} + + drizzle-orm@0.45.2(@cloudflare/workers-types@5.20261002.1)(sql.js@1.14.2): optionalDependencies: - '@cloudflare/workers-types': 5.20260911.1 + '@cloudflare/workers-types': 5.20261002.1 sql.js: 1.14.2 dunder-proto@1.0.1: @@ -4877,6 +5112,16 @@ snapshots: electron-to-chromium@1.5.427: {} + elliptic@6.6.1: + dependencies: + bn.js: 4.12.5 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + emoji-regex@8.0.0: {} emojilib@2.4.0: {} @@ -4986,6 +5231,11 @@ snapshots: dependencies: eventsource-parser: 3.1.1 + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + expand-template@2.0.3: optional: true @@ -4995,7 +5245,7 @@ snapshots: dependencies: debug: 4.4.3 express: 5.2.1 - ip-address: 10.7.0 + ip-address: 10.7.1 transitivePeerDependencies: - supports-color @@ -5042,7 +5292,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.7: {} + fast-uri@3.1.8: {} fast-wrap-ansi@0.2.2: dependencies: @@ -5088,6 +5338,11 @@ snapshots: transitivePeerDependencies: - supports-color + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -5104,6 +5359,8 @@ snapshots: function-bind@1.1.2: {} + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -5143,12 +5400,35 @@ snapshots: dependencies: has-symbols: 1.1.0 + hash-base@3.0.5: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash-base@3.1.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + hasown@2.0.4: dependencies: function-bind: 1.1.2 highlight.js@10.7.3: {} + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + hono@4.13.7: {} http-errors@2.0.1: @@ -5159,6 +5439,8 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + https-browserify@1.0.0: {} + human-id@4.2.1: {} iconv-lite@0.7.3: @@ -5178,24 +5460,55 @@ snapshots: ini@6.0.0: {} - ip-address@10.7.0: {} + ip-address@10.7.1: {} ipaddr.js@1.9.1: {} + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-callable@1.2.7: {} + is-core-module@2.17.0: + dependencies: + hasown: 2.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + is-plain-obj@4.1.0: {} is-promise@4.0.0: {} + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.22 is-unsafe@2.0.2: {} + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} @@ -5214,6 +5527,8 @@ snapshots: sha.js: 2.4.12 simple-get: 4.0.1 + isomorphic-timers-promises@1.0.1: {} + jju@1.4.0: {} jose@6.2.12: {} @@ -5314,6 +5629,10 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + longest-streak@3.1.0: {} lru-cache@11.5.2: {} @@ -5343,6 +5662,12 @@ snapshots: math-intrinsics@1.1.0: {} + md5.js@1.3.5: + dependencies: + hash-base: 3.0.5 + inherits: 2.0.4 + safe-buffer: 5.2.1 + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -5640,6 +5965,11 @@ snapshots: transitivePeerDependencies: - supports-color + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.5 + brorand: 1.1.0 + mime-db@1.52.0: {} mime-db@1.54.0: {} @@ -5661,15 +5991,16 @@ snapshots: mimic-response@3.1.0: {} - miniflare@5.20260815.0-alpha: + miniflare@5.20260815.0-alpha(@types/node@26.5.1): dependencies: '@cspotcode/source-map-support': 0.8.1 - sharp: 0.35.2 - undici: 7.29.0 + sharp: 0.35.4(@types/node@26.5.1) + undici: 7.29.1 workerd: 1.20260815.1 ws: 8.21.0 youch: 4.1.0-beta.10 transitivePeerDependencies: + - '@types/node' - bufferutil - utf-8-validate @@ -5677,7 +6008,7 @@ snapshots: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.35.4(@types/node@26.5.1) - undici: 7.29.0 + undici: 7.29.1 workerd: 1.20260911.1 ws: 8.21.0 youch: 4.1.0-beta.10 @@ -5686,9 +6017,13 @@ snapshots: - bufferutil - utf-8-validate + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + minimatch@10.2.6: dependencies: - brace-expansion: 5.0.9 + brace-expansion: 5.0.12 minimist@1.2.8: {} @@ -5750,10 +6085,56 @@ snapshots: node-releases@2.0.55: {} + node-stdlib-browser@1.3.1: + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.1 + domain-browser: 4.22.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.4 + util: 0.12.5 + vm-browserify: 1.1.2 + object-assign@4.1.1: {} object-inspect@1.13.4: {} + object-is@1.1.6: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + obug@2.1.4: {} obug@2.2.1: {} @@ -5766,12 +6147,30 @@ snapshots: dependencies: wrappy: 1.0.2 + os-browserify@0.3.0: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + package-manager-detector@1.8.0: {} pako@1.0.11: {} papaparse@5.7.0: {} + parse-asn1@5.1.9: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.7 + safe-buffer: 5.2.1 + parse5-htmlparser2-tree-adapter@6.0.1: dependencies: parse5: 6.0.1 @@ -5786,16 +6185,31 @@ snapshots: dependencies: event-target-polyfill: 0.0.4 + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + path-expression-matcher@1.6.2: {} path-key@3.1.1: {} + path-parse@1.0.7: {} + path-to-regexp@6.3.0: {} path-to-regexp@8.4.2: {} pathe@2.0.3: {} + pbkdf2@3.1.7: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + to-buffer: 1.2.2 + picocolors@1.1.1: {} picomatch@4.0.5: {} @@ -5806,6 +6220,10 @@ snapshots: pkce-challenge@5.0.1: {} + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + playwright-core@1.63.0: {} playwright@1.63.0: @@ -5840,6 +6258,8 @@ snapshots: tunnel-agent: 0.6.0 optional: true + process-nextick-args@2.0.1: {} + process@0.11.10: {} proxy-addr@2.0.7: @@ -5847,6 +6267,15 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.5 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + parse-asn1: 5.1.9 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + publint@0.3.24: dependencies: '@publint/pack': 0.1.7 @@ -5860,11 +6289,15 @@ snapshots: once: 1.4.0 optional: true + punycode@1.4.1: {} + qs@6.16.0: dependencies: es-define-property: 1.0.1 side-channel: 1.1.1 + querystring-es3@0.2.1: {} + quickjs-emscripten-core@0.32.0: dependencies: '@jitl/quickjs-ffi-types': 0.32.0 @@ -5877,6 +6310,15 @@ snapshots: '@jitl/quickjs-wasmfile-release-sync': 0.32.0 quickjs-emscripten-core: 0.32.0 + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + range-parser@1.3.0: {} raw-body@3.0.2: @@ -5896,12 +6338,21 @@ snapshots: re2js@1.3.3: {} + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - optional: true readable-stream@4.7.0: dependencies: @@ -5943,6 +6394,18 @@ snapshots: require-from-string@2.0.2: {} + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.17.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + ripemd160@2.0.3: + dependencies: + hash-base: 3.1.2 + inherits: 2.0.4 + rolldown@1.2.8: dependencies: '@oxc-project/types': 0.149.0 @@ -5978,8 +6441,16 @@ snapshots: dependencies: mri: 1.2.0 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + safer-buffer@2.1.2: {} seek-bzip@2.0.0: @@ -6022,6 +6493,8 @@ snapshots: gopd: 1.2.0 has-property-descriptors: 1.0.2 + setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} sha.js@2.4.12: @@ -6030,38 +6503,6 @@ snapshots: safe-buffer: 5.2.1 to-buffer: 1.2.2 - sharp@0.35.2: - dependencies: - '@img/colour': 1.1.0 - detect-libc: 2.1.2 - semver: 7.8.5 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.35.2 - '@img/sharp-darwin-x64': 0.35.2 - '@img/sharp-freebsd-wasm32': 0.35.2 - '@img/sharp-libvips-darwin-arm64': 1.3.1 - '@img/sharp-libvips-darwin-x64': 1.3.1 - '@img/sharp-libvips-linux-arm': 1.3.1 - '@img/sharp-libvips-linux-arm64': 1.3.1 - '@img/sharp-libvips-linux-ppc64': 1.3.1 - '@img/sharp-libvips-linux-riscv64': 1.3.1 - '@img/sharp-libvips-linux-s390x': 1.3.1 - '@img/sharp-libvips-linux-x64': 1.3.1 - '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 - '@img/sharp-libvips-linuxmusl-x64': 1.3.1 - '@img/sharp-linux-arm': 0.35.2 - '@img/sharp-linux-arm64': 0.35.2 - '@img/sharp-linux-ppc64': 0.35.2 - '@img/sharp-linux-riscv64': 0.35.2 - '@img/sharp-linux-s390x': 0.35.2 - '@img/sharp-linux-x64': 0.35.2 - '@img/sharp-linuxmusl-arm64': 0.35.2 - '@img/sharp-linuxmusl-x64': 0.35.2 - '@img/sharp-webcontainers-wasm32': 0.35.2 - '@img/sharp-win32-arm64': 0.35.2 - '@img/sharp-win32-ia32': 0.35.2 - '@img/sharp-win32-x64': 0.35.2 - sharp@0.35.4(@types/node@26.5.1): dependencies: '@img/colour': 1.1.0 @@ -6167,12 +6608,28 @@ snapshots: std-env@4.2.0: {} + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + stream-http@3.2.0: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -6203,6 +6660,8 @@ snapshots: has-flag: 4.0.0 supports-color: 7.2.0 + supports-preserve-symlinks-flag@1.0.0: {} + tar-fs@2.1.5: dependencies: chownr: 1.1.4 @@ -6228,6 +6687,10 @@ snapshots: dependencies: any-promise: 1.3.0 + timers-browserify@2.0.12: + dependencies: + setimmediate: 1.0.5 + tinybench@2.9.0: {} tinyexec@1.3.0: {} @@ -6259,6 +6722,8 @@ snapshots: tslib@2.8.1: {} + tty-browserify@0.0.1: {} + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -6288,8 +6753,6 @@ snapshots: undici-types@8.9.0: {} - undici@7.29.0: {} - undici@7.29.1: {} unenv@2.0.0-rc.24: @@ -6335,8 +6798,20 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - util-deprecate@1.0.2: - optional: true + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.16.0 + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.22 validate-npm-package-name@5.0.1: {} @@ -6395,6 +6870,8 @@ snapshots: transitivePeerDependencies: - msw + vm-browserify@1.1.2: {} + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 @@ -6430,6 +6907,14 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260911.1 '@cloudflare/workerd-windows-64': 1.20260911.1 + workerd@1.20261002.1: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20261002.1 + '@cloudflare/workerd-darwin-arm64': 1.20261002.1 + '@cloudflare/workerd-linux-64': 1.20261002.1 + '@cloudflare/workerd-linux-arm64': 1.20261002.1 + '@cloudflare/workerd-windows-64': 1.20261002.1 + workers-ai-provider@4.0.0(@ai-sdk/anthropic@4.0.46(zod@4.6.4))(@ai-sdk/openai@4.0.52(zod@4.6.4))(@ai-sdk/provider@4.0.9)(ai@7.0.18(zod@4.6.4)): dependencies: '@ai-sdk/provider': 4.0.9 @@ -6438,24 +6923,25 @@ snapshots: '@ai-sdk/anthropic': 4.0.46(zod@4.6.4) '@ai-sdk/openai': 4.0.52(zod@4.6.4) - wrangler@4.124.0(@cloudflare/workers-types@5.20260911.1): + wrangler@4.124.0(@cloudflare/workers-types@5.20261002.1)(@types/node@26.5.1): dependencies: '@cloudflare/kv-asset-handler': 0.5.0 '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260815.1) blake3-wasm: 2.1.5 esbuild: 0.28.1 - miniflare: 5.20260815.0-alpha + miniflare: 5.20260815.0-alpha(@types/node@26.5.1) path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 workerd: 1.20260815.1 optionalDependencies: - '@cloudflare/workers-types': 5.20260911.1 + '@cloudflare/workers-types': 5.20261002.1 fsevents: 2.3.3 transitivePeerDependencies: + - '@types/node' - bufferutil - utf-8-validate - wrangler@4.131.1(@cloudflare/workers-types@5.20260911.1)(@types/node@26.5.1): + wrangler@4.131.1(@cloudflare/workers-types@5.20261002.1)(@types/node@26.5.1): dependencies: '@cloudflare/kv-asset-handler': 0.5.0 '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260911.1) @@ -6466,7 +6952,7 @@ snapshots: unenv: 2.0.0-rc.24 workerd: 1.20260911.1 optionalDependencies: - '@cloudflare/workers-types': 5.20260911.1 + '@cloudflare/workers-types': 5.20261002.1 fsevents: 2.3.3 transitivePeerDependencies: - '@types/node' @@ -6487,6 +6973,8 @@ snapshots: xml-naming@0.3.0: {} + xtend@4.0.2: {} + y18n@5.0.8: {} yaml@2.9.0: {} @@ -6505,6 +6993,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 + yocto-queue@0.1.0: {} + youch-core@0.3.3: dependencies: '@poppinss/exception': 1.2.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0e6f411..588e725 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -11,10 +11,17 @@ allowBuilds: node-liblzma: false # Allow the pinned oracle through the repository's release-age gate. minimumReleaseAgeExclude: - - "@cloudflare/workerd-darwin-64@1.20260911.1" - - "@cloudflare/workerd-darwin-arm64@1.20260911.1" - - "@cloudflare/workerd-linux-64@1.20260911.1" - - "@cloudflare/workerd-linux-arm64@1.20260911.1" - - "@cloudflare/workerd-windows-64@1.20260911.1" - - "workerd@1.20260911.1" - - "@cloudflare/workers-types@5.20260911.1" + - "@cloudflare/workerd-darwin-64@1.20261002.1" + - "@cloudflare/workerd-darwin-arm64@1.20261002.1" + - "@cloudflare/workerd-linux-64@1.20261002.1" + - "@cloudflare/workerd-linux-arm64@1.20261002.1" + - "@cloudflare/workerd-windows-64@1.20261002.1" + - "workerd@1.20261002.1" + - "@cloudflare/workers-types@5.20261002.1" +overrides: + # Security fixes stay within each installed major; see docs/dependency-security.md. + "sharp@0.35.2": "0.35.4" + "undici@>=7 <7.29.1": "7.29.1" + "brace-expansion@>=5 <5.0.12": "5.0.12" + "fast-uri@>=3 <3.1.8": "3.1.8" + "ip-address@>=10 <10.7.1": "10.7.1" diff --git a/scripts/check-workerd-oracle.mjs b/scripts/check-workerd-oracle.mjs index 6f23b0a..15be14f 100644 --- a/scripts/check-workerd-oracle.mjs +++ b/scripts/check-workerd-oracle.mjs @@ -6,6 +6,18 @@ const version = packageJson.devDependencies?.workerd; if (typeof version !== "string" || !/^\d+\.\d+\.\d+$/.test(version)) { throw new Error("package.json must pin workerd to an exact release"); } +const typesVersion = `5.${version.split(".").slice(1).join(".")}`; +for (const path of [ + "package.json", + "vendor/agents/package.json", + "examples/extension/package.json", + "examples/vibe-platform/package.json", +]) { + const manifest = JSON.parse(await readFile(new URL(path, root), "utf8")); + if (manifest.devDependencies?.["@cloudflare/workers-types"] !== typesVersion) { + throw new Error(`${path} must pin @cloudflare/workers-types to ${typesVersion}`); + } +} const workspace = await readFile(new URL("pnpm-workspace.yaml", root), "utf8"); const platforms = [ @@ -21,6 +33,9 @@ for (const name of platforms) { throw new Error(`pnpm-workspace.yaml must exclude ${name}@${version} from the release-age gate`); } } +if (!workspace.includes(`- "@cloudflare/workers-types@${typesVersion}"`)) { + throw new Error(`pnpm-workspace.yaml must exclude @cloudflare/workers-types@${typesVersion} from the release-age gate`); +} const readme = await readFile(new URL("README.md", root), "utf8"); const decisions = await readFile(new URL("docs/decisions.md", root), "utf8"); diff --git a/scripts/test-sdk.mjs b/scripts/test-sdk.mjs new file mode 100644 index 0000000..640b575 --- /dev/null +++ b/scripts/test-sdk.mjs @@ -0,0 +1,18 @@ +import { spawnSync } from "node:child_process"; +import { createRequire } from "node:module"; + +const workerdPath = createRequire(import.meta.url)("workerd").default; + +// The Workers pool pins its own older binary. Exercise the SDK against the +// same exact workerd oracle as runtime conformance, including in CI. +const result = spawnSync("pnpm", ["--dir", "vendor/agents", "test"], { + stdio: "inherit", + // Windows installs pnpm as a .cmd launcher; POSIX executes it directly. + shell: process.platform === "win32", + env: { + ...process.env, + MINIFLARE_WORKERD_PATH: process.env.MINIFLARE_WORKERD_PATH ?? workerdPath, + }, +}); +if (result.error) throw result.error; +process.exit(result.status ?? 1); diff --git a/src/api/cloudflare-workers.ts b/src/api/cloudflare-workers.ts index e35a3a4..599a6b4 100644 --- a/src/api/cloudflare-workers.ts +++ b/src/api/cloudflare-workers.ts @@ -432,6 +432,17 @@ class Span { setAttributes(_attributes: Record): this { return this; } + // ← workerd 1f6faa79b: even untraced/ended spans validate status and return themselves. + updateName(_name: string): this { + return this; + } + setStatus(status: TracingSpanStatus): this { + const code = status.code; + if (code !== "unset" && code !== "ok" && code !== "error") { + throw new TypeError("Span status code must be 'unset', 'ok', or 'error'."); + } + return this; + } recordException(_exception: unknown): void {} end(): void {} } diff --git a/src/api/worker-loader.test.ts b/src/api/worker-loader.test.ts index 988abef..8c147c2 100644 --- a/src/api/worker-loader.test.ts +++ b/src/api/worker-loader.test.ts @@ -227,7 +227,6 @@ function newHarness(options?: { compatDateValidation: options?.compatDateValidation ?? "codeVersion", allowExperimentalFeatures: options?.allowExperimentalFeatures ?? true, }); - // `IoContext`'s constructor already takes the one `onBroken()` branch each gate allows. return { ctx, channel, diff --git a/src/io/actor-sqlite.test.ts b/src/io/actor-sqlite.test.ts index edb0174..3770dee 100644 --- a/src/io/actor-sqlite.test.ts +++ b/src/io/actor-sqlite.test.ts @@ -23,9 +23,8 @@ * `kj::Own deferredDelete` going out of scope is * `deferredDelete.drop()`, and a transaction going out of scope without * `commit()` is `txn.drop()`. - * 4. **`gate.onBroken()` may be called once**, upstream's own `KJ_REQUIRE`, so - * the harness calls it and exposes `gateBroken` rather than each test - * calling it. `monitorOutputGate` keeps its meaning: with it on, `finish()` + * 4. **The harness shares a `gateBroken` observer.** + * `monitorOutputGate` keeps its meaning: with it on, `finish()` * fails the test if the gate broke and nothing said so. * 5. **`SQLITE_NOMEM` via `PRAGMA hard_heap_limit` becomes `SQLITE_FULL` via * `PRAGMA max_page_count`**, the technique Section 3's critical-error tests @@ -121,12 +120,6 @@ type Call = { type ActorSqliteTestOptions = { monitorOutputGate?: boolean; - /** - * Leave `gate.onBroken()` for someone else to take. Upstream's own - * `KJ_REQUIRE` allows exactly one caller, and an `IoContext` built on this - * gate takes it in its constructor. - */ - outputGateBrokenTakenElsewhere?: boolean; /** Caps the database so a large write raises SQLITE_FULL and SQLite auto-rolls-back. */ maxPageCount?: number; }; @@ -137,7 +130,7 @@ class ActorSqliteTest { readonly actor: ActorSqlite; readonly calls: Call[] = []; - /** ← the harness's `gateBrokenPromise`, taken once because `onBroken()` may be called once. */ + /** ← the harness's `gateBrokenPromise`. */ readonly gateBroken: Promise; brokenException: unknown | undefined; @@ -159,10 +152,7 @@ class ActorSqliteTest { scheduleRun: (scheduledTime, priorTask) => this.#scheduleRun(scheduledTime, priorTask), }, ); - this.gateBroken = - options.outputGateBrokenTakenElsewhere === true - ? new Promise(() => {}) - : this.gate.onBroken(); + this.gateBroken = this.gate.onBroken(); void this.gateBroken.catch((exception: unknown) => { this.brokenException = exception; }); @@ -2797,7 +2787,7 @@ async function countCommits( } test("§1.7.1 a storage await does not end the implicit transaction", async () => { - const harness = await newActorSqliteTest({ outputGateBrokenTakenElsewhere: true }); + const harness = await newActorSqliteTest(); const ctx = new IoContext(new TestActor(harness.gate), idleTimer); const commits = await countCommits(harness, ctx, async () => { @@ -2812,7 +2802,7 @@ test("§1.7.1 a storage await does not end the implicit transaction", async () = }); test("§1.7.1 a timer or outbound await commits and begins a new transaction", async () => { - const harness = await newActorSqliteTest({ outputGateBrokenTakenElsewhere: true }); + const harness = await newActorSqliteTest(); const ctx = new IoContext(new TestActor(harness.gate), idleTimer); const commits = await countCommits(harness, ctx, async () => { @@ -2828,7 +2818,7 @@ test("§1.7.1 a timer or outbound await commits and begins a new transaction", a }); test("§1.7.1 a storage await between a put and a setAlarm keeps them in one transaction", async () => { - const harness = await newActorSqliteTest({ outputGateBrokenTakenElsewhere: true }); + const harness = await newActorSqliteTest(); const ctx = new IoContext(new TestActor(harness.gate), idleTimer); const commits = await countCommits(harness, ctx, async () => { @@ -2854,7 +2844,7 @@ test("§1.7.1 a storage await between a put and a setAlarm keeps them in one tra * one transaction is a boundary nobody chose, and nothing else in this file would notice. */ test("decision 4 a critical section spanning hand-offs commits per hand-off, not per section", async () => { - const harness = await newActorSqliteTest({ outputGateBrokenTakenElsewhere: true }); + const harness = await newActorSqliteTest(); const ctx = new IoContext(new TestActor(harness.gate), idleTimer); let sectionEnded = false; @@ -2894,7 +2884,7 @@ test("decision 4 a critical section spanning hand-offs commits per hand-off, not test("decision 4 a storage await inside a critical section keeps its writes in one transaction", async () => { // The §1.7.1 discrimination has to survive being nested, or every boot phase that reads its own // state back loses atomicity exactly where it is least observable. - const harness = await newActorSqliteTest({ outputGateBrokenTakenElsewhere: true }); + const harness = await newActorSqliteTest(); const ctx = new IoContext(new TestActor(harness.gate), idleTimer); const commits = await countCommits(harness, ctx, async () => { diff --git a/src/io/io-gate.test.ts b/src/io/io-gate.test.ts index 5eeec5c..b85f288 100644 --- a/src/io/io-gate.test.ts +++ b/src/io/io-gate.test.ts @@ -562,6 +562,7 @@ it("OutputGate out-of-order", async () => { it("OutputGate exception", async () => { const gate = new OutputGate(); let onBroken = gate.onBroken(); + const secondOnBroken = gate.onBroken(); expect(await poll(gate.wait())).toBe(true); @@ -594,6 +595,7 @@ it("OutputGate exception", async () => { // We are marked broken at this point, though. expect(await poll(onBroken)).toBe(true); await expect(onBroken).rejects.toThrow("foo"); + await expect(secondOnBroken).rejects.toThrow("foo"); // Fulfill the first blocker (normally, not with an exception). expect(await poll(blocker1)).toBe(false); @@ -1056,3 +1058,23 @@ it("a reentry callback releases its lock when the callback returns control", asy resume.resolve("done"); expect(await running).toBe("done"); }); + +// ← workerd 275f7b2a4, io-gate-test.c++: sticky notifications retain the latest failure. +it("OutputGate retains latest exception for future observers", async () => { + const gate = new OutputGate(); + const currentObserver = gate.onBroken(); + const first = Promise.withResolvers(); + const second = Promise.withResolvers(); + const firstBlocker = gate.lockWhile(first.promise); + const secondBlocker = gate.lockWhile(second.promise); + + const firstFailure = new Error("first failure"); + first.reject(firstFailure); + await expect(firstBlocker).rejects.toBe(firstFailure); + await expect(currentObserver).rejects.toBe(firstFailure); + + const secondFailure = new Error("second failure"); + second.reject(secondFailure); + await expect(secondBlocker).rejects.toBe(secondFailure); + await expect(gate.onBroken()).rejects.toBe(secondFailure); +}); diff --git a/src/io/io-gate.ts b/src/io/io-gate.ts index da15160..76345f1 100644 --- a/src/io/io-gate.ts +++ b/src/io/io-gate.ts @@ -699,6 +699,7 @@ export class OutputGate { #pastLocksPromise: Promise = Promise.resolve(); /** A fulfiller for onBroken(), or an exception if already broken. */ #brokenState: BrokenState = { kind: "none" }; + #brokenPromise: Promise | undefined; constructor(hooks: OutputGateHooks = DEFAULT_OUTPUT_GATE_HOOKS) { this.#hooks = hooks; @@ -773,18 +774,15 @@ export class OutputGate { /** * Rejects if and when calls to `wait()` become broken due to a failed lockWhile(). The actor * should be shut down in this case. This promise never resolves, only rejects. - * - * This method can only be called once. + * Multiple observers are supported (workerd 275f7b2a4). */ onBroken(): Promise { - if (this.#brokenState.kind === "fulfiller") { - throw new Error("onBroken() can only be called once"); - } - if (this.#brokenState.kind === "exception") { return Promise.reject(this.#brokenState.exception); } else { + if (this.#brokenPromise !== undefined) return this.#brokenPromise; const { promise, reject } = Promise.withResolvers(); + this.#brokenPromise = promise; this.#brokenState = { kind: "fulfiller", reject }; void promise.catch(() => {}); return promise; diff --git a/src/util/sqlite-kv.test.ts b/src/util/sqlite-kv.test.ts index 5b6e596..8205024 100644 --- a/src/util/sqlite-kv.test.ts +++ b/src/util/sqlite-kv.test.ts @@ -127,8 +127,8 @@ describe("SQLite-KV", () => { test("large key", async () => { const kv = new SqliteKv(await openDatabase()); - // Workerd documents a 4 MB limit and configures SQLite to 4 MiB. - const closeToLimitString = "x".repeat(4_000_000); + // Workerd documents an 8 MB limit; SQLite permits 8 MiB plus serialization padding. + const closeToLimitString = "x".repeat(8_000_000); kv.put(closeToLimitString, bytes("hello")); expect(text(kv.get(closeToLimitString) as Uint8Array)).toBe("hello"); diff --git a/src/util/sqlite.ts b/src/util/sqlite.ts index 21e8a12..f4f1fc2 100644 --- a/src/util/sqlite.ts +++ b/src/util/sqlite.ts @@ -75,8 +75,8 @@ export interface SqlDatabaseStatement { export const SQL_WRONG_BINDINGS_MESSAGE = "Wrong number of parameter bindings for SQL query."; -/** ← `SQLITE_LIMIT_LENGTH`, raised from 2.2 MB to 4 MiB in workerd 2026-08-20. */ -export const SQLITE_LENGTH_LIMIT = 4 * 1024 * 1024; +/** ← workerd 1b9b6ea02 `MAX_ROW_LENGTH`: 8 MiB plus V8 serialization padding. */ +export const SQLITE_LENGTH_LIMIT = 8 * 1024 * 1024 + 34; export const SQLITE_TOOBIG_MESSAGE = "string or blob too big: SQLITE_TOOBIG"; diff --git a/src/vite-agents.test.ts b/src/vite-agents.test.ts new file mode 100644 index 0000000..99f445e --- /dev/null +++ b/src/vite-agents.test.ts @@ -0,0 +1,145 @@ +import { readFileSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import { build, parseSync, transformWithOxc } from "vite"; +import { expect, test } from "vitest"; +import { doRuntimeAwaitTransform } from "./vite"; + +// Exercise the vendored SDK's actual wrapper without bringing its server, storage and +// transport dependencies into this compiler regression. Lifecycle admission is controlled +// below; browser AsyncLocalStorage and the full Vite transform are real. +test("transformed Agent methods retain sync returns and async cold-start admission", async () => { + const sdkSource = readFileSync( + new URL("../vendor/agents/packages/agents/src/index.ts", import.meta.url), + "utf8", + ); + const declarations = parseSync("agent.ts", sdkSource).program.body.filter( + (node) => + (node.type === "FunctionDeclaration" && node.id?.name === "withAgentContext") || + (node.type === "VariableDeclaration" && + node.declarations.some( + (declaration) => + declaration.id.type === "Identifier" && + ["AsyncFunction", "agentContextWrappers"].includes(declaration.id.name), + )), + ); + expect(declarations.some((node) => node.type === "FunctionDeclaration")).toBe(true); + const wrapper = declarations.map((node) => sdkSource.slice(node.start, node.end)).join("\n"); + const actorId = "/agent-context.actor.js"; + const hooksId = fileURLToPath(new URL("./browser/async-hooks.ts", import.meta.url)); + const source = await transformWithOxc( + `import { AsyncLocalStorage } from ${JSON.stringify(hooksId)}; + const store = new AsyncLocalStorage(); + const getCurrentAgent = () => store.getStore() ?? {}; + const runInInvocation = (context, callback) => store.run(context, callback); + ${wrapper} + let keyCalls = 0; + const key = () => { keyCalls++; return "computed"; }; + class Probe { + lifecycle = { + started: false, + isStarted() { return this.started; }, + async start() { await Promise.resolve(); this.started = true; } + }; + sync() { return { value: 7, context: getCurrentAgent().agent === this }; } + async [key()]() { + const started = this.lifecycle.started; + const before = getCurrentAgent().agent === this; + await Promise.resolve(); + return { started, before, after: getCurrentAgent().agent === this }; + } + } + for (const name of ["sync", "computed"]) { + Probe.prototype[name] = withAgentContext(Probe.prototype[name]); + } + async function declared() { await Promise.resolve(); return 1; } + const expressed = async function () { await Promise.resolve(); return 2; }; + const arrow = async () => { await Promise.resolve(); return 3; }; + const methodKey = Symbol("method"); + class Base { value(input) { return input + 1; } } + class Methods extends Base { + offset = 2; + async [methodKey](input) { await Promise.resolve(); return super.value(input) + this.offset; } + static async value(input) { await Promise.resolve(); return input; } + async #private() { await Promise.resolve(); return this.offset; } + async privateValue() { return this.#private(); } + async fail() { throw new Error("method failed"); } + } + const object = { + async value(input) { await Promise.resolve(); return input; }, + async *generator() { yield await Promise.resolve(9); } + }; + export function methods() { + const instance = new Methods(); + return { + tags: [instance[methodKey], Methods.value, instance.privateValue, object.value] + .map(method => Object.prototype.toString.call(method)), + values: Promise.all([declared(), expressed(), arrow(), instance[methodKey](4), + Methods.value(5), instance.privateValue(), object.value(6)]), + failure: instance.fail(), + iterator: object.generator() + }; + } + export function run() { + const first = new Probe(); + const second = new Probe(); + const immediate = first.sync(); + const syncStarted = first.lifecycle.started; + return { immediate, syncStarted, keyCalls, + pending: Promise.all([first.computed(), second.computed()]), + leaked: getCurrentAgent().agent !== undefined }; + }`, + "fixture.ts", + { lang: "ts", target: "esnext" }, + ); + const generated = await build({ + configFile: false, + logLevel: "silent", + plugins: [ + { + name: "virtual-agent-context", + resolveId: (id) => + id === "agent-context-entry" + ? actorId + : id === "@mcp-b/do-runtime/gate" + ? "\0gate" + : id === "@mcp-b/do-runtime/browser/async-hooks" + ? hooksId + : null, + load: (id) => + id === actorId + ? source.code + : id === "\0gate" + ? "export const __gateAwait = x => x, __resumeAwait = x => x, __gateAsyncIterable = x => x;" + : null, + }, + doRuntimeAwaitTransform({ include: actorId, asyncContext: true }), + ], + build: { + write: false, + minify: false, + target: "esnext", + rollupOptions: { input: "agent-context-entry", preserveEntrySignatures: "strict" }, + }, + }); + if (Array.isArray(generated) || !("output" in generated)) throw new Error("Expected one bundle"); + const chunk = generated.output.find((output) => output.type === "chunk"); + if (!chunk) throw new Error("Expected generated JavaScript"); + const module = await import( + `data:text/javascript;base64,${Buffer.from(chunk.code).toString("base64")}` + ); + const kinds = module.methods(); + await expect(kinds.failure).rejects.toThrow("method failed"); + expect(kinds.tags).toEqual(Array(4).fill("[object AsyncFunction]")); + expect(await kinds.values).toEqual([1, 2, 3, 7, 5, 2, 6]); + expect(await kinds.iterator.next()).toEqual({ value: 9, done: false }); + expect(await kinds.iterator.next()).toEqual({ value: undefined, done: true }); + const result = module.run(); + expect(result.immediate).toEqual({ value: 7, context: true }); + expect(result.syncStarted).toBe(false); + expect(result.keyCalls).toBe(1); + expect(result.leaked).toBe(false); + expect(await result.pending).toEqual([ + { started: true, before: true, after: true }, + { started: true, before: true, after: true }, + ]); +}); diff --git a/src/vite.ts b/src/vite.ts index e37589e..54a69b4 100644 --- a/src/vite.ts +++ b/src/vite.ts @@ -16,6 +16,7 @@ import { import { ACTOR_SCOPE_GLOBALS } from "./api/actor-scope-globals.js"; const MARKER = "/* @do-runtime-gated */"; +const ASYNC_METHOD = "/* @do-runtime-async-method */"; const IMPORT = 'import { __gateAsyncIterable, __gateAwait, __resumeAwait } from "@mcp-b/do-runtime/gate";'; const OXC_ASYNC_GENERATOR = /^@oxc-project\+runtime@[^/]+\/helpers\/esm\/wrapAsyncGenerator\.js$/; @@ -130,6 +131,47 @@ function countAwaitCoverage(program: ESTree.Program): AwaitCoverage { return { total, transformed }; } +/** Keep native method identity after Oxc has lowered every continuation in its body. */ +function restoreAsyncMethods(code: string, program: ESTree.Program, expected: number): string { + const source = new MagicString(code); + let restored = 0; + const restore = (node: ESTree.Node, isStatic = false) => { + const start = code.lastIndexOf(ASYNC_METHOD, node.start); + if (start < 0) return; + const between = code.slice(start + ASYNC_METHOD.length, node.start); + // Only consume our own compiler metadata immediately before an AST method/function. + if (!/^\s*$/.test(between)) return; + if (/[\r\n]/.test(between)) { + throw new Error( + "do-runtime: Oxc moved async-method metadata; review async identity preservation", + ); + } + const end = node.start + (isStatic ? "static".length : 0); + const prefix = isStatic ? "static async" : "async"; + // Equal-width, single-line replacement leaves Oxc's composed source map valid. + source.overwrite(start, end, prefix.padEnd(end - start)); + restored += 1; + }; + new Visitor({ + MethodDefinition(node) { + restore(node, node.static); + }, + Property(node) { + if (node.method) restore(node); + }, + // Oxc moves private methods to standalone functions when targeting ES2016. + FunctionDeclaration(node) { + restore(node); + }, + }).visit(program); + if (restored !== expected) { + throw new Error( + `do-runtime: Oxc preserved ${restored}/${expected} async-method markers; review async identity preservation`, + ); + } + return source.toString(); +} + /** Rewrite syntactic awaits in selected actor-bundled modules to re-enter their input gate. */ export function doRuntimeAwaitTransform(options?: DoRuntimeAwaitTransformOptions): Plugin { const filter = createFilter(options?.include, [ @@ -162,8 +204,26 @@ export function doRuntimeAwaitTransform(options?: DoRuntimeAwaitTransformOptions const source = new MagicString(code); let transformed = false; + let asyncMethods = 0; + const markAsyncMethod = (node: ESTree.Node, value: ESTree.Node) => { + if ( + options?.asyncContext && + value.type === "FunctionExpression" && + value.async && + !value.generator + ) { + source.prependLeft(node.start, `${ASYNC_METHOD} `); + asyncMethods += 1; + } + }; const program = this.parse(code); new Visitor({ + MethodDefinition(node) { + markAsyncMethod(node, node.value); + }, + Property(node) { + if (node.method) markAsyncMethod(node, node.value); + }, AwaitExpression(node) { source.prependLeft(node.start, "__resumeAwait(("); source.prependLeft(node.argument.start, "__gateAwait(("); @@ -193,12 +253,18 @@ export function doRuntimeAwaitTransform(options?: DoRuntimeAwaitTransformOptions source.appendLeft(insertionPoint, 'import "@mcp-b/do-runtime/browser/async-hooks";\n'); // Native await never calls Promise.prototype.then. Oxc's generator // helpers do, making each continuation an ordinary bound callback. - return await transformWithOxc( + const lowered = await transformWithOxc( source.toString(), id, { target: "es2016", lang: "js" }, source.generateMap({ hires: "boundary", includeContent: true, source: id }), ); + // No native await remains in these shells: promise adoption needs no user-code + // continuation. Preserve AsyncFunction identity used by RPC lifecycle dispatch. + if (asyncMethods > 0) { + lowered.code = restoreAsyncMethods(lowered.code, this.parse(lowered.code), asyncMethods); + } + return lowered; } return { code: source.toString(), diff --git a/vendor/agents/.changeset/agents-0-26-refresh.md b/vendor/agents/.changeset/agents-0-26-refresh.md new file mode 100644 index 0000000..4d63d9c --- /dev/null +++ b/vendor/agents/.changeset/agents-0-26-refresh.md @@ -0,0 +1,26 @@ +--- +"agents": minor +"@cloudflare/think": minor +"@cloudflare/ai-chat": patch +"@cloudflare/codemode": patch +--- + +Refresh the package closure to Agents 0.26.0 / Think 0.20.0 / AI Chat 0.12.1 / +Codemode 0.5.3 (upstream `74570a19`). Voice 0.5.0 and Shell 0.4.3 remain unchanged. +Think requires AI SDK 7, React SDK 4 and Agents >=0.25; AI Chat also requires +Agents >=0.25. Agents adds optional model/Pi integrations and persistent Browser +tools under `agents/browser/ai-sdk` and `agents/browser/tanstack-ai`. + +Use upstream declared-member override detection, React cleanup/address reset, +and noncreating deleted-facet routing in place of equivalent fork patches. +Compose replay sequence tracking and terminal-only Agent-tool events with the +fork's continuation descriptors, atomic snapshots, unstored live events and +Stop/cancellation contracts. Persist the canonical transcript before completion; +finish pending resume replay before broadcasting that terminal frame, retaining +server-authored timing and completed outcomes after callback delivery failures. + +The 0.24-to-0.26 storage changes add nullable content hashes, submission message +identity and child event-delivery metadata. The previous Lifecycle queue +migration remains a prerequisite for older deployments; this update does not +make pre-0.24 rollbacks lossless. The detailed commit range, integration choices, +and verification are in `docs/audit/agents-sync-2026-10-02.md`. diff --git a/vendor/agents/AGENTS.md b/vendor/agents/AGENTS.md index 2695c11..3a2341e 100644 --- a/vendor/agents/AGENTS.md +++ b/vendor/agents/AGENTS.md @@ -8,6 +8,13 @@ regression suites are present. Commands in this workspace's `package.json` are authoritative; upstream sections below that refer to Nx, sites, examples, guides, or experiments describe content intentionally left out of this fork. +Upgrade support is forward-only: preserve migrations that carry existing actor +data and queued work into the current release. Downgrade support is outside the +maintained scope. Evalite, the credentialed `packages/agents/evals/` scheduling +evaluation and its `evals` command are intentionally excluded. Do not restore +them during upstream syncs; maintain runtime scheduling and deterministic tests. +See [the local maintenance policy](docs/fork-diff.md#local-maintenance-policy). + ## Project overview Cloudflare Agents SDK — a framework for building stateful AI agents on Cloudflare Workers. This is a monorepo containing the core SDK packages, examples, guides, sites, and documentation. diff --git a/vendor/agents/VENDOR.md b/vendor/agents/VENDOR.md index 05388cd..d3711db 100644 --- a/vendor/agents/VENDOR.md +++ b/vendor/agents/VENDOR.md @@ -2,17 +2,17 @@ Upstream: -Release pin: `agents@0.24.0` -(`c076e4c9ff6cfb72931085226edfd3ee7965ac48`). +Release pin: `agents@0.26.0` +(`74570a19aafc676dd85831a31af047817e7bba12`). -The package versions match the 0.24 release: +The package versions match the 0.26 release: -- `agents@0.24.0` -- `@cloudflare/think@0.19.0` -- `@cloudflare/ai-chat@0.12.0` +- `agents@0.26.0` +- `@cloudflare/think@0.20.0` +- `@cloudflare/ai-chat@0.12.1` - `@cloudflare/voice@0.5.0` - `@cloudflare/shell@0.4.3` -- `@cloudflare/codemode@0.5.2` +- `@cloudflare/codemode@0.5.3` This fork contains only the package closure used by Rook. Compare future upstream releases against the commit above, reconcile diff --git a/vendor/agents/docs/audit/agents-0.26-commit-dispositions.csv b/vendor/agents/docs/audit/agents-0.26-commit-dispositions.csv new file mode 100644 index 0000000..2572ac0 --- /dev/null +++ b/vendor/agents/docs/audit/agents-0.26-commit-dispositions.csv @@ -0,0 +1,105 @@ +sha,subject,upstream_url,retained_package_paths,other_paths,disposition,integration_note +7d58ade09cfaa67cde194e75ff76b40fed8faf6d,think: write assistant-message metadata via forwarded messageMetadata (#1873) (#2321),https://github.com/cloudflare/agents/commit/7d58ade09cfaa67cde194e75ff76b40fed8faf6d,packages/think/README.md;packages/think/src/tests/agents/client-tools.ts;packages/think/src/tests/assistant-message-metadata.test.ts;packages/think/src/think.ts,.changeset/think-assistant-message-metadata.md;docs/think/lifecycle-hooks.md,package endpoint imported; fork conflicts reconciled,Compose custom metadata writers with fork server-owned timing; assert recovery retains original timestamp. +677c022b4460e1a03c3afc5934aba85cde20ddda,docs(chat): document maxRecoveryWork's durable-segment unit and 10000 default (#2282) (#2322),https://github.com/cloudflare/agents/commit/677c022b4460e1a03c3afc5934aba85cde20ddda,packages/agents/src/chat/lifecycle.ts;packages/agents/src/chat/recovery-incident.ts;packages/agents/src/index.ts;packages/agents/src/tests-d/agent-tool-interrupted.test-d.ts;packages/ai-chat/src/tests/durable-chat-recovery.test.ts;packages/think/src/tests/think-session.test.ts,.changeset/recovery-work-unit-docs.md;docs/agents/agent-tools.md;docs/agents/chat-agents.md;docs/think/sub-agents.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +57e2e46ee14eb5df72a8569074f43e4f4f336d0e,fix(think): load messenger attachments delivered as ArrayBuffer (#2311) (#2323),https://github.com/cloudflare/agents/commit/57e2e46ee14eb5df72a8569074f43e4f4f336d0e,packages/think/src/messengers/chat-sdk.ts;packages/think/src/tests/messengers.test.ts,.changeset/messenger-attachment-arraybuffer.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +34df44b9f0b5b6c47674a746cc4071df824baceb,fix(think): stop posting a `...` placeholder before messenger replies (#2310) (#2324),https://github.com/cloudflare/agents/commit/34df44b9f0b5b6c47674a746cc4071df824baceb,packages/think/src/messengers/chat-sdk.ts;packages/think/src/messengers/delivery.ts;packages/think/src/tests/agents/index.ts;packages/think/src/tests/agents/messengers.ts;packages/think/src/tests/messengers.test.ts;packages/think/src/tests/worker.ts;packages/think/src/tests/wrangler.jsonc,.changeset/messenger-no-placeholder-post.md;docs/think/messengers.md;examples/chat-sdk-messenger/src/index.ts;examples/chat-sdk-messenger/src/intelligence/delivery.ts;examples/chat-sdk-messenger/src/tests/intelligence.test.ts,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +6289a15794ca308f971ed978cd5adc4d27e6a546,"fix(think): answer messenger bursts with every message, not just the last (#2312) (#2325)",https://github.com/cloudflare/agents/commit/6289a15794ca308f971ed978cd5adc4d27e6a546,packages/think/src/messengers/chat-sdk.ts;packages/think/src/messengers/events.ts;packages/think/src/tests/agents/messengers.ts;packages/think/src/tests/messengers.test.ts,.changeset/messenger-burst-skipped.md;docs/think/messengers.md;examples/chat-sdk-messenger/src/index.ts;examples/chat-sdk-messenger/src/intelligence/delivery.ts;examples/chat-sdk-messenger/src/intelligence/messages.ts;examples/chat-sdk-messenger/src/tests/intelligence.test.ts,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +a3e4eef6a77d821819d5438105287700ea1c6426,fix(think): detect real method overrides after Agent wraps methods (#2165) (#2326),https://github.com/cloudflare/agents/commit/a3e4eef6a77d821819d5438105287700ea1c6426,packages/think/src/tests/agents/index.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/think-session.test.ts;packages/think/src/tests/worker.ts;packages/think/src/tests/wrangler.jsonc;packages/think/src/think.ts,.changeset/calm-tools-think.md;docs/think/index.md;docs/think/lifecycle-hooks.md,package endpoint imported; fork conflicts reconciled,Replace fork override WeakMap/helper with upstream declared-member snapshots. +af2aa0bb835869f1e83487a2edeb80504c42e13f,fix(think): broadcast the persisted transcript before the done frame (#2119) (#2327),https://github.com/cloudflare/agents/commit/af2aa0bb835869f1e83487a2edeb80504c42e13f,packages/think/src/tests/assistant-agent.test.ts;packages/think/src/tests/terminal-frame-order.test.ts;packages/think/src/think.ts,.changeset/think-persist-before-done.md;design/think.md,package endpoint imported; fork conflicts reconciled,Adopt persist -> canonical transcript -> done; retain final canonical metadata and resume-before-terminal delivery. +84e6e5cb40f8b5c589198dc7a63867fc4559c4b5,"fix(think): retry pre-first-chunk stalls and call onChatRecovery for stalls (#1941, #2042) (#2328)",https://github.com/cloudflare/agents/commit/84e6e5cb40f8b5c589198dc7a63867fc4559c4b5,packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/think-session.test.ts;packages/think/src/think.ts,.changeset/think-stall-recovery-retry.md;docs/think/index.md;docs/think/sub-agents.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +558424ce7c9ca8f4368602684a55718443b12cef,fix(think): extend the interrupted assistant message on recovery continuations (#1876) (#2329),https://github.com/cloudflare/agents/commit/558424ce7c9ca8f4368602684a55718443b12cef,packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/run-turn-recovery.test.ts;packages/think/src/tests/think-session.test.ts;packages/think/src/think.ts,.changeset/think-continuation-accumulator.md;docs/think/index.md;docs/think/sub-agents.md,package endpoint imported; fork conflicts reconciled,Adopt same-message recovery extension; keep fork continuation descriptor for cold remount. +e80278e2f484c55124884e5a2fc5bd215eaf77fa,fix(think): run WebSocket chat turns on the implicit web channel (#2255) (#2330),https://github.com/cloudflare/agents/commit/e80278e2f484c55124884e5a2fc5bd215eaf77fa,packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/ws-web-channel.test.ts;packages/think/src/think.ts,.changeset/think-ws-web-channel.md;docs/think/channels.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +0c5fd959aa817845ef4e8cfde5a23de407392afe,fix(think): drop pending-state text when a paused execution resolves (#2054) (#2331),https://github.com/cloudflare/agents/commit/0c5fd959aa817845ef4e8cfde5a23de407392afe,packages/think/src/tests/actions-durable-pause.test.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/think.ts,.changeset/think-drop-pending-pause-text.md;docs/think/actions.md;docs/think/tools.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +7f564e7bfeee6ec976c12ce1e4dbbaa150906d26,fix(ai-chat): send the done frame after the transcript is persisted (#2334),https://github.com/cloudflare/agents/commit/7f564e7bfeee6ec976c12ce1e4dbbaa150906d26,packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/terminal-frame-order.test.ts;packages/ai-chat/src/tests/worker.ts,.changeset/ai-chat-persist-before-done.md;design/chat-shared-layer.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +9aec847d4ba2e0999ecf214346190f8061adb4e4,revert(agents): remove the browser interaction contract (#2346),https://github.com/cloudflare/agents/commit/9aec847d4ba2e0999ecf214346190f8061adb4e4,packages/agents/src/browser/interaction/contract.ts;packages/agents/src/browser/interaction/errors.ts;packages/agents/src/browser/interaction/index.ts;packages/agents/src/browser/interaction/verbs.ts;packages/agents/src/tests-d/browser-interaction-contract.test-d.ts;packages/agents/src/tests/browser-interaction-errors.test.ts,,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +1edc989c82c58879c37ed8e81f5d6813fb4599eb,fix(think): truncate older tool results after toModelOutput (#2014) (#2339),https://github.com/cloudflare/agents/commit/1edc989c82c58879c37ed8e81f5d6813fb4599eb,packages/agents/src/chat/index.ts;packages/agents/src/chat/truncate-older-messages.ts;packages/agents/src/tests/chat/truncate-older-messages.test.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/hooks.test.ts;packages/think/src/think.ts,.changeset/truncate-model-tool-results.md;docs/agents/sessions.md,package endpoint imported; fork conflicts reconciled,Adopt truncation after toModelOutput; retain fork head/tail output budgeting. +3b278b2c987f47247e551731a1fea9b6dd154456,"fix(think): replay onChatResponse owed across a reset; checkpoint before messenger apology (#2266, #1842) (#2340)",https://github.com/cloudflare/agents/commit/3b278b2c987f47247e551731a1fea9b6dd154456,packages/agents/src/chat/lifecycle.ts;packages/think/src/messengers/delivery.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/messengers.test.ts;packages/think/src/tests/run-turn-recovery.test.ts;packages/think/src/think.ts,.changeset/response-hook-after-reset.md;docs/think/lifecycle-hooks.md,package endpoint imported; fork conflicts reconciled,Adopt pending response-hook checkpoint; retain completed stream through enclosing Task settlement. +caef62a30a169d9392986f548e6b7f3551548663,"fix(think): structured output on wait TurnResult; submission messageId (#2263, #2264) (#2341)",https://github.com/cloudflare/agents/commit/caef62a30a169d9392986f548e6b7f3551548663,packages/think/src/tests/agents/index.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/hooks.test.ts;packages/think/src/tests/submissions.test.ts;packages/think/src/tests/think-session.test.ts;packages/think/src/tests/worker.ts;packages/think/src/tests/wrangler.jsonc;packages/think/src/think.ts,.changeset/turn-result-output.md;docs/think/index.md;docs/think/programmatic-submissions.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +f9980e005bd8cd93eb8ffefc547fbf0738c5c182,test(think): cover a failed final persist on wait and recovery turns (#1997) (#2342),https://github.com/cloudflare/agents/commit/f9980e005bd8cd93eb8ffefc547fbf0738c5c182,packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/run-turn-recovery.test.ts,,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +a2f6f944bfc4a9e1c878e2f74822c9ef98c35857,fix(think): route transient and rate_limit stream errors into bounded recovery (#2085) (#2343),https://github.com/cloudflare/agents/commit/a2f6f944bfc4a9e1c878e2f74822c9ef98c35857,packages/agents/src/chat/__tests__/recovery-incident.test.ts;packages/agents/src/chat/recovery-engine.ts;packages/agents/src/chat/recovery-incident.ts;packages/agents/src/chat/recovery-task.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/think-session.test.ts;packages/think/src/think.ts,.changeset/transient-stream-recovery.md;docs/think/lifecycle-hooks.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +a91f669d4408b60af8d5771bae293ca9ebe948cd,fix(agents): let the server snapshot heal a diverged observed assistant (#2166) (#2344),https://github.com/cloudflare/agents/commit/a91f669d4408b60af8d5771bae293ca9ebe948cd,packages/agents/src/chat/__tests__/broadcast-state.test.ts;packages/agents/src/chat/broadcast-state.ts;packages/agents/src/chat/react.tsx;packages/ai-chat/src/react-tests/use-agent-chat.test.tsx,.changeset/observer-snapshot-heal.md,package endpoint imported; fork conflicts reconciled,Adopt authoritative observer snapshots while preserving persisted terminal timing metadata. +00a07bdc5b68c4537c15c551c47f62b3283764d4,fix(think): deliver the recovered answer to the messenger thread (#2106) (#2347),https://github.com/cloudflare/agents/commit/00a07bdc5b68c4537c15c551c47f62b3283764d4,packages/think/src/messengers/chat-sdk.ts;packages/think/src/messengers/delivery.ts;packages/think/src/tests/agents/messengers.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/messengers.test.ts;packages/think/src/tests/think-session.test.ts;packages/think/src/think.ts,.changeset/messenger-recovered-delivery.md;docs/think/messengers.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +39361fa8c2194bb46c2b165454726252cca80c34,fix(chat): skip replayed continuation chunks the client already applied (#1951) (#2348),https://github.com/cloudflare/agents/commit/39361fa8c2194bb46c2b165454726252cca80c34,packages/agents/src/chat/__tests__/replay-dedupe.test.ts;packages/agents/src/chat/react.tsx;packages/agents/src/chat/replay-dedupe.ts;packages/agents/src/chat/replay-frames.ts;packages/agents/src/chat/resumable-stream.ts;packages/agents/src/chat/wire-types.ts;packages/agents/src/chat/ws-chat-transport.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/react-tests/use-agent-chat.test.tsx;packages/ai-chat/src/tests/resumable-streaming.test.ts;packages/ai-chat/src/tests/worker.ts;packages/ai-chat/src/tests/ws-transport-resume.test.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/think-session.test.ts;packages/think/src/think.ts,.changeset/replay-chunk-seq.md;docs/agents/resumable-streaming.md,package endpoint imported; fork conflicts reconciled,Adopt replay sequence ledger; apply fork prefix restoration only before previously applied replay. +52e624e56289fccba4523b729c0abbb62c80926b,feat(think): expose the running turn's identity to hooks and tools (#2350),https://github.com/cloudflare/agents/commit/52e624e56289fccba4523b729c0abbb62c80926b,packages/think/src/extensions/hook-proxy.ts;packages/think/src/tests/agents/assistant-agent-loop.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/hooks.test.ts;packages/think/src/think.ts,.changeset/think-turn-identity.md;docs/think/lifecycle-hooks.md;docs/think/messengers.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +0b13fe0d8f8834857eaaf9526e20b4d0f658568f,feat(think): waitForSubmission and a cancelSubmission outcome (#2351),https://github.com/cloudflare/agents/commit/0b13fe0d8f8834857eaaf9526e20b4d0f658568f,packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/submissions.test.ts;packages/think/src/think.ts,.changeset/think-submission-wait.md;docs/think/programmatic-submissions.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +449ac2787a1d101d7246b8035c9751bc8b5f9966,fix/2185 approval batch rearm (#2352),https://github.com/cloudflare/agents/commit/449ac2787a1d101d7246b8035c9751bc8b5f9966,packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/client-tools-continuation.test.ts;packages/ai-chat/src/tests/worker.ts;packages/think/src/tests/agents/client-tools.ts;packages/think/src/tests/client-tools.test.ts,.changeset/ai-chat-stale-post-stream-continuation.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +06d50ebf65460e52b4ca292c9cd6d7f44fb6c706,feat/think reject without continue (#2353),https://github.com/cloudflare/agents/commit/06d50ebf65460e52b4ca292c9cd6d7f44fb6c706,packages/think/src/tests/actions-durable-pause.test.ts;packages/think/src/tests/agents/execute-hitl.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/execute-hitl.test.ts;packages/think/src/think.ts,.changeset/quiet-agents-pause.md;docs/think/actions.md;docs/think/tools.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +d3cb4e136d3d68ee66c5f5bef28ca105d3a49eff,feat(think): configurable messenger concurrency strategy (#2313) (#2354),https://github.com/cloudflare/agents/commit/d3cb4e136d3d68ee66c5f5bef28ca105d3a49eff,packages/think/src/messengers/chat-sdk.ts;packages/think/src/messengers/index.ts;packages/think/src/tests/agents/messengers.ts;packages/think/src/tests/messengers.test.ts;packages/think/src/think.ts,.changeset/think-messenger-concurrency.md;docs/think/index.md;docs/think/messengers.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +ccca38957405167bebb0d524271d5af7d55b464b,feat(think): getGateway hook for AI Gateway id and metadata (#2262) (#2355),https://github.com/cloudflare/agents/commit/ccca38957405167bebb0d524271d5af7d55b464b,packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/hooks.test.ts;packages/think/src/think.ts,.changeset/think-gateway-options.md;docs/think/index.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +f92420fea9f6f17d3a1f86dba6c8c0c054769a1f,fix(think): keep the prompt-cache prefix stable under truncation (#2200) (#2356),https://github.com/cloudflare/agents/commit/f92420fea9f6f17d3a1f86dba6c8c0c054769a1f,packages/think/src/tests/agents/index.ts;packages/think/src/tests/agents/prompt-cache.ts;packages/think/src/tests/prompt-cache.test.ts;packages/think/src/tests/worker.ts;packages/think/src/tests/wrangler.jsonc;packages/think/src/think.ts,.changeset/think-stable-truncation-prefix.md;docs/agents/sessions.md;docs/think/index.md,package endpoint imported; fork conflicts reconciled,Adopt eight-message truncation steps; move boundary tests past first cutoff. +5848d71b21a96c9484811a7f65dc2591853ffe7e,fix(think): return the assistant produced by each wait turn (#2290),https://github.com/cloudflare/agents/commit/5848d71b21a96c9484811a7f65dc2591853ffe7e,packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/run-turn.test.ts;packages/think/src/think.ts,.changeset/turn-owned-wait-results.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +3f6bdad0be358a03a563fa8538c0e7dba4ce9afc,feat(agents): add the named browser session core (#2302),https://github.com/cloudflare/agents/commit/3f6bdad0be358a03a563fa8538c0e7dba4ce9afc,packages/agents/src/browser/browser-run.ts;packages/agents/src/browser/cdp-session.ts;packages/agents/src/browser/connector.ts;packages/agents/src/browser/session-core.ts;packages/agents/src/tests-d/browser-engine-options.test-d.ts;packages/agents/src/tests/browser-connector.test.ts;packages/agents/src/tests/browser-session-core.test.ts,,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +ad890ffb1d18e44dcc1cf7749c134261b970c554,feat(agents): add the browser-sessions Lifecycle capability (#2293),https://github.com/cloudflare/agents/commit/ad890ffb1d18e44dcc1cf7749c134261b970c554,packages/agents/src/browser/browser-run.ts;packages/agents/src/browser/capability.ts;packages/agents/src/browser/connector.ts;packages/agents/src/browser/live-view.ts;packages/agents/src/browser/session-core.ts;packages/agents/src/tests/agents/browser.ts;packages/agents/src/tests/browser-capability.test.ts;packages/agents/src/tests/browser-session-core.test.ts;packages/agents/src/tests/capabilities/browser.ts;packages/agents/src/tests/worker.ts;packages/agents/src/tests/wrangler.jsonc,,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +abda4e3ab57e5ba435af45bc9ba62999eebb46c3,docs(agents): record the browser session design and API additions (#2294),https://github.com/cloudflare/agents/commit/abda4e3ab57e5ba435af45bc9ba62999eebb46c3,packages/agents/src/browser/index.ts,.changeset/browser-session-guardrails.md;design/AGENTS.md;design/browser-sessions.md;design/browser-tools.md;docs/agents/browse-the-web.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +aaba6cbb66e9b0c35b2a7589a009e9cb3b7f44a1,fix(observability): keep oversized tool payloads in traces by redacting base64 (#2366),https://github.com/cloudflare/agents/commit/aaba6cbb66e9b0c35b2a7589a009e9cb3b7f44a1,packages/agents/src/browser/ai.ts;packages/agents/src/core/base64-redaction.ts;packages/agents/src/observability/ai/content.ts;packages/agents/src/tests/core/base64-redaction.test.ts;packages/agents/src/tests/observability/ai-sdk-wrap.test.ts,.changeset/trace-tool-payload-redaction.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +930949cd39f02d6b804ed836e39be12cb23a6974,chore(ci): bump pnpm/action-setup to v6 and pnpm to 11.19.0 (#2375),https://github.com/cloudflare/agents/commit/930949cd39f02d6b804ed836e39be12cb23a6974,,.github/actions/install/action.yml;package.json,outside retained package closure,Upstream CI/pnpm bump outside package snapshot; preserve maintained pnpm11.9 and Node24.11 floor. +7588509eab3f9175325495d30710f9951a90ae78,fix(agents): fire useAgentChat onToolCall only after the stream ends (#2361),https://github.com/cloudflare/agents/commit/7588509eab3f9175325495d30710f9951a90ae78,packages/agents/src/chat/react.tsx;packages/agents/src/chat/ws-chat-transport.ts;packages/ai-chat/src/react-tests/use-agent-chat.test.tsx,.changeset/on-tool-call-after-stream.md;docs/agents/chat-agents.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +7a30c1f3adecf4ea1a66737dc4f5dc943e89f3e1,fix(think): complete interrupted structured workflow turns with their output (#2362),https://github.com/cloudflare/agents/commit/7a30c1f3adecf4ea1a66737dc4f5dc943e89f3e1,packages/think/src/e2e-tests/worker.ts;packages/think/src/e2e-tests/workflow-recovery.test.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/submissions.test.ts;packages/think/src/think.ts,.changeset/think-structured-turn-recovery.md;docs/think/workflows.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +d72d343a9f6fde0a89f9b8f1be0ddc8ed2ba4f1f,fix(agents): skip onFiberRecovered for runFiber work that already finished (#2363),https://github.com/cloudflare/agents/commit/d72d343a9f6fde0a89f9b8f1be0ddc8ed2ba4f1f,packages/agents/src/index.ts;packages/agents/src/tests/agents/run-fiber.ts;packages/agents/src/tests/agents/sub-agent.ts;packages/agents/src/tests/run-fiber.test.ts;packages/agents/src/tests/schema-and-state-optimization.test.ts;packages/agents/src/tests/sub-agent.test.ts,.changeset/run-fiber-completed-cleanup.md;docs/agents/durable-execution.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +720613485a9257e25de89d96be7a30a05c40f623,fix(ai-chat): route platform-transient reader errors into bounded recovery (#2360),https://github.com/cloudflare/agents/commit/720613485a9257e25de89d96be7a30a05c40f623,packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/durable-chat-recovery.test.ts;packages/ai-chat/src/tests/worker.ts,.changeset/ai-chat-transient-reader-recovery.md;docs/agents/chat-agents.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +5e0507e5f1ba27cc7c2bf2920c380a7c8f9caaad,feat(agents): opt-in terminal-only event delivery for runAgentTool (#2364),https://github.com/cloudflare/agents/commit/5e0507e5f1ba27cc7c2bf2920c380a7c8f9caaad,packages/agents/src/agent-tool-types.ts;packages/agents/src/agent-tools.ts;packages/agents/src/chat/__tests__/agent-tools.test.ts;packages/agents/src/chat/agent-tools.ts;packages/agents/src/index.ts;packages/agents/src/react.tsx;packages/agents/src/tests/schema-and-state-optimization.test.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/agent-tools.test.ts;packages/ai-chat/src/tests/worker.ts;packages/think/src/tests/agent-tools.test.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/think.ts,.changeset/agent-tool-terminal-delivery.md;docs/agents/agent-tools.md,package endpoint imported; fork conflicts reconciled,Forward eventDelivery into child start; terminal-only fork snapshots omit content and milestones. +c5b605be05bab445d8b65cc8ee7acf68b32d8040,feat(chat): originating user message ids on terminal response frames (#2365),https://github.com/cloudflare/agents/commit/c5b605be05bab445d8b65cc8ee7acf68b32d8040,packages/agents/src/chat/__tests__/origin-message-ids.test.ts;packages/agents/src/chat/__tests__/resume-handshake.test.ts;packages/agents/src/chat/index.ts;packages/agents/src/chat/origin-message-ids.ts;packages/agents/src/chat/recovery-engine.ts;packages/agents/src/chat/recovery-incident.ts;packages/agents/src/chat/recovery.ts;packages/agents/src/chat/replay-frames.ts;packages/agents/src/chat/resumable-stream.ts;packages/agents/src/chat/resume-handshake.ts;packages/agents/src/chat/wire-types.ts;packages/agents/src/tests/streams/resumable-stream-settlement.test.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/origin-message-ids.test.ts;packages/ai-chat/src/tests/worker.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/origin-message-ids.test.ts;packages/think/src/think.ts,.changeset/terminal-frame-message-ids.md;docs/agents/chat-agents.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +dbf170cf7d0313ffe79d7d6a84201841f2e12184,feat(chat): outcome on terminal frames and useAgentChat onTurnEnd (#2378),https://github.com/cloudflare/agents/commit/dbf170cf7d0313ffe79d7d6a84201841f2e12184,packages/agents/src/chat/index.ts;packages/agents/src/chat/react.tsx;packages/agents/src/chat/wire-types.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/react-tests/use-agent-chat.test.tsx;packages/ai-chat/src/react.tsx;packages/ai-chat/src/tests/cancel-request.test.ts;packages/ai-chat/src/tests/message-concurrency.test.ts;packages/ai-chat/src/tests/origin-message-ids.test.ts;packages/ai-chat/src/tests/terminal-frame-order.test.ts;packages/think/src/react.tsx;packages/think/src/tests/client-tools.test.ts;packages/think/src/tests/origin-message-ids.test.ts;packages/think/src/think.ts,.changeset/chat-turn-end-outcome.md;docs/agents/chat-agents.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +efbb005dc42535a6df803fe2afe4021e36f1a33f,"fix(chat): settle turns correctly across replay, resume, and observers (#2383)",https://github.com/cloudflare/agents/commit/efbb005dc42535a6df803fe2afe4021e36f1a33f,packages/agents/src/chat/__tests__/broadcast-state.test.ts;packages/agents/src/chat/__tests__/resume-handshake.test.ts;packages/agents/src/chat/broadcast-state.ts;packages/agents/src/chat/react.tsx;packages/agents/src/chat/replay-frames.ts;packages/agents/src/chat/resumable-stream.ts;packages/agents/src/chat/resume-handshake.ts;packages/agents/src/streams/streams.ts;packages/agents/src/tests/streams/resumable-stream-settlement.test.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/react-tests/use-agent-chat.test.tsx;packages/ai-chat/src/tests/terminal-frame-order.test.ts;packages/ai-chat/src/tests/worker.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/onconnect-broadcast.test.ts;packages/think/src/tests/origin-message-ids.test.ts;packages/think/src/think.ts,.changeset/chat-terminal-frame-fixes.md;.changeset/think-recovering-stream-outcome.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +df2a497cfc142ae4b5ffcf67d882e8bd23ca6f01,fix(chat): harden live stream-error recovery in Think and ai-chat (#2385),https://github.com/cloudflare/agents/commit/df2a497cfc142ae4b5ffcf67d882e8bd23ca6f01,packages/agents/src/chat/__tests__/recovery-engine.test.ts;packages/agents/src/chat/index.ts;packages/agents/src/chat/recovery-engine.ts;packages/agents/src/retries.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/durable-chat-recovery.test.ts;packages/ai-chat/src/tests/worker.ts;packages/think/src/messengers/chat-sdk.ts;packages/think/src/tests/agents/messengers.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/messengers.test.ts;packages/think/src/tests/think-session.test.ts;packages/think/src/think.ts,.changeset/stream-recovery-review-fixes.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +3a3e9ebf15c9b5840371f28d04bb0063e9dd9664,fix(think): submission and turn lifecycle edge cases (#2386),https://github.com/cloudflare/agents/commit/3a3e9ebf15c9b5840371f28d04bb0063e9dd9664,packages/think/src/tests/actions-durable-pause.test.ts;packages/think/src/tests/agents/assistant-agent-loop.ts;packages/think/src/tests/agents/client-tools.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/client-tools.test.ts;packages/think/src/tests/hooks.test.ts;packages/think/src/tests/submissions.test.ts;packages/think/src/tests/ws-web-channel.test.ts;packages/think/src/think.ts,.changeset/think-submission-lifecycle-fixes.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +f9049991fe9ca637b5326788e08e1cea6b4280c1,"fix(agents): agent-tool replay sequencing, re-attach, and fiber recovery (#2384)",https://github.com/cloudflare/agents/commit/f9049991fe9ca637b5326788e08e1cea6b4280c1,packages/agents/src/agent-tool-types.ts;packages/agents/src/chat/__tests__/agent-tools.test.ts;packages/agents/src/chat/agent-tools.ts;packages/agents/src/chat/chunk-size.ts;packages/agents/src/chat/index.ts;packages/agents/src/chat/resumable-stream.ts;packages/agents/src/index.ts;packages/agents/src/react-tests/useAgentToolEvents.test.tsx;packages/agents/src/tests/agent-tool-replay.test.ts;packages/agents/src/tests/agents/agent-tool-replay.ts;packages/agents/src/tests/agents/run-fiber.ts;packages/agents/src/tests/run-fiber.test.ts;packages/agents/src/tests/schema-and-state-optimization.test.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/agent-tools.test.ts;packages/ai-chat/src/tests/worker.ts;packages/think/src/tests/agent-tool-rebind-noop.test.ts;packages/think/src/tests/agent-tools.test.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/think.ts,.changeset/agent-tool-replay-recovery-fixes.md;docs/agents/agent-tools.md;docs/agents/durable-execution.md,package endpoint imported; fork conflicts reconciled,Compose unstored IDs with fork atomic snapshots/live cursor; tail snapshots precede reconciliation awaits. +9f70bc82db11b2a5ee9f5f8f3134991b21d21c55,"fix(think): messenger delivery, prompt truncation and media eviction (#2387)",https://github.com/cloudflare/agents/commit/9f70bc82db11b2a5ee9f5f8f3134991b21d21c55,packages/agents/src/chat-sdk/adapter.ts;packages/agents/src/chat-sdk/types.ts;packages/agents/src/chat/truncate-older-messages.ts;packages/agents/src/tests/agents/chat-sdk.ts;packages/agents/src/tests/chat-sdk.test.ts;packages/agents/src/tests/chat/truncate-older-messages.test.ts;packages/think/src/extensions/hook-proxy.ts;packages/think/src/messengers/chat-sdk.ts;packages/think/src/messengers/delivery.ts;packages/think/src/messengers/events.ts;packages/think/src/tests/agents/extension-hooks.ts;packages/think/src/tests/agents/index.ts;packages/think/src/tests/agents/messengers.ts;packages/think/src/tests/agents/prompt-cache.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/assistant-message-metadata.test.ts;packages/think/src/tests/hooks.test.ts;packages/think/src/tests/messengers.test.ts;packages/think/src/tests/prompt-cache.test.ts;packages/think/src/tests/worker.ts;packages/think/src/tests/wrangler.jsonc;packages/think/src/think.ts,.changeset/think-messenger-prompt-review.md;docs/think/index.md;docs/think/messengers.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +1031c0f5c85f80ce0879dd8b07f151f3293c9120,"fix(think, sandbox-coding-agent): model id validation, ai@7 peer, sandbox cleanup and hardening (#2388)",https://github.com/cloudflare/agents/commit/1031c0f5c85f80ce0879dd8b07f151f3293c9120,packages/think/README.md;packages/think/package.json;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/hooks.test.ts;packages/think/src/think.ts,.changeset/think-ai-v7-peer.md;.changeset/think-invalid-model-id.md;design/rfc-coding-agent.md;examples/sandbox-coding-agent/Dockerfile;examples/sandbox-coding-agent/README.md;examples/sandbox-coding-agent/src/claude-code.ts;examples/sandbox-coding-agent/src/diff.ts;examples/sandbox-coding-agent/src/server.ts,package endpoint imported; fork conflicts reconciled,Adopt AI7/React4 peer floor; keep current maintained dependency policy and optional browser adapter peers. +a8673b7c27ce7593e31c1d993dc8940bfb236bbf,fix(think): keep new recovery metadata keys and stop late typing indicators (#2389),https://github.com/cloudflare/agents/commit/a8673b7c27ce7593e31c1d993dc8940bfb236bbf,packages/think/src/messengers/delivery.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/assistant-message-metadata.test.ts;packages/think/src/tests/messengers.test.ts;packages/think/src/think.ts,.changeset/think-recovery-metadata-typing.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +c55ec80087ba2531ccdc9e211921fb5bf6ddb065,"fix(ai-chat,think): keep a child's stream error across eviction so reconciliation doesn't report success (#2390)",https://github.com/cloudflare/agents/commit/c55ec80087ba2531ccdc9e211921fb5bf6ddb065,packages/agents/src/chat/__tests__/agent-tools.test.ts;packages/agents/src/chat/agent-tools.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/agent-tools.test.ts;packages/ai-chat/src/tests/worker.ts;packages/think/src/tests/agent-tools.test.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/think.ts,.changeset/agent-tool-error-survives-eviction.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +d49aa822608b7a39184b0a3825fdd813c3b6b778,fix(agents): keep parameters and returns in the normalized CDP spec (#2379),https://github.com/cloudflare/agents/commit/d49aa822608b7a39184b0a3825fdd813c3b6b778,packages/agents/src/browser/connector.ts;packages/agents/src/browser/index.ts;packages/agents/src/browser/spec.ts;packages/agents/src/tests/browser-spec-normalize.test.ts,.changeset/cdp-spec-parameters.md;design/browser-tools.md;docs/agents/browse-the-web.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +d3fe93cd968ea4d8e57a909dcbfd56b879df77e0,fix: keep tool input when the approval request arrives before it (#1872) (#2391),https://github.com/cloudflare/agents/commit/d3fe93cd968ea4d8e57a909dcbfd56b879df77e0,packages/agents/src/chat/__tests__/message-builder-approval-input.test.ts;packages/agents/src/chat/index.ts;packages/agents/src/chat/message-builder.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/late-tool-input.test.ts;packages/ai-chat/src/tests/worker.ts;packages/think/src/think.ts,.changeset/approval-tool-input.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +4f2640204adb629fe6bf0143ed43e65fc6a46703,"fix(agents,ai-chat,think): settle approved tool calls that never ran (#2382) (#2392)",https://github.com/cloudflare/agents/commit/4f2640204adb629fe6bf0143ed43e65fc6a46703,packages/agents/src/chat/__tests__/repair-transcript.test.ts;packages/agents/src/chat/repair-transcript.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/stale-approval-repair.test.ts;packages/think/src/tests/client-tools.test.ts;packages/think/src/think.ts,.changeset/stale-approval-repair.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +a7d0e02a2b5cfb651b34f8f7970eed4f172658c6,fix: report continuation turns that fail before streaming (#2381) (#2393),https://github.com/cloudflare/agents/commit/a7d0e02a2b5cfb651b34f8f7970eed4f172658c6,packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/on-stream-end.test.ts;packages/ai-chat/src/tests/worker.ts;packages/think/src/tests/actions-durable-pause.test.ts;packages/think/src/tests/agents/client-tools.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/client-tools.test.ts;packages/think/src/think.ts,.changeset/continuation-prestream-errors.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +e8379676b7f034936730f51153360a3bb8df751c,"fix(agents): useAgentChat follows the socket when the agent name changes (#1864, #1874) (#2394)",https://github.com/cloudflare/agents/commit/e8379676b7f034936730f51153360a3bb8df751c,packages/agents/src/chat/react.tsx;packages/agents/src/react-tests/initial-messages-address-change.test.tsx;packages/agents/src/react-tests/useAgent-address-change.test.tsx;packages/agents/src/react.tsx;packages/agents/src/socket-address.ts;packages/agents/src/tests/agents/callable.ts,.changeset/chat-follows-socket-address.md,package endpoint imported; fork conflicts reconciled,Retire fork requested-address identity reset; preserve hook attachment and remount buffering. +5dbf6c2e6bc99bc27154f8e66043cacb4473d180,fix(x402): enforce cap on selected payment requirement (#2272),https://github.com/cloudflare/agents/commit/5dbf6c2e6bc99bc27154f8e66043cacb4473d180,packages/agents/src/mcp/client/x402.ts;packages/agents/src/x402-tests/client-payment.test.ts;packages/agents/src/x402-tests/x402.test.ts,.changeset/x402-selected-payment-cap.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +c3a401006b482fab061030ac13536e1e0025fd59,fix: allow interfaces as agent props (#2238),https://github.com/cloudflare/agents/commit/c3a401006b482fab061030ac13536e1e0025fd59,packages/agents/src/agent-routing.ts;packages/agents/src/index.ts;packages/agents/src/lifecycle/current-agent.ts;packages/agents/src/lifecycle/durable-object-lifecycle.ts;packages/agents/src/tests-d/agent-props.test-d.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/tests-d/agent-props.test-d.ts;packages/think/src/tests-d/agent-props.test-d.ts;packages/think/src/think.ts,.changeset/quiet-props-relax.md;docs/agents/routing.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +14f7c6a46e6c81492c4e663ada49895187dae9c3,fix(sessions): keep attachment references a rewritten message still points at (#2236),https://github.com/cloudflare/agents/commit/14f7c6a46e6c81492c4e663ada49895187dae9c3,packages/agents/src/sessions/attachment-ingest.ts;packages/agents/src/sessions/core.ts;packages/agents/src/tests/capabilities/sessions.ts;packages/agents/src/tests/sessions/attachments.test.ts,.changeset/sessions-attachment-refs.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +d44b67da8e2e02a722bfc7bca452cb3852bbc771,fix(agents): keep facets out of root-owned host job sync (#2299) (#2398),https://github.com/cloudflare/agents/commit/d44b67da8e2e02a722bfc7bca452cb3852bbc771,packages/agents/src/index.ts;packages/agents/src/tests/agents/sub-agent.ts;packages/agents/src/tests/sub-agent.test.ts;packages/think/src/tests/agents/messengers.ts;packages/think/src/tests/messengers.test.ts,.changeset/facet-host-jobs.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +cbb859b3c5be8c925e836703afd4ef9ee30f8c3c,"fix(agents): one root call per sub-agent broadcast, none without recipients (#2252) (#2399)",https://github.com/cloudflare/agents/commit/cbb859b3c5be8c925e836703afd4ef9ee30f8c3c,packages/agents/src/dynamic-agents/dynamic-agents.ts;packages/agents/src/dynamic-agents/host.ts;packages/agents/src/index.ts;packages/agents/src/tests/agents/sub-agent.ts;packages/agents/src/tests/sub-agent-rpc-bridge.test.ts,.changeset/facet-broadcast-root-calls.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +498bc29e253b18331ac4a0b09ed1723bb375ef42,fix(agents): route WebSockets through sub-agents nested past one level (#2400),https://github.com/cloudflare/agents/commit/498bc29e253b18331ac4a0b09ed1723bb375ef42,packages/agents/src/dynamic-agents/dynamic-agents.ts;packages/agents/src/tests/sub-agent-routing.test.ts,.changeset/nested-sub-agent-websockets.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +218df4aaf443e482f553dfeb0633d204b37752c6,fix(agents): close rejected sub-agent WebSockets instead of failing the handshake (#2118) (#2401),https://github.com/cloudflare/agents/commit/218df4aaf443e482f553dfeb0633d204b37752c6,packages/agents/src/client.ts;packages/agents/src/dynamic-agents/dynamic-agents.ts;packages/agents/src/index.ts;packages/agents/src/react-tests/client.test.ts;packages/agents/src/react-tests/rpc-robustness.test.tsx;packages/agents/src/react.tsx;packages/agents/src/tests/agents/index.ts;packages/agents/src/tests/agents/sub-agent.ts;packages/agents/src/tests/sub-agent-routing.test.ts;packages/agents/src/tests/worker.ts;packages/agents/src/tests/wrangler.jsonc,.changeset/rejected-sub-agent-socket.md;docs/agents/sub-agents.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +01d190e69601d67b8f905f09cf4bf1a78df7b242,fix(agents): resolve ready only after the initial state frame (#2268) (#2402),https://github.com/cloudflare/agents/commit/01d190e69601d67b8f905f09cf4bf1a78df7b242,packages/agents/src/client.ts;packages/agents/src/index.ts;packages/agents/src/react-tests/client.test.ts;packages/agents/src/react-tests/useAgent.test.tsx;packages/agents/src/react.tsx;packages/agents/src/tests/lifecycle/websockets-capability.test.ts;packages/agents/src/tests/protocol-messages.test.ts;packages/agents/src/websockets/options.ts;packages/agents/src/websockets/websockets.ts,.changeset/ready-after-state.md;docs/agents/lifecycle.md;docs/agents/state.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +6b5b4a0156249079b71d69214743c6a055958bef,fix(agents): stop useAgentChat's tool-result cleanup dispatching per chunk (#2217) (#2403),https://github.com/cloudflare/agents/commit/6b5b4a0156249079b71d69214743c6a055958bef,packages/agents/src/chat/react.tsx;packages/agents/src/react-tests/resume-replay-burst.test.tsx;packages/agents/src/react-tests/tool-result-prune-updates.test.tsx,.changeset/tool-result-cleanup-updates.md,package endpoint imported; fork conflicts reconciled,Retire fork result cleanup pre-dispatch guard; use upstream implementation. +9d125c8d75571ccde8abb8c0c75ff343a7ef149a,fix(sessions): share the change-feed mirror between hosts (#2205) (#2404),https://github.com/cloudflare/agents/commit/9d125c8d75571ccde8abb8c0c75ff343a7ef149a,packages/agents/src/sessions/handle.ts;packages/agents/src/sessions/index.ts;packages/agents/src/sessions/mirror.ts;packages/agents/src/tests/sessions/capability.test.ts;packages/ai-chat/src/index.ts;packages/think/src/think.ts,.changeset/session-mirror.md;docs/agents/sessions.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +11f87b5332f6cf4dfff71d8249621b28f539280f,feat(context): remind the model of changed blocks without busting the prompt cache (#2089) (#2405),https://github.com/cloudflare/agents/commit/11f87b5332f6cf4dfff71d8249621b28f539280f,packages/agents/src/context/blocks.ts;packages/agents/src/tests/context/context.test.ts;packages/think/src/tests/agents/prompt-cache.ts;packages/think/src/tests/prompt-cache.test.ts;packages/think/src/think.ts,.changeset/context-reminders.md;docs/agents/context.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +6c8f85a571802881e5e380ecce03eb24d6fb5f71,"fix(think,ai-chat): raise agents peer floor to >=0.25.0 (#2408)",https://github.com/cloudflare/agents/commit/6c8f85a571802881e5e380ecce03eb24d6fb5f71,packages/ai-chat/package.json;packages/think/package.json,.changeset/chat-agents-peer-025.md,package endpoint imported; fork conflicts reconciled,Adopt agents>=0.25 peer floor for Think and AI Chat. +c2f767235e749cb3f6334ed22e70a03940dcd18c,fix(agents): initialize cold native RPC calls (#2005),https://github.com/cloudflare/agents/commit/c2f767235e749cb3f6334ed22e70a03940dcd18c,packages/agents/src/dynamic-agents/dynamic-agents.ts;packages/agents/src/index.ts;packages/agents/src/lifecycle/UPSTREAM.md;packages/agents/src/lifecycle/capability.ts;packages/agents/src/lifecycle/durable-object-lifecycle.ts;packages/agents/src/tests/agents-core-eviction.test.ts;packages/agents/src/tests/agents/index.ts;packages/agents/src/tests/agents/native-rpc.ts;packages/agents/src/tests/capabilities/lifecycle.ts;packages/agents/src/tests/lifecycle/startup.test.ts;packages/agents/src/tests/mcp/create-oauth-provider.test.ts;packages/agents/src/tests/mcp/do-oauth-client-provider.test.ts;packages/agents/src/tests/mcp/wait-connections-e2e.test.ts;packages/agents/src/tests/native-rpc-initialization.test.ts;packages/agents/src/tests/run-fiber.test.ts;packages/agents/src/tests/worker.ts;packages/agents/src/tests/wrangler.jsonc;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/cold-rpc-initialization.test.ts;packages/think/src/think.ts,.changeset/cold-rpc-starts-think.md;design/AGENTS.md;design/durable-object-lifecycle.md;design/rfc-cold-rpc-initialization.md;design/test-coverage-matrix.md;docs/agents/lifecycle.md,package endpoint imported; fork conflicts reconciled,Adopt cold RPC initialization; preserve async-function classification through runtime browser transform. +2afe0e0ba9eb91605adb0bcac289e9df8a723aa7,fix(chat): reconcile reused tool-call IDs one-to-one (#2040),https://github.com/cloudflare/agents/commit/2afe0e0ba9eb91605adb0bcac289e9df8a723aa7,packages/agents/src/chat/__tests__/message-reconciler.test.ts;packages/agents/src/chat/message-reconciler.ts;packages/ai-chat/src/index.ts;packages/ai-chat/src/tests/client-tool-duplicate-message.test.ts;packages/think/src/tests/actions-durable-pause.test.ts;packages/think/src/tests/agents/client-tools.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/message-reconciliation.test.ts;packages/think/src/think.ts,.changeset/quiet-tools-reconcile.md,package endpoint imported; fork conflicts reconciled,Adopt one-to-one tool-call reconciliation; keep existing-row assistant content server-authoritative. +040db5c9342d74c84340858f04fd5410f84ff4f8,Fix/1984 synthetic compaction (#2036),https://github.com/cloudflare/agents/commit/040db5c9342d74c84340858f04fd5410f84ff4f8,packages/agents/src/sessions/core.ts;packages/agents/src/sessions/handle.ts;packages/agents/src/tests/sessions/capability.test.ts;packages/agents/src/tests/sessions/migration.test.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/think-session.test.ts,.changeset/compaction-overlay-echo.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +20142e52901ddbbb0d940ecef0e82ec9e7d01cab,fix(think): arm declared scheduled tasks on the root agent only (#2056),https://github.com/cloudflare/agents/commit/20142e52901ddbbb0d940ecef0e82ec9e7d01cab,packages/think/README.md;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/scheduled-tasks.test.ts;packages/think/src/tests/think-eviction.test.ts;packages/think/src/think.ts,.changeset/think-scheduled-tasks-root-scope.md;docs/think/index.md;docs/think/sub-agents.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +d5562e0f2ee31be049ccf2d86c3cb58de20ee9d4,fix: #2013 - correctly invoke controller.error during mid-stream closure and update tests accordingly (#2019),https://github.com/cloudflare/agents/commit/d5562e0f2ee31be049ccf2d86c3cb58de20ee9d4,packages/agents/src/chat/ws-chat-transport.ts;packages/agents/src/react-tests/resume-replay-burst.test.tsx;packages/ai-chat/src/react-tests/use-agent-chat.test.tsx;packages/ai-chat/src/tests/ws-transport-resume.test.ts,.changeset/common-snails-smoke.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +c658b832d5aa32c45b64b7748aac1c02ea370003,fix(agents): preserve optimistic send dropped on reconnect (#1983) (#2039),https://github.com/cloudflare/agents/commit/c658b832d5aa32c45b64b7748aac1c02ea370003,packages/agents/src/chat/react.tsx;packages/agents/src/chat/wire-types.ts;packages/agents/src/chat/ws-chat-transport.ts;packages/agents/src/react-tests/reconnect-optimistic-send.test.tsx;packages/think/src/tests/onconnect-broadcast.test.ts;packages/think/src/think.ts,.changeset/reconnect-optimistic-send.md;.changeset/think-connect-transcript-marker.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +310c3433f2a250a41cbb9208188499bd60a5f4d2,fix(agents): stop deleteSubAgent from being reversed by a stale sub-agent socket (#2024),https://github.com/cloudflare/agents/commit/310c3433f2a250a41cbb9208188499bd60a5f4d2,packages/agents/src/dynamic-agents/dynamic-agents.ts;packages/agents/src/dynamic-agents/types.ts;packages/agents/src/index.ts;packages/agents/src/tests/agents/sub-agent.ts;packages/agents/src/tests/sub-agent.test.ts,.changeset/tricky-buckets-relate.md,package endpoint imported; fork conflicts reconciled,Adopt upstream noncreating deleted-facet lookup/socket close; retain consumed dropped-connect gate guard. +9bddf2ca994d1c207b10bf0ed192d20c03c1d0d3,test(agents): regression tests for nested sub-agent WebSockets (#2026) (#2096),https://github.com/cloudflare/agents/commit/9bddf2ca994d1c207b10bf0ed192d20c03c1d0d3,packages/agents/src/tests/spike-sub-agent-routing.test.ts,,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +bcb1f12f48a9511dcc368da8cf63fe1dba3330eb,fix(think): regenerate answers the parent user message instead of continuing (#2028) (#2413),https://github.com/cloudflare/agents/commit/bcb1f12f48a9511dcc368da8cf63fe1dba3330eb,packages/think/src/tests/agents/client-tools.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/client-tools.test.ts;packages/think/src/tests/think-session.test.ts;packages/think/src/think.ts,.changeset/think-regenerate-from-parent.md,package endpoint imported; fork conflicts reconciled,Adopt regeneration against parent user message; retain Stop epoch checks in recovered retry/continue. +484f7abbe7cca5261435eafb97bf4ea99cb35fb1,fix(think): forward nativeStreaming to the Telegram adapter and allow Think-verified webhooks (#2397) (#2414),https://github.com/cloudflare/agents/commit/484f7abbe7cca5261435eafb97bf4ea99cb35fb1,packages/think/src/messengers/telegram.ts;packages/think/src/tests/telegram-messenger.test.ts,.changeset/think-telegram-native-streaming.md;docs/think/messengers.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +c2a7bc549eff55bce000f586ab37c283d435ac6f,docs(think): multi-chat guide and refresh Think design docs (#2409),https://github.com/cloudflare/agents/commit/c2a7bc549eff55bce000f586ab37c283d435ac6f,packages/think/src/think.ts,design/AGENTS.md;design/README.md;design/chat-api.md;design/chat-improvements.md;design/chat-shared-layer.md;design/sessions.md;design/sub-agent-routing.md;design/think-roadmap.md;design/think-vs-aichat.md;design/think.md;docs/think/index.md;docs/think/multi-chat.md;examples/assistant/agents/assistant/agents/my-assistant/agent.ts,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +99068812e5e91f039a15d0848e8e0bdf27177158,"fix(think,agents): keep a restart-interrupted regeneration on its own branch (#2417)",https://github.com/cloudflare/agents/commit/99068812e5e91f039a15d0848e8e0bdf27177158,packages/agents/src/chat/resumable-stream.ts;packages/agents/src/tests/streams/resumable-stream-settlement.test.ts;packages/think/src/tests/agents/client-tools.ts;packages/think/src/tests/agents/think-session.ts;packages/think/src/tests/client-tools.test.ts;packages/think/src/tests/think-session.test.ts;packages/think/src/think.ts,.changeset/think-regenerate-partial-restart.md;docs/think/index.md,package endpoint imported; fork conflicts reconciled,Adopt branch-aware interrupted regeneration; drop fork unified recovery helper in favor of separate upstream paths. +040458edb8f2c87a25e5ac446709054a5f553e14,perf(sessions): decide an update from a stored content digest (#2231),https://github.com/cloudflare/agents/commit/040458edb8f2c87a25e5ac446709054a5f553e14,packages/agents/src/sessions/core.ts;packages/agents/src/tests/capabilities/sessions.ts;packages/agents/src/tests/sessions/capability.test.ts;packages/agents/src/tests/sessions/storage-ops-bench.test.ts,.changeset/sessions-update-content-digest.md,package endpoint imported; fork conflicts reconciled,Adopt nullable content digest/cache; preserve fork timestamps and fix legacy cache fallback comparison. +3c6a1d08a169ee3df131a91c877218c77ee24968,feat(examples): host pi-durable in the pi harness example (#2419),https://github.com/cloudflare/agents/commit/3c6a1d08a169ee3df131a91c877218c77ee24968,,design/AGENTS.md;design/README.md;design/rfc-pi-harness-example.md;examples/next/harnesses/pi/NOTES.md;examples/next/harnesses/pi/README.md;examples/next/harnesses/pi/package.json;examples/next/harnesses/pi/src/client.tsx;examples/next/harnesses/pi/src/harness/do-sqlite.ts;examples/next/harnesses/pi/src/harness/events.ts;examples/next/harnesses/pi/src/harness/intake.ts;examples/next/harnesses/pi/src/harness/messages.ts;examples/next/harnesses/pi/src/harness/pi-harness.ts;examples/next/harnesses/pi/src/harness/session-store.ts;examples/next/harnesses/pi/src/harness/skills.ts;examples/next/harnesses/pi/src/harness/transport.ts;examples/next/harnesses/pi/src/harness/types.ts;examples/next/harnesses/pi/src/protocol.ts;examples/next/harnesses/pi/src/providers/models.ts;examples/next/harnesses/pi/src/providers/workers-ai.ts;examples/next/harnesses/pi/src/server.ts;examples/next/harnesses/pi/src/sockets.ts;examples/next/harnesses/pi/src/tests/cloudflare-test.d.ts;examples/next/harnesses/pi/src/tests/harness.test.ts;examples/next/harnesses/pi/src/tests/session-store.test.ts;examples/next/harnesses/pi/src/tests/sockets.test.ts;examples/next/harnesses/pi/src/tests/vitest.config.ts;examples/next/harnesses/pi/src/tests/worker.ts;examples/next/harnesses/pi/src/tests/wrangler.jsonc;examples/next/harnesses/pi/src/use-pi-session.ts;examples/next/harnesses/pi/src/view.ts;examples/next/harnesses/pi/tsconfig.json;examples/next/harnesses/pi/vendor/pi-dev/README.md;examples/next/harnesses/pi/vendor/pi-dev/SHA256SUMS;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-chord-0.84.4.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-chord-0.99.1.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-pi-agent-core-0.84.4.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-pi-ai-0.84.4.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-pi-ai-0.99.1.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-pi-durable-0.99.1.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-pi-session-backend-sqlite-node-0.84.4.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-pi-telemetry-0.84.4.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-pi-telemetry-0.99.1.tgz;examples/next/harnesses/pi/vendor/pi-dev/pack.mjs;examples/next/harnesses/pi/vite.config.ts;pnpm-lock.yaml,outside retained package closure,Reviewed repository-level change; examples/docs/CI/changesets are not vendored as package source. Relevant release effects appear in final package manifests/changelogs. +833c5cb135a9fb7a4f994da66771b95b3e7e5c50,refactor(agents): rename CdpSession to CdpConnection (#2410),https://github.com/cloudflare/agents/commit/833c5cb135a9fb7a4f994da66771b95b3e7e5c50,packages/agents/AGENTS.md;packages/agents/src/browser/browser-run.ts;packages/agents/src/browser/cdp-connection.ts;packages/agents/src/browser/cdp-session.ts;packages/agents/src/browser/connector.ts;packages/agents/src/browser/index.ts;packages/agents/src/browser/session-core.ts;packages/agents/src/tests/browser-connector.test.ts,.changeset/browser-session-guardrails.md;.changeset/cdp-connection-rename.md;docs/agents/browse-the-web.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +9c2d3bfedddb3021811dcfe187052a4e6186b1d3,refactor(agents): collapse named browser sessions into one Browser class (#2411),https://github.com/cloudflare/agents/commit/9c2d3bfedddb3021811dcfe187052a4e6186b1d3,packages/agents/AGENTS.md;packages/agents/src/browser-tests/worker.ts;packages/agents/src/browser/ai.ts;packages/agents/src/browser/browser-run.ts;packages/agents/src/browser/browser.ts;packages/agents/src/browser/capability.ts;packages/agents/src/browser/connector.ts;packages/agents/src/browser/index.ts;packages/agents/src/browser/live-view.ts;packages/agents/src/browser/session-core.ts;packages/agents/src/browser/session-manager.ts;packages/agents/src/browser/session-store.ts;packages/agents/src/tests-d/browser-engine-options.test-d.ts;packages/agents/src/tests/agents/browser.ts;packages/agents/src/tests/browser-capability.test.ts;packages/agents/src/tests/browser-connector.test.ts;packages/agents/src/tests/browser-session-core.test.ts;packages/agents/src/tests/browser.test.ts;packages/agents/src/tests/capabilities/browser.ts,design/AGENTS.md;design/browser-sessions.md;design/browser-tools.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +ed4f5ab68a64fae48a148699e3f9955590743131,fix(agents): retry connect() when the browser expires mid-connect (#2368),https://github.com/cloudflare/agents/commit/ed4f5ab68a64fae48a148699e3f9955590743131,packages/agents/src/browser/browser-run.ts;packages/agents/src/browser/browser.ts;packages/agents/src/tests/browser.test.ts,.changeset/browser-connect-upgrade-status.md;design/browser-sessions.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +9b70fdbfeb8ebebfda1f1dfc2628cceece8b39d5,refactor(agents): share connector validation and load the CDP spec from a live session (#2369),https://github.com/cloudflare/agents/commit/9b70fdbfeb8ebebfda1f1dfc2628cceece8b39d5,packages/agents/src/browser/connector-validation.ts;packages/agents/src/browser/connector.ts;packages/agents/src/browser/spec.ts;packages/agents/src/tests/browser-spec.test.ts,.changeset/browser-cdp-spec-session.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +a09f88cee84e05ca007e9499f2c96b81c05d556c,feat(agents): add active-tab tracking and spec() to named browsers (#2370),https://github.com/cloudflare/agents/commit/a09f88cee84e05ca007e9499f2c96b81c05d556c,packages/agents/src/browser/browser.ts;packages/agents/src/browser/session-store.ts;packages/agents/src/tests/browser.test.ts,design/browser-sessions.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +9cddcd3e7687177dca9c10c6569473edcb0f51ed,feat(agents): add BrowserSessionConnector for persistent named browsers (#2371),https://github.com/cloudflare/agents/commit/9cddcd3e7687177dca9c10c6569473edcb0f51ed,packages/agents/src/browser-tests/browser.test.ts;packages/agents/src/browser-tests/worker.ts;packages/agents/src/browser/cdp-connection.ts;packages/agents/src/browser/connector.ts;packages/agents/src/browser/session-connector.ts;packages/agents/src/tests/browser-connector.test.ts;packages/agents/src/tests/browser-session-connector.test.ts,.changeset/cdp-connection-closed-socket.md;design/browser-tools.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +6e1c3467338b092da04a058594cd47fca13556db,feat(agents): add browserTool and export Browser for a persistent browser (#2372),https://github.com/cloudflare/agents/commit/6e1c3467338b092da04a058594cd47fca13556db,packages/agents/src/browser/ai.ts;packages/agents/src/browser/index.ts;packages/agents/src/tests-d/browser-tool.test-d.ts;packages/agents/src/tests/agents/browser.ts;packages/agents/src/tests/browser-capability.test.ts;packages/agents/src/tests/capabilities/browser.ts;packages/agents/src/tests/worker.ts;packages/agents/src/tests/wrangler.jsonc,.changeset/browser-tool.md;design/AGENTS.md;design/browser-sessions.md;design/browser-tools.md;docs/agents/browse-the-web.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +b20fe47e2d9e57356523618efde6c2fa0fa0bd4d,refactor(agents): move browserTool to agents/browser/ai-sdk (#2426),https://github.com/cloudflare/agents/commit/b20fe47e2d9e57356523618efde6c2fa0fa0bd4d,packages/agents/AGENTS.md;packages/agents/package.json;packages/agents/scripts/build.ts;packages/agents/src/browser/ai-sdk.ts;packages/agents/src/browser/ai.ts;packages/agents/src/browser/tool-helpers.ts;packages/agents/src/tests-d/browser-tool.test-d.ts;packages/agents/src/tests/agents/browser.ts,.changeset/browser-tool.md;docs/agents/browse-the-web.md,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +0c29717194eed148cb9d8b51dee840bfc02912f8,Use published Pi version and clean up the PiHarness options (#2423),https://github.com/cloudflare/agents/commit/0c29717194eed148cb9d8b51dee840bfc02912f8,,.changeset/worker-bundler-keep-wheel-metadata.md;examples/next/harnesses/pi/NOTES.md;examples/next/harnesses/pi/README.md;examples/next/harnesses/pi/package.json;examples/next/harnesses/pi/src/harness/messages.ts;examples/next/harnesses/pi/src/harness/pi-harness.ts;examples/next/harnesses/pi/src/harness/skills.ts;examples/next/harnesses/pi/src/harness/types.ts;examples/next/harnesses/pi/src/protocol.ts;examples/next/harnesses/pi/src/server.ts;examples/next/harnesses/pi/src/sockets.ts;examples/next/harnesses/pi/src/tests/cloudflare-test.d.ts;examples/next/harnesses/pi/src/tests/options.test.ts;examples/next/harnesses/pi/src/tests/vitest.config.ts;examples/next/harnesses/pi/src/tests/worker.ts;examples/next/harnesses/pi/src/tests/wrangler.jsonc;examples/next/harnesses/pi/vendor/pi-dev/README.md;examples/next/harnesses/pi/vendor/pi-dev/SHA256SUMS;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-chord-0.99.1.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-pi-ai-0.99.1.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-pi-durable-0.99.1.tgz;examples/next/harnesses/pi/vendor/pi-dev/earendil-works-pi-telemetry-0.99.1.tgz;examples/next/harnesses/pi/vendor/pi-dev/pack.mjs;experimental/pi-recovery/package.json;packages/worker-bundler/src/installer-python.ts;pnpm-lock.yaml;pnpm-workspace.yaml,outside retained package closure,Reviewed repository-level change; examples/docs/CI/changesets are not vendored as package source. Relevant release effects appear in final package manifests/changelogs. +e780214e9ed9850be21b1fc8c947aba97f6b6e6b,feat(agents): add TanStack AI browserTool for a persistent browser (#2428),https://github.com/cloudflare/agents/commit/e780214e9ed9850be21b1fc8c947aba97f6b6e6b,packages/agents/AGENTS.md;packages/agents/src/browser/ai-sdk.ts;packages/agents/src/browser/browser-tool.ts;packages/agents/src/browser/tanstack-ai.ts;packages/agents/src/browser/tool-helpers.ts;packages/agents/src/tests-d/browser-tool.test-d.ts;packages/agents/src/tests/agents/browser.ts;packages/agents/src/tests/browser-capability.test.ts;packages/codemode/src/proxy-tool.ts,.changeset/codemode-standard-schema-types.md;.changeset/tanstack-browser-tool.md;docs/agents/browse-the-web.md,package endpoint imported; fork conflicts reconciled,Import TanStack browser adapter; type JSON-schema input and literal tool name for maintained TanStack0.54. +7ae3c9488dbc26ce47fc7c9e40d1eaeb73e7efdf,feat(agents): add the framework-neutral model core (#2445),https://github.com/cloudflare/agents/commit/7ae3c9488dbc26ce47fc7c9e40d1eaeb73e7efdf,packages/agents/AGENTS.md;packages/agents/src/models/core/catalog.ts;packages/agents/src/models/core/chat-completions/index.ts;packages/agents/src/models/core/chat-completions/quirks.ts;packages/agents/src/models/core/chat-completions/request.ts;packages/agents/src/models/core/chat-completions/response.ts;packages/agents/src/models/core/chat-completions/stream.ts;packages/agents/src/models/core/errors.ts;packages/agents/src/models/core/gateway-providers.ts;packages/agents/src/models/core/images.ts;packages/agents/src/models/core/settings.ts;packages/agents/src/models/core/sse.ts;packages/agents/src/models/core/transport.ts;packages/agents/src/tests/models/core/chat-completions.test.ts;packages/agents/src/tests/models/core/gateway-providers.test.ts;packages/agents/src/tests/models/core/settings.test.ts;packages/agents/src/tests/models/core/transport.test.ts,,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +5cf86f8cd6117843de45f41f10a7cc4cdc27340b,feat(agents): add experimental agents/models/pi-ai (#2446),https://github.com/cloudflare/agents/commit/5cf86f8cd6117843de45f41f10a7cc4cdc27340b,packages/agents/AGENTS.md;packages/agents/package.json;packages/agents/scripts/build.ts;packages/agents/src/models/pi-ai/catalog.ts;packages/agents/src/models/pi-ai/errors.ts;packages/agents/src/models/pi-ai/index.ts;packages/agents/src/models/pi-ai/models/fallback.ts;packages/agents/src/models/pi-ai/models/image.ts;packages/agents/src/models/pi-ai/models/language.ts;packages/agents/src/models/pi-ai/routing.ts;packages/agents/src/models/pi-ai/settings.ts;packages/agents/src/models/pi-ai/wires/anthropic.ts;packages/agents/src/models/pi-ai/wires/chat-completions.ts;packages/agents/src/models/pi-ai/wires/responses.ts;packages/agents/src/models/pi-ai/wires/shared.ts;packages/agents/src/tests/models/pi-ai/anthropic.test.ts;packages/agents/src/tests/models/pi-ai/completions.test.ts;packages/agents/src/tests/models/pi-ai/fallback-and-provider.test.ts;packages/agents/src/tests/models/pi-ai/gateway.test.ts;packages/agents/src/tests/models/pi-ai/helpers.ts;packages/agents/src/tests/models/pi-ai/images.test.ts;packages/agents/src/tests/models/pi-ai/responses.test.ts;packages/agents/src/tests/models/pi-ai/stream-fn.test.ts,.changeset/agents-models-pi-ai.md;docs/agents/index.md;docs/agents/models-pi-ai.md;examples/next/harnesses/pi/README.md;examples/next/harnesses/pi/src/providers/models.ts;examples/next/harnesses/pi/src/providers/workers-ai.ts;examples/next/harnesses/pi/src/server.ts;examples/next/harnesses/pi/src/tests/worker.ts;pnpm-lock.yaml,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +54f9ca793e75f627c4ab33a8ee15df526770883d,feat(agents): add experimental agents/models/ai-sdk (#2448),https://github.com/cloudflare/agents/commit/54f9ca793e75f627c4ab33a8ee15df526770883d,packages/agents/AGENTS.md;packages/agents/package.json;packages/agents/scripts/build.ts;packages/agents/src/models/ai-sdk/errors.ts;packages/agents/src/models/ai-sdk/index.ts;packages/agents/src/models/ai-sdk/models/embedding.ts;packages/agents/src/models/ai-sdk/models/fallback.ts;packages/agents/src/models/ai-sdk/models/gateway.ts;packages/agents/src/models/ai-sdk/models/image.ts;packages/agents/src/models/ai-sdk/models/language.ts;packages/agents/src/models/ai-sdk/models/modality.ts;packages/agents/src/models/ai-sdk/models/reranking.ts;packages/agents/src/models/ai-sdk/models/speech.ts;packages/agents/src/models/ai-sdk/models/transcription.ts;packages/agents/src/models/ai-sdk/settings.ts;packages/agents/src/models/ai-sdk/transport.ts;packages/agents/src/models/ai-sdk/wires/chat-completions.ts;packages/agents/src/models/ai-sdk/wires/shared.ts;packages/agents/src/tests/models/ai-sdk/chat-completions-wire.test.ts;packages/agents/src/tests/models/ai-sdk/embedding.test.ts;packages/agents/src/tests/models/ai-sdk/fallback-and-errors.test.ts;packages/agents/src/tests/models/ai-sdk/gateway.test.ts;packages/agents/src/tests/models/ai-sdk/helpers.ts;packages/agents/src/tests/models/ai-sdk/modalities.test.ts;packages/agents/src/tests/models/ai-sdk/options-and-metadata.test.ts;packages/agents/src/tests/models/ai-sdk/transport.test.ts;packages/agents/src/tests/models/ai-sdk/workers-ai.test.ts;packages/agents/src/tests/models/core/catalog.test.ts,.changeset/agents-models-ai-sdk.md;docs/agents/index.md;docs/agents/models-pi-ai.md;docs/agents/models.md;examples/next/README.md;examples/next/models/README.md;examples/next/models/env.d.ts;examples/next/models/package.json;examples/next/models/src/index.ts;examples/next/models/src/pi.ts;examples/next/models/tsconfig.json;examples/next/models/wrangler.jsonc;pnpm-lock.yaml;scripts/use-ai-sdk-major.mjs,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +1e54cf19d747f122c141e0eb323226ec8b4d4865,feat(agents): add experimental agents/harnesses/pi (#2424),https://github.com/cloudflare/agents/commit/1e54cf19d747f122c141e0eb323226ec8b4d4865,packages/agents/AGENTS.md;packages/agents/package.json;packages/agents/scripts/build.ts;packages/agents/src/harnesses/pi/context.ts;packages/agents/src/harnesses/pi/harness.ts;packages/agents/src/harnesses/pi/index.ts;packages/agents/src/harnesses/pi/session-store.ts;packages/agents/src/harnesses/pi/skills.ts;packages/agents/src/harnesses/pi/tests/env.d.ts;packages/agents/src/harnesses/pi/tests/harness.test.ts;packages/agents/src/harnesses/pi/tests/options.test.ts;packages/agents/src/harnesses/pi/tests/session-store.test.ts;packages/agents/src/harnesses/pi/tests/tsconfig.json;packages/agents/src/harnesses/pi/tests/vitest.config.ts;packages/agents/src/harnesses/pi/tests/worker.ts;packages/agents/src/harnesses/pi/tests/wrangler.jsonc;packages/agents/src/harnesses/pi/types.ts;packages/agents/tsconfig.json;packages/agents/vitest.config.ts,.changeset/agents-pi-harness.md;examples/next/harnesses/pi/NOTES.md;examples/next/harnesses/pi/README.md;examples/next/harnesses/pi/src/harness/messages.ts;examples/next/harnesses/pi/src/harness/pi-harness.ts;examples/next/harnesses/pi/src/harness/session-store.ts;examples/next/harnesses/pi/src/harness/skills.ts;examples/next/harnesses/pi/src/harness/types.ts;examples/next/harnesses/pi/src/protocol.ts;examples/next/harnesses/pi/src/server.ts;examples/next/harnesses/pi/src/sockets.ts;examples/next/harnesses/pi/src/tests/cloudflare-test.d.ts;examples/next/harnesses/pi/src/tests/harness.test.ts;examples/next/harnesses/pi/src/tests/options.test.ts;examples/next/harnesses/pi/src/tests/session-store.test.ts;examples/next/harnesses/pi/src/tests/view.test.ts;examples/next/harnesses/pi/src/tests/worker.ts;examples/next/harnesses/pi/src/tests/wrangler.jsonc;examples/next/harnesses/pi/src/transcript.ts;examples/next/harnesses/pi/src/view.ts;pnpm-lock.yaml,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +9c57343a826bd917a24ee771bcb496f78dc4430a,docs: document pi harness and SDK edge cases,https://github.com/cloudflare/agents/commit/9c57343a826bd917a24ee771bcb496f78dc4430a,,docs/agents/browse-the-web.md;docs/agents/chat-agents.md;docs/agents/harnesses/pi.md;docs/agents/human-in-the-loop.md;docs/agents/index.md;docs/agents/lifecycle.md;docs/codemode/index.md,outside retained package closure,Reviewed repository-level change; examples/docs/CI/changesets are not vendored as package source. Relevant release effects appear in final package manifests/changelogs. +0a8209df0c29810785b28428d5d1a203740d2163,changesets: summarize entries and correct bumps,https://github.com/cloudflare/agents/commit/0a8209df0c29810785b28428d5d1a203740d2163,,.changeset/agent-tool-error-survives-eviction.md;.changeset/agent-tool-replay-recovery-fixes.md;.changeset/agent-tool-terminal-delivery.md;.changeset/agents-models-ai-sdk.md;.changeset/agents-pi-harness.md;.changeset/ai-chat-persist-before-done.md;.changeset/ai-chat-stale-post-stream-continuation.md;.changeset/ai-chat-transient-reader-recovery.md;.changeset/approval-tool-input.md;.changeset/browser-cdp-spec-session.md;.changeset/browser-connect-upgrade-status.md;.changeset/browser-session-guardrails.md;.changeset/browser-tool.md;.changeset/calm-tools-think.md;.changeset/cdp-connection-closed-socket.md;.changeset/cdp-spec-parameters.md;.changeset/chat-agents-peer-025.md;.changeset/chat-follows-socket-address.md;.changeset/chat-turn-end-outcome.md;.changeset/codemode-standard-schema-types.md;.changeset/cold-rpc-starts-think.md;.changeset/common-snails-smoke.md;.changeset/compaction-overlay-echo.md;.changeset/context-reminders.md;.changeset/continuation-prestream-errors.md;.changeset/facet-broadcast-root-calls.md;.changeset/facet-host-jobs.md;.changeset/messenger-attachment-arraybuffer.md;.changeset/messenger-burst-skipped.md;.changeset/messenger-no-placeholder-post.md;.changeset/messenger-recovered-delivery.md;.changeset/nested-sub-agent-websockets.md;.changeset/observer-snapshot-heal.md;.changeset/on-tool-call-after-stream.md;.changeset/quiet-agents-pause.md;.changeset/quiet-props-relax.md;.changeset/quiet-tools-reconcile.md;.changeset/ready-after-state.md;.changeset/reconnect-optimistic-send.md;.changeset/recovery-work-unit-docs.md;.changeset/rejected-sub-agent-socket.md;.changeset/replay-chunk-seq.md;.changeset/response-hook-after-reset.md;.changeset/run-fiber-completed-cleanup.md;.changeset/session-mirror.md;.changeset/sessions-attachment-refs.md;.changeset/sessions-update-content-digest.md;.changeset/stale-approval-repair.md;.changeset/think-ai-v7-peer.md;.changeset/think-assistant-message-metadata.md;.changeset/think-continuation-accumulator.md;.changeset/think-drop-pending-pause-text.md;.changeset/think-gateway-options.md;.changeset/think-invalid-model-id.md;.changeset/think-messenger-concurrency.md;.changeset/think-messenger-prompt-review.md;.changeset/think-regenerate-from-parent.md;.changeset/think-regenerate-partial-restart.md;.changeset/think-scheduled-tasks-root-scope.md;.changeset/think-stable-truncation-prefix.md;.changeset/think-stall-recovery-retry.md;.changeset/think-structured-turn-recovery.md;.changeset/think-submission-wait.md;.changeset/think-telegram-native-streaming.md;.changeset/think-turn-identity.md;.changeset/think-ws-web-channel.md;.changeset/tool-result-cleanup-updates.md;.changeset/trace-tool-payload-redaction.md;.changeset/transient-stream-recovery.md;.changeset/tricky-buckets-relate.md;.changeset/truncate-model-tool-results.md;.changeset/turn-owned-wait-results.md;.changeset/turn-result-output.md;.changeset/worker-bundler-keep-wheel-metadata.md;.changeset/x402-selected-payment-cap.md,outside retained package closure,Reviewed repository-level change; examples/docs/CI/changesets are not vendored as package source. Relevant release effects appear in final package manifests/changelogs. +4d0e145a114df7435411a1e73d375b61cb4214ce,changesets: drop redundant follow-up entries,https://github.com/cloudflare/agents/commit/4d0e145a114df7435411a1e73d375b61cb4214ce,,.changeset/cdp-connection-rename.md;.changeset/chat-terminal-frame-fixes.md;.changeset/stream-recovery-review-fixes.md;.changeset/tanstack-browser-tool.md;.changeset/terminal-frame-message-ids.md;.changeset/think-connect-transcript-marker.md;.changeset/think-persist-before-done.md;.changeset/think-recovering-stream-outcome.md;.changeset/think-recovery-metadata-typing.md;.changeset/think-submission-lifecycle-fixes.md,outside retained package closure,Reviewed repository-level change; examples/docs/CI/changesets are not vendored as package source. Relevant release effects appear in final package manifests/changelogs. +995ed8b2d82e4cdf229e14b3601013a86c4f3a6b,Version Packages,https://github.com/cloudflare/agents/commit/995ed8b2d82e4cdf229e14b3601013a86c4f3a6b,packages/agents/CHANGELOG.md;packages/agents/package.json;packages/ai-chat/CHANGELOG.md;packages/ai-chat/package.json;packages/codemode/CHANGELOG.md;packages/codemode/package.json;packages/think/CHANGELOG.md;packages/think/package.json,.changeset/agent-tool-error-survives-eviction.md;.changeset/agent-tool-replay-recovery-fixes.md;.changeset/agent-tool-terminal-delivery.md;.changeset/agents-models-ai-sdk.md;.changeset/agents-models-pi-ai.md;.changeset/agents-pi-harness.md;.changeset/ai-chat-persist-before-done.md;.changeset/ai-chat-stale-post-stream-continuation.md;.changeset/ai-chat-transient-reader-recovery.md;.changeset/approval-tool-input.md;.changeset/browser-cdp-spec-session.md;.changeset/browser-connect-upgrade-status.md;.changeset/browser-session-guardrails.md;.changeset/browser-tool.md;.changeset/calm-tools-think.md;.changeset/cdp-connection-closed-socket.md;.changeset/cdp-spec-parameters.md;.changeset/chat-agents-peer-025.md;.changeset/chat-follows-socket-address.md;.changeset/chat-turn-end-outcome.md;.changeset/codemode-standard-schema-types.md;.changeset/cold-rpc-starts-think.md;.changeset/common-snails-smoke.md;.changeset/compaction-overlay-echo.md;.changeset/context-reminders.md;.changeset/continuation-prestream-errors.md;.changeset/facet-broadcast-root-calls.md;.changeset/facet-host-jobs.md;.changeset/messenger-attachment-arraybuffer.md;.changeset/messenger-burst-skipped.md;.changeset/messenger-no-placeholder-post.md;.changeset/messenger-recovered-delivery.md;.changeset/nested-sub-agent-websockets.md;.changeset/observer-snapshot-heal.md;.changeset/on-tool-call-after-stream.md;.changeset/quiet-agents-pause.md;.changeset/quiet-props-relax.md;.changeset/quiet-tools-reconcile.md;.changeset/ready-after-state.md;.changeset/reconnect-optimistic-send.md;.changeset/recovery-work-unit-docs.md;.changeset/rejected-sub-agent-socket.md;.changeset/replay-chunk-seq.md;.changeset/response-hook-after-reset.md;.changeset/run-fiber-completed-cleanup.md;.changeset/session-mirror.md;.changeset/sessions-attachment-refs.md;.changeset/sessions-update-content-digest.md;.changeset/stale-approval-repair.md;.changeset/think-ai-v7-peer.md;.changeset/think-assistant-message-metadata.md;.changeset/think-continuation-accumulator.md;.changeset/think-drop-pending-pause-text.md;.changeset/think-gateway-options.md;.changeset/think-invalid-model-id.md;.changeset/think-messenger-concurrency.md;.changeset/think-messenger-prompt-review.md;.changeset/think-regenerate-from-parent.md;.changeset/think-regenerate-partial-restart.md;.changeset/think-scheduled-tasks-root-scope.md;.changeset/think-stable-truncation-prefix.md;.changeset/think-stall-recovery-retry.md;.changeset/think-structured-turn-recovery.md;.changeset/think-submission-wait.md;.changeset/think-telegram-native-streaming.md;.changeset/think-turn-identity.md;.changeset/think-ws-web-channel.md;.changeset/tool-result-cleanup-updates.md;.changeset/trace-tool-payload-redaction.md;.changeset/transient-stream-recovery.md;.changeset/tricky-buckets-relate.md;.changeset/truncate-model-tool-results.md;.changeset/turn-owned-wait-results.md;.changeset/turn-result-output.md;.changeset/worker-bundler-keep-wheel-metadata.md;.changeset/x402-selected-payment-cap.md;agent-think/CHANGELOG.md;agent-think/package.json;packages/hono-agents/package.json;packages/worker-bundler/CHANGELOG.md;packages/worker-bundler/package.json;pnpm-lock.yaml,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +d73705c9df98f0e1b8ff5f8c2e6cb11f256a5f88,feat(examples): give the pi harness a Workspace with JavaScript exec,https://github.com/cloudflare/agents/commit/d73705c9df98f0e1b8ff5f8c2e6cb11f256a5f88,,docs/agents/harnesses/pi.md;examples/next/README.md;examples/next/harnesses/pi/NOTES.md;examples/next/harnesses/pi/README.md;examples/next/harnesses/pi/env.d.ts;examples/next/harnesses/pi/package.json;examples/next/harnesses/pi/src/client.tsx;examples/next/harnesses/pi/src/server.ts;examples/next/harnesses/pi/src/workspace.ts;examples/next/harnesses/pi/wrangler.jsonc;pnpm-lock.yaml,outside retained package closure,Reviewed repository-level change; examples/docs/CI/changesets are not vendored as package source. Relevant release effects appear in final package manifests/changelogs. +23033f77936aa35393a41f44bbcd3ee14ba5a2c0,chore(agents): move the pi harness to agents/harness/pi (#2452),https://github.com/cloudflare/agents/commit/23033f77936aa35393a41f44bbcd3ee14ba5a2c0,packages/agents/AGENTS.md;packages/agents/package.json;packages/agents/scripts/build.ts;packages/agents/src/harness/pi/context.ts;packages/agents/src/harness/pi/harness.ts;packages/agents/src/harness/pi/index.ts;packages/agents/src/harness/pi/session-store.ts;packages/agents/src/harness/pi/skills.ts;packages/agents/src/harness/pi/tests/env.d.ts;packages/agents/src/harness/pi/tests/harness.test.ts;packages/agents/src/harness/pi/tests/options.test.ts;packages/agents/src/harness/pi/tests/session-store.test.ts;packages/agents/src/harness/pi/tests/tsconfig.json;packages/agents/src/harness/pi/tests/vitest.config.ts;packages/agents/src/harness/pi/tests/worker.ts;packages/agents/src/harness/pi/tests/wrangler.jsonc;packages/agents/src/harness/pi/types.ts;packages/agents/src/harnesses/pi/context.ts;packages/agents/src/harnesses/pi/harness.ts;packages/agents/src/harnesses/pi/index.ts;packages/agents/src/harnesses/pi/session-store.ts;packages/agents/src/harnesses/pi/skills.ts;packages/agents/src/harnesses/pi/tests/env.d.ts;packages/agents/src/harnesses/pi/tests/harness.test.ts;packages/agents/src/harnesses/pi/tests/options.test.ts;packages/agents/src/harnesses/pi/tests/session-store.test.ts;packages/agents/src/harnesses/pi/tests/tsconfig.json;packages/agents/src/harnesses/pi/tests/vitest.config.ts;packages/agents/src/harnesses/pi/tests/worker.ts;packages/agents/src/harnesses/pi/tests/wrangler.jsonc;packages/agents/src/harnesses/pi/types.ts;packages/agents/tsconfig.json;packages/agents/vitest.config.ts,.changeset/pi-harness-singular-path.md;docs/agents/harnesses/pi.md;examples/next/README.md;examples/next/harnesses/pi/NOTES.md;examples/next/harnesses/pi/README.md;examples/next/harnesses/pi/src/protocol.ts;examples/next/harnesses/pi/src/server.ts;examples/next/harnesses/pi/src/sockets.ts;examples/next/harnesses/pi/src/tests/worker.ts,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +3ddbd76cf0a21c46410563281bded36a2f56a911,chore: bump wrangler and @cloudflare/vite-plugin to pick up Access remote-bindings fix (#2454),https://github.com/cloudflare/agents/commit/3ddbd76cf0a21c46410563281bded36a2f56a911,,.changeset/bump-wrangler-vite-plugin.md;agent-think/package.json;examples/a2a/package.json;examples/agent-skills/package.json;examples/agents-as-tools/package.json;examples/ai-chat/package.json;examples/assistant/package.json;examples/auth-agent/package.json;examples/browser-live-view/package.json;examples/browser-quick-actions/package.json;examples/channels/package.json;examples/chat-sdk-messenger/package.json;examples/codemode-browser/package.json;examples/codemode-connectors/package.json;examples/codemode-mcp-openapi/package.json;examples/codemode-mcp/package.json;examples/codemode/package.json;examples/context-overflow-recovery/package.json;examples/cross-domain/package.json;examples/deploy-churn/package.json;examples/dynamic-tools/package.json;examples/dynamic-workers-playground/package.json;examples/dynamic-workers/package.json;examples/elevenlabs-starter/package.json;examples/email-agent/package.json;examples/github-webhook/package.json;examples/mcp-client/package.json;examples/mcp-elicitation-mrtr/package.json;examples/mcp-rpc-transport/package.json;examples/mcp-server/package.json;examples/mcp-worker-authenticated/package.json;examples/mcp-worker/package.json;examples/mcp/package.json;examples/multi-ai-chat/package.json;examples/next/dynamic-agents/package.json;examples/next/harnesses/codex/package.json;examples/next/harnesses/pi/package.json;examples/next/harnesses/self-modifying/package.json;examples/next/lifecycle/package.json;examples/next/mcp-client/package.json;examples/next/models/package.json;examples/next/queue/package.json;examples/next/routing/package.json;examples/next/schedules/package.json;examples/next/sessions/package.json;examples/next/streams/package.json;examples/next/tasks/package.json;examples/next/websockets/package.json;examples/playground/package.json;examples/plivo-voice-agent/package.json;examples/push-notifications/package.json;examples/resumable-stream-chat/package.json;examples/sandbox-coding-agent/package.json;examples/structured-input/package.json;examples/telnyx-voice-agent/package.json;examples/think-chat-sdk/package.json;examples/think-submissions/package.json;examples/think-workflows/package.json;examples/tictactoe/package.json;examples/voice-agent/package.json;examples/voice-input/package.json;examples/vue-chat/package.json;examples/webmcp-react/package.json;examples/worker-bundler-playground/package.json;examples/workflows/package.json;examples/workspace-chat/package.json;examples/x402-mcp/package.json;examples/x402/package.json;experimental/chat-recovery-probe/package.json;experimental/gateway-resume-think/package.json;experimental/ops-approval-agent/package.json;experimental/pi-recovery/package.json;experimental/tanstack-recovery/package.json;openai-sdk/chess-app/package.json;package.json;pnpm-lock.yaml;site/agents/package.json,outside retained package closure,"Upstream tool bump reviewed; shared Workers toolchain updated separately, no broad vendor dependency churn." +df9c0ef6c4541c5552b5ce4d6ba292162dbd0908,feat(agents): move the pi harness to pi-durable 1.0 (#2451),https://github.com/cloudflare/agents/commit/df9c0ef6c4541c5552b5ce4d6ba292162dbd0908,packages/agents/AGENTS.md;packages/agents/package.json;packages/agents/scripts/build.ts;packages/agents/src/harness/pi/context.ts;packages/agents/src/harness/pi/harness.ts;packages/agents/src/harness/pi/index.ts;packages/agents/src/harness/pi/session-store.ts;packages/agents/src/harness/pi/skills.ts;packages/agents/src/harness/pi/tests/env.d.ts;packages/agents/src/harness/pi/tests/factory-fixture.ts;packages/agents/src/harness/pi/tests/factory.test.ts;packages/agents/src/harness/pi/tests/faux.ts;packages/agents/src/harness/pi/tests/harness.test.ts;packages/agents/src/harness/pi/tests/session-store.test.ts;packages/agents/src/harness/pi/tests/timing.ts;packages/agents/src/harness/pi/tests/worker.ts;packages/agents/src/harness/pi/tests/wrangler.jsonc;packages/agents/src/harnesses/pi/index.ts;packages/agents/src/models/pi-ai/catalog.ts;packages/agents/src/models/pi-ai/index.ts;packages/agents/src/models/pi-ai/models/image.ts,.changeset/pi-harness-singular-path.md;.changeset/pi-harness-v1.md;docs/agents/harnesses/pi.md;docs/agents/index.md;docs/agents/models-pi-ai.md;examples/next/harnesses/pi/NOTES.md;examples/next/harnesses/pi/README.md;examples/next/harnesses/pi/package.json;examples/next/harnesses/pi/src/server.ts;examples/next/harnesses/pi/src/sockets.ts;examples/next/harnesses/pi/src/tests/vitest.config.ts;examples/next/harnesses/pi/src/tests/worker.ts;examples/next/harnesses/pi/src/view.ts;examples/next/harnesses/pi/src/workspace.ts;examples/next/models/package.json;experimental/pi-recovery/package.json;pnpm-lock.yaml;pnpm-workspace.yaml,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. +ca6f629315d25c3e05048c0eccb80d2d4a1a0bef,chore: Make Pi harness minor bump,https://github.com/cloudflare/agents/commit/ca6f629315d25c3e05048c0eccb80d2d4a1a0bef,,.changeset/pi-harness-v1.md,outside retained package closure,Reviewed repository-level change; examples/docs/CI/changesets are not vendored as package source. Relevant release effects appear in final package manifests/changelogs. +74570a19aafc676dd85831a31af047817e7bba12,Version Packages (#2453),https://github.com/cloudflare/agents/commit/74570a19aafc676dd85831a31af047817e7bba12,packages/agents/CHANGELOG.md;packages/agents/package.json,.changeset/bump-wrangler-vite-plugin.md;.changeset/pi-harness-v1.md;agent-think/CHANGELOG.md;agent-think/package.json;packages/hono-agents/package.json;pnpm-lock.yaml,package endpoint imported; fork conflicts reconciled,Included in the final six-package release endpoint. Retained owner-local divergences are enumerated in fork-diff.md; this is not a claim of an isolated cherry-pick or per-commit test run. diff --git a/vendor/agents/docs/audit/agents-sync-2026-10-02.md b/vendor/agents/docs/audit/agents-sync-2026-10-02.md new file mode 100644 index 0000000..30303da --- /dev/null +++ b/vendor/agents/docs/audit/agents-sync-2026-10-02.md @@ -0,0 +1,153 @@ +# Agents 0.26 refresh audit + +The package snapshot advances from +[`c076e4c9` (Agents 0.24)](https://github.com/cloudflare/agents/tree/c076e4c9ff6cfb72931085226edfd3ee7965ac48) +to [`74570a19` (Agents 0.26)](https://github.com/cloudflare/agents/tree/74570a19aafc676dd85831a31af047817e7bba12). +The target was the latest stable npm release checked on October 2, 2026. +The range contains 104 commits. Review covered their subjects, bodies and touched +paths plus the complete retained-package endpoint diff; integration used a +three-way merge against the exact old pin, not 104 independent cherry-picks. +The [commit disposition table](agents-0.26-commit-dispositions.csv) includes every +SHA, upstream link, scoped paths and integration decision. It distinguishes +repository-only work from imported package work and does not imply each commit +was tested separately. + +The six package versions are Agents 0.26.0, Think 0.20.0, AI Chat 0.12.1, +Codemode 0.5.3, Voice 0.5.0 and Shell 0.4.3. +[VENDOR.md](../../VENDOR.md) is the authoritative pin; +[the live fork inventory](../fork-diff.md) lists retained responsibilities. + +## Replacements and retained contracts + +| Area | Decision and reason | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Method identity | Remove the fork's original-method WeakMap and override helper. Upstream Think snapshots declared members before wrapping and handles both override checks ([#2326](https://github.com/cloudflare/agents/pull/2326)). | +| React lifecycle | Use upstream result-cleanup pre-dispatch guard and address-change reset ([#2403](https://github.com/cloudflare/agents/pull/2403), [#2394](https://github.com/cloudflare/agents/pull/2394)). Keep absent-subscriber buffering and remount overflow recovery. | +| Deleted facets | Use upstream noncreating lookup, descendant checks and proactive socket closure ([#2024](https://github.com/cloudflare/agents/pull/2024)). Keep consumed dropped-connect gate rejection. | +| Stream settlement | Adopt persist → canonical transcript → done ([#2327](https://github.com/cloudflare/agents/pull/2327)). Preserve canonical terminal metadata when the observer accumulator settles. Keep the last completed stream through enclosing recovery Task settlement; submission outcomes do not cover plain WebSocket turns. | +| Resume | Use upstream replay sequence tracking ([#2348](https://github.com/cloudflare/agents/pull/2348)). Keep fork continuation-prefix descriptors for a cold remount, but never reset a prefix after the ledger has already applied it. Store/broadcast stays synchronous. Offers track their request owner, so unrelated terminals and stale ACKs cannot release them. Buffered replay precedes terminal delivery, including without an ACK; exclusions still apply. Think holds ACK-driven `done` until canonical publication, verified by pausing its real assistant cutover. | +| Recovery | Adopt upstream separate retry/continue paths, transient/rate-limit routing, branch-aware regeneration and pending response-hook recovery. Remove the fork's unified recovery helper. Preserve durable Stop epochs, admitted-request receipts and accepted partial history. A callback delivery failure cannot rewrite an already-persisted completed turn as failed. | +| Delegation | Preserve atomic roster/snapshot/live tails, durable cancellation and structured child output. Compose upstream unstored IDs and terminal-only delivery with those snapshots: terminal snapshots carry no content; pending unstored events must not be dropped or reordered behind a later stored snapshot. | +| Transcript | Preserve server timing, completed-assistant authority, lossless legacy migration, compaction broadcasts, reasoning fields and output head/tail policy. Adopt upstream one-to-one tool-call reconciliation, metadata writers, usage and stepped truncation; custom writers do not replace reserved persisted timing. | +| Browser runtime | Preserve async syntax/constructor names, browser messenger leaves and Shell OPFS. Cold-RPC wrapping must continue distinguishing lowered async methods from synchronous methods. Sessions' new synchronous SHA-256 content hash requires a real browser crypto implementation in integration bundles. | + +## Dependencies and public API changes + +Think now requires AI SDK 7, React SDK 4 and Agents >=0.25; AI Chat also raises +its Agents peer floor. The fork already used AI 7. The obsolete Chat AI peer +exception is removed because Chat 4.38 accepts AI 7. The maintained Babel 7 +exception remains covered by browser tests. Workers types advance to +5.20261002.1; the root runtime owns the deployed Workers toolchain update. + +Agents adds optional `@earendil-works/pi-ai`, `pi-durable` and AI provider peers, +framework-neutral model transports and the Pi harness. The final export is +`agents/harness/pi`, after an intermediate plural namespace. These additions +are imported with the release; existing consumers do not opt into Pi merely by +upgrading. Model tests use mock transports and require no provider credentials. + +The persistent `Browser` capability and session connector are additions. No +package export subpath was removed from the retained six-package closure. +`CdpSession` remains a deprecated alias of `CdpConnection`, and the existing +`agents/browser/ai` entry point remains available. The new tool entry points are +`agents/browser/ai-sdk` and `agents/browser/tanstack-ai`. The deleted interaction +contract was explicitly unexported, as documented by +[the upstream revert](https://github.com/cloudflare/agents/commit/9aec847d4ba2e0999ecf214346190f8061adb4e4); +it does not require a public-API migration. The TanStack adapter preserves +literal tool names and the browser input contract with maintained 0.54 types. + +Cold asynchronous RPC calls now initialize before executing; synchronous methods +retain synchronous semantics. Native RPC consumers using unnamed Durable Object +IDs must use named addressing for initialization, just as routed entry points +already require. Existing examples use named objects. + +## Storage and rollout + +Upgrades are forward-only. Downgrading package pins against an upgraded actor +database is unsupported; rollback machinery and downgrade/re-upgrade tests are +outside this fork's maintenance scope. Keep the forward migrations that read +existing state, messages and queued work without losing data. + +The 0.24 → 0.26 migrations add nullable Sessions `content_hash`, Think submission +message identity, parent/child Agent-tool `event_delivery`, and legacy fiber +`completed_at`, `outcome` and `error_message` columns. Existing rows remain +readable; timestamp-aware fork decoding stays intact. No additional destructive +migration is introduced by this refresh. + +The downgrade findings remain historical evidence for this policy. A 0.24 +Sessions update changes content without updating `content_hash`; 0.26 then +trusts a matching non-null digest and can incorrectly skip a later update. +[The digest change](https://github.com/cloudflare/agents/commit/040458edb8f2c87a25e5ac446709054a5f553e14) +and the prior update statement establish that limitation. Similarly, 0.24 does +not understand a completed legacy-fiber marker left after failed cleanup and +can rerun its recovery hook. These findings do not create a pending rollback +implementation project. + +The existing 0.24 forward migration remains a rollout constraint: legacy +schedules and queues move into Lifecycle jobs, the old Think workflow-notification +outbox is removed, and invalid legacy queue payloads require the fork's +preservation policy. Deployments already on the recorded 0.24 pin have passed +that boundary; older deployments must account for it before skipping directly +to 0.26. The lossless forward migrations and their regressions remain maintained. + +## Optional evaluation runner exclusion + +The fork excludes Evalite, the `packages/agents/evals/` credentialed scheduling +evaluation, and its `evals` command. This was the runner's sole consumer in the +retained package closure and was outside the deterministic SDK gate. Maintaining +its separate application dependency graph to fix development-server advisories +would add work without exercising this fork's runtime contracts. + +The local workspace manifests and Agents package snapshot own this exclusion. +Future upstream syncs must continue to omit the runner, evaluation file and +command. Runtime scheduling and its deterministic regressions remain in scope; +[the live fork inventory](../fork-diff.md#local-maintenance-policy) records the +same boundary. This removal closes the optional-tooling decision rather than +leaving an Evalite upgrade or replacement on the maintenance backlog. + +## Verification + +The maintained gate now includes all 34 chat unit files, cold native RPC, +browser capability/connector and model transport suites, four new AI Chat wire +regressions, and seven new Think metadata, prompt-cache, terminal-order, +channel and origin-ID suites. Native final runs use the October 2 workerd binary +through `MINIFLARE_WORKERD_PATH`; the pool package otherwise bundles an older +binary. + +The final root `sdk:test` run passes all 3,161 tests in the maintained gate after +the security overrides and pending-resume ownership/terminal-order fixes: + +| Suite | Files | Tests | +| ------------- | ----: | ----: | +| React | 10 | 103 | +| Shared chat | 34 | 639 | +| Agents | 50 | 989 | +| AI Chat | 11 | 111 | +| Think | 27 | 1,032 | +| Voice | 1 | 21 | +| Shell | 2 | 194 | +| Think browser | 6 | 64 | +| Shell browser | 1 | 8 | + +Think includes all 105 messenger tests. The final `sdk:check` also passes all six +package export checks, formatting, lint and TypeScript checks. These are the +maintained suites named in `package.json`, not an exhaustive upstream test run; +provider-backed integrations and the optional Pi harness were not exercised by +this gate. Downgrade/re-upgrade is outside the forward-only support policy. + +Final review restored the pre-stream admission cleanup around a failed terminal +record deletion. Its new regression failed before the restoration and then +passed with all 28 onconnect tests on the same October 2 binary. It proves that +the identical request can retry and persist one user/assistant pair after the +failure, with neither a stranded claim nor retained origin IDs. This adds one +regression after the 3,161-test full run above; focused formatting, lint and +Think TypeScript checks also pass. + +The separate native Browser connector E2E gate also passed all 24 tests with +`--retry=0` and the October 2 binary. It starts real local `wrangler dev` with +the Browser Rendering simulator and Worker Loader, exercising CDP execution, +persistent named sessions, pause/resume and multi-socket lifecycle behavior. +Its teardown initially killed the Vitest worker after the tests passed because +`lsof -ti tcp:` selected connected clients as well as the server. The +maintained harness restricts cleanup to `-sTCP:LISTEN`; the rerun exited cleanly, +and the dedicated port was free before and after. No credentials or remote +Cloudflare resources were required. diff --git a/vendor/agents/docs/audit/vendor-fork-audit.md b/vendor/agents/docs/audit/vendor-fork-audit.md index 5df01ae..0ae4283 100644 --- a/vendor/agents/docs/audit/vendor-fork-audit.md +++ b/vendor/agents/docs/audit/vendor-fork-audit.md @@ -5,7 +5,11 @@ Audited 2026-09-12 (Pacific), after merging Agents 0.23 / Think 0.18 with [reconnect identity](https://github.com/WebMCP-org/do-runtime/pull/62) and Rook's stable React approval command. The original refresh checkout was left untouched; the integration and gates use an isolated worktree. On 2026-09-23 the baseline -moved to Agents 0.24 / Think 0.19; the findings below still apply. +moved to Agents 0.24 / Think 0.19. The October 2 refresh moves it to Agents +0.26 / Think 0.20 after reviewing all 104 intervening commits and the complete +package diff. Method identity, React cleanup dispatch and address reset now use +upstream implementations; retained continuation descriptors compose with its +new replay ledger. [VENDOR.md](../../VENDOR.md) owns provenance and the [current inventory](../fork-diff.md) records retained owners and retirement conditions. Historical audits remain in Git. @@ -21,8 +25,8 @@ passing-after regressions and fixes at their existing SDK owners. | Priority | Evidence | Smallest next action | | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Method identity — fixed | The real native `chat()` regression emits two provider errors with reactive recovery enabled and the inherited default classifier. Before the fix, the expected one-time warning never fires. [#2165](https://github.com/cloudflare/agents/issues/2165#issuecomment-5629567318) describes the same sibling comparison. | Both skills and reactive overflow now use `_isAgentMethodOverride`. The regression and all 209 native Think Session tests pass with retries disabled; no second wrapper strategy. | -| React cleanup dispatch — fixed | A long unthrottled stream, one queued socket task per frame, and a busy transcript reproduce `Maximum update depth exceeded` through the real hook. The unconditional cleanup dispatch remains in the audited upstream; [#2217](https://github.com/cloudflare/agents/issues/2217) supplies the exact lead. | Check the committed map before dispatch and include it in effect dependencies. The functional updater filters current state, preserving concurrent results still in history. The long-stream and public result-retention/pruning checks pass; all 11 related React tests pass. The replay-burst check waits for the replayed prefix before live data instead of requiring a 20 ms paint; throttle is unchanged. | +| Method identity — fixed | The real native `chat()` regression emits two provider errors with reactive recovery enabled and the inherited default classifier. Before the fix, the expected one-time warning never fires. [#2165](https://github.com/cloudflare/agents/issues/2165#issuecomment-5629567318) describes the same sibling comparison. | Retired the fork WeakMap/helper in favor of upstream Think `snapshotDeclaredMembers` and `isMethodOverridden` (#2165). Existing behavior regressions remain. | +| React cleanup dispatch — fixed | A long unthrottled stream, one queued socket task per frame, and a busy transcript reproduce `Maximum update depth exceeded` through the real hook. Upstream 0.26 now includes the pre-dispatch fix (#2403); [#2217](https://github.com/cloudflare/agents/issues/2217) supplies the exact lead. | Check the committed map before dispatch and include it in effect dependencies. The functional updater filters current state, preserving concurrent results still in history. The long-stream and public result-retention/pruning checks pass; all 11 related React tests pass. The replay-burst check waits for the replayed prefix before live data instead of requiring a 20 ms paint; throttle is unchanged. | | Continuation replay — fixed | A real hook remount reproduced duplicate live text, reasoning and tool parts through both transport resume and observer replay. Native Think and AI Chat tests verify the producer boundary; a stale replay also reproduced transcript loss. [#1951](https://github.com/cloudflare/agents/issues/1951) describes the same continuation overlap. | Refresh canonical history before offering an active continuation on reconnect, releasing the prior socket’s replay state. Store the assistant ID and original part lengths in the existing continuation start chunk. Restore that prefix at the transport snapshot or accumulator seed boundary, after request ownership checks. Plaintext and SSE consumers need a text-start even when server persistence reuses a text part. Legacy chunks without the descriptor remain readable with their prior behavior; no row rewrite or storage migration. | | Upstream owner simplification | Agents 0.23 / Think 0.18 introduce Streams, Tasks recovery, Sessions and derived progress. The old per-chunk KV progress counter disappears upstream. | The package closure now uses those upstream owners and removes their old equivalents. Run retained replay/Stop/storage tests against these owners. Preserve store/broadcast ordering; the new producer still awaits an async helper. | diff --git a/vendor/agents/docs/fork-diff.md b/vendor/agents/docs/fork-diff.md index 17a600c..0e2a00a 100644 --- a/vendor/agents/docs/fork-diff.md +++ b/vendor/agents/docs/fork-diff.md @@ -2,9 +2,9 @@ This is the current retained surface, not an implementation log. Audited on 2026-09-12 (Pacific), including the verified replay, React cleanup and method -identity fixes, and reconciled with Agents 0.24 on 2026-09-23. The upstream +identity fixes, and reconciled with Agents 0.26 on 2026-10-02. The upstream baseline is -[Agents 0.24 / Think 0.19](https://github.com/cloudflare/agents/tree/c076e4c9ff6cfb72931085226edfd3ee7965ac48); +[Agents 0.26 / Think 0.20](https://github.com/cloudflare/agents/tree/74570a19aafc676dd85831a31af047817e7bba12); [VENDOR.md](../VENDOR.md) owns package provenance. Update the owning row when behavior changes; remove it when the divergence is @@ -15,6 +15,23 @@ The [current audit](audit/vendor-fork-audit.md) owns measured costs, upstream issue findings and unresolved coverage questions. Test names below describe inspected coverage; fresh follow-up results are identified explicitly in the audit. +## Local maintenance policy + +Upgrades are forward-only. The fork preserves the migrations and regression +coverage needed to read existing actor data and queued work on upgrade. +Downgrading code against upgraded storage is unsupported; historical downgrade +limitations below explain this boundary and are not a rollback implementation +backlog. + +The workspace manifests and Agents package snapshot exclude Evalite, +`packages/agents/evals/`, and the `evals` command. The sole retained evaluation +required model credentials and was outside the deterministic SDK gate. Removing +its unused runner avoids maintaining a separate development-server dependency +graph. Keep this exclusion during upstream syncs; runtime scheduling and its +deterministic tests remain maintained. The +[October audit](audit/agents-sync-2026-10-02.md#optional-evaluation-runner-exclusion) +records the decision and scope. + ## 2026-09-14 — Preserve completion across a cold restart - `packages/think/src/think.ts`: both chat streaming paths persist the assistant @@ -28,11 +45,16 @@ inspected coverage; fresh follow-up results are identified explicitly in the aud replace this. They cover only a running submission, so a plain WebSocket turn still needs the stream record. The stamps commit inside the retained cutover or `_finalizeSubmissionStream`, before completion is broadcast. -- Wire order remains completion, then canonical transcript. Sending the snapshot - while an observer accumulator is still active makes its terminal merge replace - persisted duration/status metadata. The native broadcast regression asserts - both durability at completion and this frame order; Rook's real Chrome stopped - activity-label test covers the rendered result. +- Wire order follows upstream 0.26: persist, canonical transcript, then completion. + The observer terminal merge retains canonical metadata while a replay ledger + skips already-applied chunks. Fork continuation-prefix restoration applies only + before the ledger has applied the replay, preserving cold-remount recovery. + Resume offers retain their request owner: an unrelated terminal or stale ACK + cannot release another offer. Think also holds ACK-driven completion until + its transcript is published, including the interval after the producer closes. + `terminal-frame-order.test.ts` holds the real assistant cutover and verifies + that reconnect replay ends with `replayComplete`, then canonical history, then + `done`; the regression failed before wiring the shared terminal-hold hook. - No new storage shape, migration, timer, or recovery protocol. The existing `discard: false` cutover and start-time reclaim bound retention to the previous turn, as already used for agent-tool tailing and reconnect replay. @@ -75,7 +97,6 @@ upstreamable additions, not claims that Workers need browser polyfills. | Retained behavior and owner | Consumer and proof | Why it remains / retirement condition | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Hook attachment: `agents/src/react.tsx`, `chat/react.tsx` buffer while chat subscribers are absent, drain on attachment, reset by source, and repair overflow with hydration/resume. | Rook transcript Suspense and conversation replacement; `agents/src/react-tests/resume-overlap-race.test.tsx` covers remount, source switch and 5,000-frame overflow. | The socket can exist before its hook. Keep until upstream passes the same mount/overflow contracts. This replaces the historical one-shot chat drain. | -| Client-tool result cleanup: `agents/src/chat/react.tsx` checks the committed result map for stale IDs before dispatch; its functional updater filters the current map and dependencies include the result map. | `agents/src/react-tests/default-throttle.test.tsx` reproduces a long unthrottled stream with queued socket tasks and a busy transcript; a public-hook test verifies visible results survive until history removes their call. | Even a no-op state dispatch can exhaust React update depth under load. Prune only when needed, preserving concurrent result writes that remain visible. Retire with equivalent upstream cleanup; no throttle change or host workaround. | | Hydrated replay: `agents/src/chat/ws-chat-transport.ts` resolves resume after its first response frame; error/close/cancel also settle it. | Real React hydrated-assistant regression and Rook conversation-switch reproduction; [SDK #57](https://github.com/WebMCP-org/do-runtime/pull/57). | AI SDK must snapshot after the replay reset. A renderer cannot reset that private stream state. Current upstream still resolves early. Continuation remount coverage also verifies text, reasoning and tool parts through transport and observer paths. | | Unacknowledged requests: `ws-chat-transport.ts`, `pre-stream-turns.ts`, `resume-handshake.ts`, `resumable-stream.ts`, `wire-types.ts`, Think and AI Chat admission retain exact request bytes until receipt/response/cancel and reject duplicate IDs across stream creation. Think records a completed receipt for every persisted request that resolves stale, including after Stop resets pre-stream state. | Transport, pre-stream and handshake suites; AI Chat request-ID and Think onconnect tests; the Stop replay assertion in `think/src/tests/agent-tool-reattach-recovery.test.ts`. | Outbox state is uncertain delivery, not history. Completed-stream retention bounds server idempotency. Retire only with equivalent native admission receipts, including empty completed requests. | | Stored/live handoff: Think's callback/WebSocket and AI Chat's SSE/plain-text producers store and broadcast synchronously, then account for recovery progress. | `think/src/tests/onconnect-broadcast.test.ts` holds the actual storage/resume boundary; [SDK #60](https://github.com/WebMCP-org/do-runtime/pull/60). | Awaiting between store and broadcast lets replay send a chunk before its live copy. Upstream 0.23 removes the progress KV read but still awaits an async helper; run the regression before retiring the ordering guarantee. | @@ -88,36 +109,35 @@ upstreamable additions, not claims that Workers need browser polyfills. ## Delegation and transcript policy -| Retained behavior and owner | Consumer and proof | Why it remains / retirement condition | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Retained runs and atomic tails: Agent `index.ts`, `agent-tool-types.ts`, `react.tsx`, `chat/agent-tools.ts` and Think expose roster (including empty), metadata-first inspection, snapshot/live cursors, epochs and parsed collection frames without creating missing children. | Rook's parent subscription; native/React Agent-tool replay suites cover StrictMode, source switch, stale snapshots, malformed ready frames and overlap. | Parent revision, child cursor and stream epoch identify different transitions. Upstream Streams is a possible simplification, not proof transient progress or recovery epochs can be dropped. | -| Initial run-hook gap and legacy replay: `agents/src/react.tsx` buffers before first Agent-tool subscriber and rebuilds replayed `started` without reviving terminal status. | `useAgentToolEvents.test.tsx`; Rook keeps the subscription mounted with its socket. | Distinct from chat's remount lifetime. Retire when all supported SDK producers/consumers use equivalent current replay semantics. The old duplicated helper is already gone. | -| Structured child output: Think uses the existing workflow final-answer pipeline; `agents/src/agent-tools.ts` exports `projectAgentToolResult` and output schema types. Milestone access remains protected. | Rook delegated-run agent, `connectors/agents.ts`; Think structured result, missing-answer and recovery tests. | Reuses one result pipeline and replaces host projection. Retire with equivalent public upstream hooks. The old `prepareRun` factory extension is gone. | -| Transcript metadata: Think and `agents/src/sessions/core.ts` own server timing, timestamp-preserving decode and writes, usage, submission metadata and detached display names. | Rook timestamps/context usage/provenance; Session, submissions and Sessions migration tests. | Keep facts with persistence rather than UI state. Submission metadata also exposes the generic workflow envelope; that is an API-policy caveat, not a demonstrated Rook `step.prompt` consumer. | -| Reasoning fields: `agents/src/sessions/sanitize.ts` retains reasoning item IDs and encrypted content. | Rook `store:false` provider replay. No focused added regression identified here. | Provider interoperability policy, not Chrome compatibility. Retire when upstream sanitation preserves required provider continuation fields. | -| Tool-output truncation: `chat/tool-output-truncation.ts` retains head and tail in a 4:1 budget split. | Rook tool-result context; truncation regressions. | Product policy for structured output. Think uses upstream’s four-message read window. This does not fix opaque provider-output truncation in [#2014](https://github.com/cloudflare/agents/issues/2014). | -| Submission diagnostics and schedule parser: Think includes the error string in its first log argument and exports `tryParseDeclaredTaskSchedule` with result types. | Extension error display; Rook routine projection and frozen routine contracts. No focused log regression identified. | Small diagnostic/public API seams avoid host parsing or copied schedule logic. Retire when upstream exposes equivalent behavior. | +| Retained behavior and owner | Consumer and proof | Why it remains / retirement condition | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Retained runs and atomic tails: Agent `index.ts`, `agent-tool-types.ts`, `react.tsx`, `chat/agent-tools.ts` and Think expose roster (including empty), metadata-first inspection, snapshot/live cursors, epochs and parsed collection frames without creating missing children. | Rook's parent subscription; native/React Agent-tool replay suites cover StrictMode, source switch, stale snapshots, malformed ready frames and overlap. | Parent revision, child cursor and stream epoch identify different transitions. Upstream Streams is a possible simplification, not proof transient progress or recovery epochs can be dropped. | +| Initial run-hook gap and legacy replay: `agents/src/react.tsx` buffers before first Agent-tool subscriber and rebuilds replayed `started` without reviving terminal status. | `useAgentToolEvents.test.tsx`; Rook keeps the subscription mounted with its socket. | Distinct from chat's remount lifetime. Retire when all supported SDK producers/consumers use equivalent current replay semantics. The old duplicated helper is already gone. | +| Structured child output: Think uses the existing workflow final-answer pipeline; `agents/src/agent-tools.ts` exports `projectAgentToolResult` and output schema types. Milestone access remains protected. | Rook delegated-run agent, `connectors/agents.ts`; Think structured result, missing-answer and recovery tests. | Reuses one result pipeline and replaces host projection. Retire with equivalent public upstream hooks. The old `prepareRun` factory extension is gone. | +| Transcript metadata: Think and `agents/src/sessions/core.ts` own server timing, timestamp-preserving decode and writes, usage, submission metadata and detached display names. | Rook timestamps/context usage/provenance; Session, submissions and Sessions migration tests. | Keep facts with persistence rather than UI state. Submission metadata also exposes the generic workflow envelope; that is an API-policy caveat, not a demonstrated Rook `step.prompt` consumer. | +| Reasoning fields: `agents/src/sessions/sanitize.ts` retains reasoning item IDs and encrypted content. | Rook `store:false` provider replay. No focused added regression identified here. | Provider interoperability policy, not Chrome compatibility. Retire when upstream sanitation preserves required provider continuation fields. | +| Tool-output truncation: `chat/tool-output-truncation.ts` retains head and tail in a 4:1 budget split. | Rook tool-result context; truncation regressions. | Product policy for structured output. Think uses upstream’s stepped read window (at least four recent messages, advancing every eight). This does not fix opaque provider-output truncation in [#2014](https://github.com/cloudflare/agents/issues/2014). | +| Submission diagnostics and schedule parser: Think includes the error string in its first log argument and exports `tryParseDeclaredTaskSchedule` with result types. | Extension error display; Rook routine projection and frozen routine contracts. No focused log regression identified. | Small diagnostic/public API seams avoid host parsing or copied schedule logic. Retire when upstream exposes equivalent behavior. | ## Platform and integration seams -| Retained behavior and owner | Consumer and proof | Why it remains / retirement condition | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Lossless state hydration: `agents/src/state/index.ts` takes an optional `migratePersistedState`; `State.get()` then decodes without the corrupt-row fallback and migrates before caching. Agent `index.ts` always passes its hook. | Rook root/worker state migrations; `agents/src/tests/state.test.ts` covers failure, corrupt-row retention, repair and the capability load path that `WebSockets.sendState` reads. | The SDK owns the row. Keep one hook and existing application schema. Upstream `State` still replaces a corrupt row with `initialState` or deletes it; plain `State` hosts keep that. Retire with an equivalent non-destructive upstream hook. | -| Method identity: `agents/src/index.ts` retains original methods in a WeakMap and exposes `_isAgentMethodOverride`; Think skill initialization and reactive-overflow classification consume it. | Think Session inherited-default/real-override tests and a real `chat()` regression with the default classifier: two failed turns warn exactly once. All 209 native Session tests pass. | Context wrappers break direct prototype comparison. Both known comparisons now use one helper; retire with equivalent upstream override detection. [#2165](https://github.com/cloudflare/agents/issues/2165) documents both cases. | -| Alarm callback context: `agents/src/lifecycle/durable-object-lifecycle.ts` enters an eager async function and awaits the prior queue inside it. Every Lifecycle job push re-arms through it, including each 0.24 `Agent.queue()` item. | SDK browser async-context tests and runtime extension integration. | Preserves the existing scheduler while browser compilation captures actor context at suspension. Retire with equivalent native context propagation, not a second scheduler. | -| Facet lifetime: `agents/src/dynamic-agents/dynamic-agents.ts` consumes gate refusals, ignores deleted-child traffic and removes failed/closed/late virtual connections without reinserting removed records. Its socket flags use upstream `websockets/connection-flags.ts`. | Native sub-agent and RPC bridge tests; Rook depth gates/deletion. | Upstream already owns per-frame bridge routing/root fallback. Only lifetime guards remain. New upstream connect-state fix addresses a different ordering; verify these tests before removal. | -| Small Agent API/type corrections: `index.ts` exports existing `isInternalJsStubProp` and includes emitted `not-connected` in `MCPServer.state`. | Rook namespace/facet proxies and MCP catalog types. | Avoids copied probe lists and inaccurate types. No production MCP implementation differs from the baseline. Retire when public upstream exports match. | -| Idempotent Chat cleanup: `agents/src/chat-sdk/agent.ts` requests existing idempotent scheduling on startup. | Native channel/state coverage; no focused added startup-idempotence test identified. | Uses the existing schedule owner and metadata. Retire when upstream startup does the same. | -| Dynamic channels and root routing: Think reconciliation/delivery-surface hooks plus `messengers/chat-sdk.ts`'s resolved target. | Rook root settings/messenger runtime; native messenger tests. | SDK owns channel ingress/recovery; Rook supplies configuration and namespace conversation identity. Retire with equivalent public reconfiguration and routing seams. | -| Atomic messenger delivery and completed attachments: Think plus `messengers/{chat-sdk,delivery,index}.ts` bind/chat/restore within one destination RPC and expose `onReplyComplete`. | Rook attachment delivery through the live adapter; native messenger tests. | Retains capability lifetime and completed-stream delivery. Later bookkeeping failure must not send a false interruption apology. Related [#2106](https://github.com/cloudflare/agents/issues/2106) does not establish full recovery-delivery parity. | -| Browser messenger leaves: `think/src/messengers/browser/` owns Slack Socket Mode/fetch/thread adaptation and Discord Gateway/parent-thread resolution, shared types and explicit Node-only refusals. | Rook direct imports/aliases; real Chromium Worker/Chat adapter and provider-boundary race tests under `think/src/browser-tests/`. | Optional browser SDK implementation: heartbeat/ACK/resume, retired-socket fencing and failed-upload handling have live protocol consumers. Retire with equivalent browser-native adapter extension points. No matching upstream implementation found. | -| Early model preparation and media: Think `prepareModel`, inference configuration and `tools/workspace.ts` select capabilities, reject oversized media before loading bytes, and render inaccessible rereads as tool errors without changing saved history. | Rook model configuration; model-history-capability, read-tool wire/contract and native `assistant-tools.test.ts` history/reconnection and size-preflight tests. | History rendering precedes `beforeTurn`, so a host shim is too late or hides storage errors. Retire with equivalent early model selection, image/PDF capability controls and failed reread handling upstream. | -| Inference callback context: `think/src/inference-context.ts` binds admitted-turn model callbacks and tool iterator operations. | Real AI SDK mock-model streams in Think Chromium tests overlap ordinary/streaming tools and cleanup. | Native stream callbacks can enter outside their creator's scope. Compiler-assisted awaits cannot restore missing callback-entry context. Retire only when upstream/native context covers those same entry points. | -| Shell OPFS: `shell/src/browser/` implements host-selected directories, symlinks, Web Locks and staged writes; `filesystem.ts`, `extras.ts`, `helpers.ts`, `fs/mime-types.ts` share existing filesystem facts. | Rook shared workspace; real Worker OPFS tests cover failures, cancellation and concurrent writes. | Optional backend, not a second Rook filesystem. Runtime SQL/OPFS alone does not implement Shell's filesystem contract. Retire with a matching upstream backend. | -| Shell byte ranges: `WorkspaceFsLike`, `FileSystem`, `WorkspaceFileSystem` and `browser/opfs-workspace.ts` expose optional bounded reads. | Rook mounted-PDF shell performance; native Worker OPFS tests assert exact slices and legacy SQL adapter tests verify fallback. | Filesystem capability belongs in Shell. Existing implementations remain compatible; retire when upstream exposes equivalent range reads. | -| Shell metadata export and Git scans: package/build export `state-methods.ts`; `shell/src/git/index.ts` uses three `refresh:false` scan options. | Rook workspace connector; real browser Git test checks index bytes and changed-content detection. | Pure metadata avoids loading Codemode. Browser handles lack full POSIX stat identity; scans must not rewrite the index. Retire with equivalent public metadata and configurable/native scan behavior. | -| Voice flush/error/meter: `agents/src/voice/{types,audio-pipeline,voice-input}.ts` exposes optional `waitUntilClosed`, waits final audio before idle, propagates close failures and meters accepted PCM; background context keeps microtask ordering with `await Promise.resolve()` inside eager async entry. | Rook transcriber/root Agent; native Voice and browser dictation tests. | Final transcript must precede idle. `waitUntilReady` is already upstream. The implementation now lives in `agents/voice`; retire with equivalent upstream hooks; an unrelated response-settlement workaround cannot replace transcriber flush. | -| Package identity and syntax: six build scripts use tsdown’s `deps.neverBundle`, preserve constructor names and ES2021 async syntax; manifests expose optional browser and metadata leaves. Think aligns Chat to 4.38 and declares optional Slack/Discord adapter peers for those leaves. | Actor/facet identities and runtime async transform; built-package integration and export checks. | A consumer cannot recover renamed constructors or lowered async code. Retire when upstream builds preserve these contracts; never replace with source aliases. | +| Retained behavior and owner | Consumer and proof | Why it remains / retirement condition | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Lossless state hydration: `agents/src/state/index.ts` takes an optional `migratePersistedState`; `State.get()` then decodes without the corrupt-row fallback and migrates before caching. Agent `index.ts` always passes its hook. | Rook root/worker state migrations; `agents/src/tests/state.test.ts` covers failure, corrupt-row retention, repair and the capability load path that `WebSockets.sendState` reads. | The SDK owns the row. Keep one hook and existing application schema. Upstream `State` still replaces a corrupt row with `initialState` or deletes it; plain `State` hosts keep that. Retire with an equivalent non-destructive upstream hook. | +| Alarm callback context: `agents/src/lifecycle/durable-object-lifecycle.ts` enters an eager async function and awaits the prior queue inside it. Every Lifecycle job push re-arms through it, including each 0.24 `Agent.queue()` item. | SDK browser async-context tests and runtime extension integration. | Preserves the existing scheduler while browser compilation captures actor context at suspension. Retire with equivalent native context propagation, not a second scheduler. | +| Facet lifetime: `agents/src/dynamic-agents/dynamic-agents.ts` consumes dropped-connect gate refusals. Upstream owns deleted-child noncreating resolution and closes parent-side sockets on deletion. Its socket flags use upstream `websockets/connection-flags.ts`. | Native sub-agent and RPC bridge tests; Rook depth gates/deletion. | Upstream already owns per-frame bridge routing/root fallback. Only consumed gate refusals remain; upstream deletion regressions cover stale traffic, descendants and replacement isolation. | +| Small Agent API/type corrections: `index.ts` exports existing `isInternalJsStubProp` and includes emitted `not-connected` in `MCPServer.state`. | Rook namespace/facet proxies and MCP catalog types. | Avoids copied probe lists and inaccurate types. No production MCP implementation differs from the baseline. Retire when public upstream exports match. | +| Idempotent Chat cleanup: `agents/src/chat-sdk/agent.ts` requests existing idempotent scheduling on startup. | Native channel/state coverage; no focused added startup-idempotence test identified. | Uses the existing schedule owner and metadata. Retire when upstream startup does the same. | +| Dynamic channels and root routing: Think reconciliation/delivery-surface hooks plus `messengers/chat-sdk.ts`'s resolved target. | Rook root settings/messenger runtime; native messenger tests. | SDK owns channel ingress/recovery; Rook supplies configuration and namespace conversation identity. Retire with equivalent public reconfiguration and routing seams. | +| Atomic messenger delivery and completed attachments: Think plus `messengers/{chat-sdk,delivery,index}.ts` bind/chat/restore within one destination RPC and expose `onReplyComplete`. | Rook attachment delivery through the live adapter; native messenger tests. | Retains capability lifetime and completed-stream delivery. Later bookkeeping failure must not send a false interruption apology. Related [#2106](https://github.com/cloudflare/agents/issues/2106) does not establish full recovery-delivery parity. | +| Browser messenger leaves: `think/src/messengers/browser/` owns Slack Socket Mode/fetch/thread adaptation and Discord Gateway/parent-thread resolution, shared types and explicit Node-only refusals. | Rook direct imports/aliases; real Chromium Worker/Chat adapter and provider-boundary race tests under `think/src/browser-tests/`. | Optional browser SDK implementation: heartbeat/ACK/resume, retired-socket fencing and failed-upload handling have live protocol consumers. Retire with equivalent browser-native adapter extension points. No matching upstream implementation found. | +| Early model preparation and media: Think `prepareModel`, inference configuration and `tools/workspace.ts` select capabilities, reject oversized media before loading bytes, and render inaccessible rereads as tool errors without changing saved history. | Rook model configuration; model-history-capability, read-tool wire/contract and native `assistant-tools.test.ts` history/reconnection and size-preflight tests. | History rendering precedes `beforeTurn`, so a host shim is too late or hides storage errors. Retire with equivalent early model selection, image/PDF capability controls and failed reread handling upstream. | +| Inference callback context: `think/src/inference-context.ts` binds admitted-turn model callbacks and tool iterator operations. | Real AI SDK mock-model streams in Think Chromium tests overlap ordinary/streaming tools and cleanup. | Native stream callbacks can enter outside their creator's scope. Compiler-assisted awaits cannot restore missing callback-entry context. Retire only when upstream/native context covers those same entry points. | +| Shell OPFS: `shell/src/browser/` implements host-selected directories, symlinks, Web Locks and staged writes; `filesystem.ts`, `extras.ts`, `helpers.ts`, `fs/mime-types.ts` share existing filesystem facts. | Rook shared workspace; real Worker OPFS tests cover failures, cancellation and concurrent writes. | Optional backend, not a second Rook filesystem. Runtime SQL/OPFS alone does not implement Shell's filesystem contract. Retire with a matching upstream backend. | +| Shell byte ranges: `WorkspaceFsLike`, `FileSystem`, `WorkspaceFileSystem` and `browser/opfs-workspace.ts` expose optional bounded reads. | Rook mounted-PDF shell performance; native Worker OPFS tests assert exact slices and legacy SQL adapter tests verify fallback. | Filesystem capability belongs in Shell. Existing implementations remain compatible; retire when upstream exposes equivalent range reads. | +| Shell metadata export and Git scans: package/build export `state-methods.ts`; `shell/src/git/index.ts` uses three `refresh:false` scan options. | Rook workspace connector; real browser Git test checks index bytes and changed-content detection. | Pure metadata avoids loading Codemode. Browser handles lack full POSIX stat identity; scans must not rewrite the index. Retire with equivalent public metadata and configurable/native scan behavior. | +| Voice flush/error/meter: `agents/src/voice/{types,audio-pipeline,voice-input}.ts` exposes optional `waitUntilClosed`, waits final audio before idle, propagates close failures and meters accepted PCM; background context keeps microtask ordering with `await Promise.resolve()` inside eager async entry. | Rook transcriber/root Agent; native Voice and browser dictation tests. | Final transcript must precede idle. `waitUntilReady` is already upstream. The implementation now lives in `agents/voice`; retire with equivalent upstream hooks; an unrelated response-settlement workaround cannot replace transcriber flush. | +| Package identity and syntax: six build scripts use tsdown’s `deps.neverBundle`, preserve constructor names and ES2021 async syntax; manifests expose optional browser and metadata leaves. Think aligns Chat to 4.38 and declares optional Slack/Discord adapter peers for those leaves. | Actor/facet identities and runtime async transform; built-package integration and export checks. | A consumer cannot recover renamed constructors or lowered async code. Retire when upstream builds preserve these contracts; never replace with source aliases. | ## Deliberate product omissions @@ -138,10 +158,6 @@ already includes replay batching, default chat throttle, resume/finalizer fixes, and native facet routing. History records their removal; the live inventory must not keep them as work to maintain. -## Reconnect identity - -`agents/src/react.tsx` clears the previous server identity when the requested Agent address changes. Reconnects at the same address still detect server identity changes. `rpc-robustness.test.tsx` covers A → B → A and a changed server identity at one address; retire when upstream passes both regressions. - ## Ownership and upgrade seams Sessions, Streams, Tasks, DynamicAgents and the lifecycle job queue replace @@ -162,18 +178,17 @@ changes the browser runtime. `default-throttle.test.tsx` verifies one identity across streamed messages; retire when upstream returns the same stable command. -The four SDK SQL lifts drop their source tables. A 0.22 rollback requires -restoring pre-upgrade actor databases, not only package pins. -[The migration guide](rook-0.23-migration.md) records each lift and the Rook -backup/canary requirements. Completed-request receipts now survive until the +The four SDK SQL lifts drop their source tables; selecting a 0.22 package pin +does not reconstruct them. +[The migration guide](rook-0.23-migration.md) records each historical lift. Completed-request receipts now survive until the next stream starts, rather than a timed completed-buffer window. 0.24's first wake is also one-way. `cf_agents_queues` rows become Lifecycle jobs and the table is dropped; Agent's `cf_schema_version` row moves to KV `cf_agents:schema_version`; `State` and `Queue` record their own KV schema versions. A 0.23 build on that database recreates an empty queue table, but its -job driver drops due `queue` jobs, so a rollback again means restoring pre-upgrade -actor databases. Upstream marks the queue-table lift as temporary (removed in the +job driver drops due `queue` jobs. This is another historical reason the fork +supports forward upgrades only. Upstream marks the queue-table lift as temporary (removed in the next minor, so a deployment must pass through 0.24) and it drops legacy rows whose payload is not valid JSON. `Agent.queue()` returns before its callback runs; the callback runs from the next alarm. @@ -207,3 +222,22 @@ lifecycle sink again follow upstream; the design system consumes chat updates and its existing manual command result. Retire the two broadcasts when upstream Think synchronizes these writes itself. Configurable head/tail floors remain independently justified by the small-row-count compaction regression above. + +## October release integration + +The 104 commits from the prior pin through Agents 0.26 were reviewed alongside +the package endpoint diff. Upstream now owns method override snapshots (#2165), +React result cleanup's pre-dispatch guard (#2403), requested-address identity +reset (#2394), and deleted-facet lookup/socket lifetime (#2024). The fork's +parallel implementations are removed. Upstream retry and continue recovery +callbacks replace the fork's unified helper; Stop epoch checks remain on both. + +Think 0.20 requires AI SDK 7 and React SDK 4. Agents adds optional Pi/provider +peers; the new Pi integration is not a runtime dependency for other consumers. +Sessions adds a nullable content hash; Think adds submission message identity and +child event-delivery fields. Existing tables migrate in place. The previous +0.24 lifecycle-queue migration remains required under the forward-only policy. + +TanStack AI 0.54 infers the browser tool's JSON-schema input as unknown. The +adapter retains its browser input contract and explicit literal tool name; the +heterogeneous tool type regression uses TanStack's current `AnyServerTool`. diff --git a/vendor/agents/package.json b/vendor/agents/package.json index 8521b76..ff0d778 100644 --- a/vendor/agents/package.json +++ b/vendor/agents/package.json @@ -13,11 +13,11 @@ "typecheck": "pnpm --filter agents exec tsgo --noEmit --project tsconfig.json && pnpm --filter agents exec tsgo --noEmit --project src/tests/tsconfig.json && pnpm --filter @cloudflare/think exec tsgo --noEmit --project tsconfig.json && pnpm --filter @cloudflare/think exec tsgo --noEmit --project src/browser-tests/tsconfig.json && pnpm --filter @cloudflare/shell exec tsgo --noEmit --project tsconfig.json", "check": "pnpm check:exports && pnpm format:check && pnpm lint && pnpm typecheck", "test": "pnpm test:react && pnpm test:chat && pnpm test:agents && pnpm test:ai-chat && pnpm test:think && pnpm test:voice && pnpm test:shell && pnpm test:browser", - "test:react": "pnpm --filter agents exec vitest --run --project react src/react-tests/resume-overlap-race.test.tsx src/react-tests/default-throttle.test.tsx src/react-tests/resume-replay-burst.test.tsx src/react-tests/useAgentToolEvents.test.tsx src/react-tests/agent-tool-replay.test.tsx src/react-tests/rpc-robustness.test.tsx --retry=0", - "test:chat": "pnpm --filter agents exec vitest --run -c src/chat/__tests__/vitest.config.ts src/chat/__tests__/agent-tools.test.ts src/chat/__tests__/recovery-incident.test.ts src/chat/__tests__/recovery-engine.test.ts src/chat/__tests__/recovery-cutover.test.ts src/chat/__tests__/recovery-task.test.ts src/chat/__tests__/broadcast-state.test.ts src/chat/__tests__/chat-throttle.test.ts src/chat/__tests__/replay-batch.test.ts src/chat/__tests__/stream-accumulator.test.ts src/chat/__tests__/sanitize.test.ts src/chat/__tests__/pre-stream-turns.test.ts src/chat/__tests__/resume-handshake.test.ts src/chat/__tests__/ws-chat-transport.test.ts --retry=0", - "test:agents": "pnpm --filter agents exec vitest --run -c src/tests/vitest.config.ts src/tests/sessions/capability.test.ts src/tests/sessions/compaction-utils.test.ts src/tests/sessions/migration.test.ts src/tests/chat/truncate-older-messages.test.ts src/tests/streams/cutover.test.ts src/tests/resumable-stream-migration.test.ts src/tests/tasks/capability.test.ts src/tests/lifecycle/alarm-arbitration.test.ts src/tests/schedules/capability.test.ts src/tests/schedule.test.ts src/tests/schema-and-state-optimization.test.ts src/tests/state.test.ts src/tests/agent-tool-detached.test.ts src/tests/agent-tool-replay.test.ts src/tests/agent-tool-lifecycle.test.ts src/tests/sub-agent.test.ts src/tests/sub-agent-rpc-bridge.test.ts src/tests/state/capability.test.ts src/tests/queue/capability.test.ts src/tests/queue.test.ts src/tests/streams/resumable-stream-settlement.test.ts src/tests/lifecycle/websockets-capability.test.ts --retry=0 --fileParallelism=false", - "test:ai-chat": "pnpm --filter @cloudflare/ai-chat exec vitest --run -c src/tests/vitest.config.ts src/tests/pre-stream-resume.test.ts src/tests/request-id.test.ts src/tests/resumable-streaming.test.ts src/tests/sanitize-messages.test.ts src/tests/sessions-migration.test.ts src/tests/client-tools-continuation.test.ts src/tests/plaintext-response.test.ts --retry=0 --fileParallelism=false", - "test:think": "pnpm --filter @cloudflare/think exec vitest --run -c src/tests/vitest.config.ts src/tests/assistant-tools.test.ts src/tests/agent-tools.test.ts src/tests/agent-tool-reattach-recovery.test.ts src/tests/onconnect-broadcast.test.ts src/tests/think-session.test.ts src/tests/message-reconciliation.test.ts src/tests/submissions.test.ts src/tests/messengers.test.ts src/tests/hooks.test.ts src/tests/client-tools.test.ts src/tests/actions-attach-reply.test.ts src/tests/actions-durable-pause.test.ts src/tests/channels.test.ts src/tests/channel-policy.test.ts src/tests/channel-threading.test.ts src/tests/channel-recovery.test.ts src/tests/connection-state.test.ts src/tests/hydration-budget.test.ts src/tests/stream-cleanup.test.ts src/tests/media-eviction.test.ts --retry=0 --fileParallelism=false", + "test:react": "pnpm --filter agents exec vitest --run --project react src/react-tests/resume-overlap-race.test.tsx src/react-tests/default-throttle.test.tsx src/react-tests/resume-replay-burst.test.tsx src/react-tests/useAgentToolEvents.test.tsx src/react-tests/agent-tool-replay.test.tsx src/react-tests/rpc-robustness.test.tsx src/react-tests/tool-result-prune-updates.test.tsx src/react-tests/reconnect-optimistic-send.test.tsx src/react-tests/initial-messages-address-change.test.tsx src/react-tests/useAgent-address-change.test.tsx --retry=0", + "test:chat": "pnpm --filter agents exec vitest --run -c src/chat/__tests__/vitest.config.ts --retry=0", + "test:agents": "pnpm --filter agents exec vitest --run -c src/tests/vitest.config.ts src/tests/sessions/capability.test.ts src/tests/sessions/compaction-utils.test.ts src/tests/sessions/migration.test.ts src/tests/chat/truncate-older-messages.test.ts src/tests/streams/cutover.test.ts src/tests/resumable-stream-migration.test.ts src/tests/tasks/capability.test.ts src/tests/lifecycle/alarm-arbitration.test.ts src/tests/schedules/capability.test.ts src/tests/schedule.test.ts src/tests/schema-and-state-optimization.test.ts src/tests/state.test.ts src/tests/agent-tool-detached.test.ts src/tests/agent-tool-replay.test.ts src/tests/agent-tool-lifecycle.test.ts src/tests/sub-agent.test.ts src/tests/sub-agent-rpc-bridge.test.ts src/tests/state/capability.test.ts src/tests/queue/capability.test.ts src/tests/queue.test.ts src/tests/streams/resumable-stream-settlement.test.ts src/tests/lifecycle/websockets-capability.test.ts src/tests/native-rpc-initialization.test.ts src/tests/browser.test.ts src/tests/browser-capability.test.ts src/tests/browser-session-connector.test.ts src/tests/browser-connector.test.ts src/tests/browser-quick-actions.test.ts src/tests/browser-spec.test.ts src/tests/browser-spec-normalize.test.ts src/tests/models/ --retry=0 --fileParallelism=false", + "test:ai-chat": "pnpm --filter @cloudflare/ai-chat exec vitest --run -c src/tests/vitest.config.ts src/tests/pre-stream-resume.test.ts src/tests/request-id.test.ts src/tests/resumable-streaming.test.ts src/tests/sanitize-messages.test.ts src/tests/sessions-migration.test.ts src/tests/client-tools-continuation.test.ts src/tests/plaintext-response.test.ts src/tests/terminal-frame-order.test.ts src/tests/late-tool-input.test.ts src/tests/origin-message-ids.test.ts src/tests/stale-approval-repair.test.ts --retry=0 --fileParallelism=false", + "test:think": "pnpm --filter @cloudflare/think exec vitest --run -c src/tests/vitest.config.ts src/tests/assistant-tools.test.ts src/tests/agent-tools.test.ts src/tests/agent-tool-reattach-recovery.test.ts src/tests/onconnect-broadcast.test.ts src/tests/think-session.test.ts src/tests/message-reconciliation.test.ts src/tests/submissions.test.ts src/tests/messengers.test.ts src/tests/hooks.test.ts src/tests/client-tools.test.ts src/tests/actions-attach-reply.test.ts src/tests/actions-durable-pause.test.ts src/tests/channels.test.ts src/tests/channel-policy.test.ts src/tests/channel-threading.test.ts src/tests/channel-recovery.test.ts src/tests/connection-state.test.ts src/tests/hydration-budget.test.ts src/tests/stream-cleanup.test.ts src/tests/media-eviction.test.ts src/tests/terminal-frame-order.test.ts src/tests/ws-web-channel.test.ts src/tests/prompt-cache.test.ts src/tests/cold-rpc-initialization.test.ts src/tests/assistant-message-metadata.test.ts src/tests/turn-metadata.test.ts src/tests/origin-message-ids.test.ts --retry=0 --fileParallelism=false", "test:voice": "pnpm --filter agents exec vitest --run -c src/voice/tests/vitest.config.ts src/voice/tests/voice-input.test.ts --retry=0", "test:browser": "pnpm --filter @cloudflare/think build && pnpm --filter @cloudflare/think test:browser && pnpm --filter @cloudflare/shell build && pnpm --filter @cloudflare/shell test:browser", "test:shell": "pnpm --filter @cloudflare/shell exec vitest run src/tests/memory.test.ts src/tests/workspace.test.ts --retry=0 --fileParallelism=false" @@ -27,7 +27,7 @@ "@ai-sdk/openai": "^4.0.0", "@ai-sdk/react": "^4.0.0", "@cloudflare/vitest-pool-workers": "^0.22.0", - "@cloudflare/workers-types": "5.20260914.1", + "@cloudflare/workers-types": "5.20261002.1", "@modelcontextprotocol/sdk": "1.30.0", "@types/node": "^26.5.1", "@types/react": "^19.3.0", @@ -39,8 +39,6 @@ "@vitest/runner": "^4.1.11", "agents": "workspace:*", "ai": "^7.0.0", - "evalite": "^0.19.0", - "fast-glob": "^3.3.3", "oxfmt": "^0.67.0", "oxlint": "1.71.0", "partysocket": "1.3.0", diff --git a/vendor/agents/packages/agents/AGENTS.md b/vendor/agents/packages/agents/AGENTS.md index ac83320..2c87274 100644 --- a/vendor/agents/packages/agents/AGENTS.md +++ b/vendor/agents/packages/agents/AGENTS.md @@ -6,47 +6,51 @@ The core Agents SDK, published to npm as `agents`. This is the most complex pack Each export maps to a public entry point that users `import` from. These are the boundaries of the public API — changes here need a changeset. -| Import path | Source file(s) | Purpose | -| ----------------------------- | ----------------------------- | ---------------------------------------------------------------------------- | -| `agents` | `src/index.ts` | Agent base class, routing, connections, RPC, state, scheduling, SQL | -| `agents/client` | `src/client.ts` | Browser/Node WebSocket client (`AgentClient`) via partysocket | -| `agents/lifecycle` | `src/lifecycle/index.ts` | Composable Durable Object lifecycle and hibernating connections | -| `agents/react` | `src/react.tsx` | `useAgent` React hook, state sync, RPC from components | -| `agents/chat` | `src/chat/index.ts` | Shared chat primitives used by `@cloudflare/ai-chat` and `@cloudflare/think` | -| `agents/chat/transport` | `src/chat/transport.ts` | Framework-neutral WebSocket chat transport for AI SDK clients | -| `agents/mcp` | `src/mcp/index.ts` | Compatibility barrel plus retained legacy `McpAgent`/transport APIs | -| `agents/mcp/server` | `src/mcp/server/index.ts` | Isolated Agents wrapper for SDK v2 stateless servers | -| `agents/mcp/client` | `src/mcp/client/index.ts` | MCP client manager (connect to remote MCP servers from an Agent) | -| `agents/email` | `src/email.ts` | Email routing, resolvers, header signing | -| `agents/workflows` | `src/workflows.ts` | `AgentWorkflow` — Workflows integrated with Agents | -| `agents/schedule` | `src/schedule.ts` | Deprecated scheduling-parser compatibility entry point | -| `agents/schedules` | `src/schedules/index.ts` | Dependency-light Lifecycle Scheduler primitive and runtime types | -| `agents/schedules/parser` | `src/schedules/parser.ts` | Zod-based natural-language scheduling prompt and schema helpers | -| `agents/observability` | `src/observability/index.ts` | Observability event types and emitters | -| `agents/ai-chat-agent` | `src/ai-chat-agent.ts` | Legacy AI chat agent (prefer `@cloudflare/ai-chat`) | -| `agents/ai-react` | `src/ai-react.tsx` | Legacy AI React hooks (prefer `@cloudflare/ai-chat`) | -| `agents/tsconfig` | `agents.tsconfig.json` | Shared TypeScript config for all projects in the repo | -| `agents/vite` | `src/vite.ts` | Vite plugin — decorator transforms and the `agents:skills` import transform | -| `agents/skills` | `src/skills/index.ts` | Framework-agnostic Agent Skills engine — sources, `SkillRegistry`, runner | -| `agents/experimental/webmcp` | `src/experimental/webmcp.ts` | WebMCP adapter — bridges MCP tools to Chrome's `navigator.modelContext` | -| `agents/browser` | `src/browser/index.ts` | Browser Run helpers — CDP sessions, connector, Quick Action primitives | -| `agents/browser/ai` | `src/browser/ai.ts` | AI SDK browser tools — `createBrowserTools` (CDP) + `createQuickActionTools` | -| `agents/browser/tanstack-ai` | `src/browser/tanstack-ai.ts` | TanStack AI browser tool (`browser_execute`) | -| `agents/voice` | `src/voice/index.ts` | Voice server mixins, contracts, Workers AI providers, text, and SFU helpers | -| `agents/voice/types` | `src/voice/types.ts` | Dependency-light Voice protocol and provider contracts | -| `agents/voice/client` | `src/voice/client.ts` | Framework-neutral browser Voice client | -| `agents/voice/react` | `src/voice/react.tsx` | React Voice hooks | -| `agents/voice/errors` | `src/voice/errors.ts` | Provider error and logging helpers | -| `agents/voice/workers-ai` | `src/voice/workers-ai.ts` | Workers AI speech providers | -| `agents/voice/sfu` | `src/voice/sfu.ts` | Realtime SFU and audio conversion helpers | -| `agents/voice/text` | `src/voice/text.ts` | Sentence and streamed-text helpers | -| `agents/channels` | `src/channels/index.ts` | Transport-neutral messaging contracts and host | -| `agents/channels/email` | `src/channels/email.ts` | Workers Email adapter and MIME ingress | -| `agents/channels/slack` | `src/channels/slack.ts` | Slack adapter | -| `agents/channels/telegram` | `src/channels/telegram.ts` | Telegram adapter | -| `agents/channels/voice` | `src/channels/voice.ts` | Output-only browser Voice adapter | -| `agents/channels/ai-sdk` | `src/channels/ai-sdk.ts` | AI SDK tool and stream adapters | -| `agents/channels/tanstack-ai` | `src/channels/tanstack-ai.ts` | TanStack AI tool adapter | +| Import path | Source file(s) | Purpose | +| ----------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------ | +| `agents` | `src/index.ts` | Agent base class, routing, connections, RPC, state, scheduling, SQL | +| `agents/client` | `src/client.ts` | Browser/Node WebSocket client (`AgentClient`) via partysocket | +| `agents/lifecycle` | `src/lifecycle/index.ts` | Composable Durable Object lifecycle and hibernating connections | +| `agents/harness/pi` | `src/harness/pi/index.ts` | Experimental: pi-durable hosted in a Durable Object (`PiHarness`) | +| `agents/react` | `src/react.tsx` | `useAgent` React hook, state sync, RPC from components | +| `agents/chat` | `src/chat/index.ts` | Shared chat primitives used by `@cloudflare/ai-chat` and `@cloudflare/think` | +| `agents/chat/transport` | `src/chat/transport.ts` | Framework-neutral WebSocket chat transport for AI SDK clients | +| `agents/mcp` | `src/mcp/index.ts` | Compatibility barrel plus retained legacy `McpAgent`/transport APIs | +| `agents/mcp/server` | `src/mcp/server/index.ts` | Isolated Agents wrapper for SDK v2 stateless servers | +| `agents/mcp/client` | `src/mcp/client/index.ts` | MCP client manager (connect to remote MCP servers from an Agent) | +| `agents/email` | `src/email.ts` | Email routing, resolvers, header signing | +| `agents/workflows` | `src/workflows.ts` | `AgentWorkflow` — Workflows integrated with Agents | +| `agents/schedule` | `src/schedule.ts` | Deprecated scheduling-parser compatibility entry point | +| `agents/schedules` | `src/schedules/index.ts` | Dependency-light Lifecycle Scheduler primitive and runtime types | +| `agents/schedules/parser` | `src/schedules/parser.ts` | Zod-based natural-language scheduling prompt and schema helpers | +| `agents/observability` | `src/observability/index.ts` | Observability event types and emitters | +| `agents/models/ai-sdk` | `src/models/ai-sdk/index.ts` | Experimental `createAI` for the AI SDK — Workers AI ids, vendor models routed through AI Gateway | +| `agents/models/pi-ai` | `src/models/pi-ai/index.ts` | Experimental `createAI` for pi-ai — Workers AI ids, vendor models routed through AI Gateway | +| `agents/ai-chat-agent` | `src/ai-chat-agent.ts` | Legacy AI chat agent (prefer `@cloudflare/ai-chat`) | +| `agents/ai-react` | `src/ai-react.tsx` | Legacy AI React hooks (prefer `@cloudflare/ai-chat`) | +| `agents/tsconfig` | `agents.tsconfig.json` | Shared TypeScript config for all projects in the repo | +| `agents/vite` | `src/vite.ts` | Vite plugin — decorator transforms and the `agents:skills` import transform | +| `agents/skills` | `src/skills/index.ts` | Framework-agnostic Agent Skills engine — sources, `SkillRegistry`, runner | +| `agents/experimental/webmcp` | `src/experimental/webmcp.ts` | WebMCP adapter — bridges MCP tools to Chrome's `navigator.modelContext` | +| `agents/browser` | `src/browser/index.ts` | Browser Run helpers — CDP sessions, connector, Quick Action primitives | +| `agents/browser/ai` | `src/browser/ai.ts` | AI SDK browser tools — `createBrowserTools` (CDP) + `createQuickActionTools` | +| `agents/browser/ai-sdk` | `src/browser/ai-sdk.ts` | AI SDK `browserTool` for a persistent `Browser` (+ `createQuickActionTools` re-export) | +| `agents/browser/tanstack-ai` | `src/browser/tanstack-ai.ts` | TanStack AI `browserTool` for a persistent `Browser` (+ legacy `createBrowserTools`) | +| `agents/voice` | `src/voice/index.ts` | Voice server mixins, contracts, Workers AI providers, text, and SFU helpers | +| `agents/voice/types` | `src/voice/types.ts` | Dependency-light Voice protocol and provider contracts | +| `agents/voice/client` | `src/voice/client.ts` | Framework-neutral browser Voice client | +| `agents/voice/react` | `src/voice/react.tsx` | React Voice hooks | +| `agents/voice/errors` | `src/voice/errors.ts` | Provider error and logging helpers | +| `agents/voice/workers-ai` | `src/voice/workers-ai.ts` | Workers AI speech providers | +| `agents/voice/sfu` | `src/voice/sfu.ts` | Realtime SFU and audio conversion helpers | +| `agents/voice/text` | `src/voice/text.ts` | Sentence and streamed-text helpers | +| `agents/channels` | `src/channels/index.ts` | Transport-neutral messaging contracts and host | +| `agents/channels/email` | `src/channels/email.ts` | Workers Email adapter and MIME ingress | +| `agents/channels/slack` | `src/channels/slack.ts` | Slack adapter | +| `agents/channels/telegram` | `src/channels/telegram.ts` | Telegram adapter | +| `agents/channels/voice` | `src/channels/voice.ts` | Output-only browser Voice adapter | +| `agents/channels/ai-sdk` | `src/channels/ai-sdk.ts` | AI SDK tool and stream adapters | +| `agents/channels/tanstack-ai` | `src/channels/tanstack-ai.ts` | TanStack AI tool adapter | The `agents:skills` virtual-module types ship from `skills-module.d.ts` (referenced from the built `dist/index.d.ts`); `@cloudflare/think` consumes `agents/skills` and `@cloudflare/ai-chat` can too. @@ -122,6 +126,33 @@ src/ codemode/ # Experimental code generation ai.ts + models/ # Experimental model providers (one createAI() per framework, same skeleton) + core/ # Framework-neutral, not exported: binding transport, gateway options, Workers AI ids, SSE, errors + transport.ts # env.AI.run + env.AI.gateway(id).run (universal), envelope unwrap, errors + settings.ts # AISettings (binding only), GatewayOptions/ModelOptions, option merging + catalog.ts # WorkersAIModelId + per-modality id types (Workers AI only) + gateway-providers.ts # AI Gateway provider table: vendor host -> slug, endpoint, auth headers to strip + chat-completions/ # Workers AI <-> strict OpenAI chat-completions compat (quirk table, request/response/stream) + sse.ts # SSE decoder TransformStream + errors.ts # CloudflareAIError + status classification + images.ts # image input helpers + ai-sdk/ # agents/models/ai-sdk — AI SDK v4 models over core + index.ts # createAI + public types (the only public entry) + settings.ts # ModelOptions, fallback legs, providerOptions.cloudflare parsing + errors.ts # APICallError lift over core errors + transport.ts # core transport with errors lifted + models/ # language.ts (Workers AI), gateway.ts (vendor models routed), embedding/image/ + # transcription/speech/reranking/modality.ts, fallback.ts + wires/ # chat-completions.ts, shared.ts (Workers AI only — vendors bring their own wire) + pi-ai/ # agents/models/pi-ai — pi-ai models over core + index.ts # createAI + public types + settings.ts # pi call options -> resolved request + catalog.ts # Workers AI models + pi's Cloudflare AI Gateway registry lookup + routing.ts # pi model -> gateway provider slug + endpoint + errors.ts # pi error events + diagnostics + models/ # language.ts, fallback.ts, image.ts + wires/ # chat-completions.ts, responses.ts, anthropic.ts, shared.ts (pi's own converters) + skills/ # Framework-agnostic Agent Skills engine index.ts # Barrel — sources, registry, runner, types types.ts # SkillSource, SkillRegistrySnapshot, SkillRunContext, etc. @@ -137,13 +168,18 @@ src/ browser/ # Browser Run integration (experimental) index.ts # Barrel for agents/browser browser-run.ts # Low-level Browser Run REST/binding calls + errors - cdp-session.ts # CdpSession — Chrome DevTools Protocol over WebSocket + cdp-connection.ts # CdpConnection — one Chrome DevTools Protocol WebSocket + browser.ts # Browser — one named persistent browser (Lifecycle capability) + browserRun() connector.ts # BrowserConnector — codemode connector + session helpers - session-manager.ts # Durable session-id store + sweep + session-store.ts # Durable session-id store + sweep + live-view.ts # Live View URL minting shared by Browser and BrowserConnector spec.ts # CDP protocol spec loader (cdp.spec()) quick-actions.ts # Stateless Quick Action primitives (browserMarkdown, …) ai.ts # createBrowserTools + createQuickActionTools (AI SDK) - tanstack-ai.ts # createBrowserTools for TanStack AI + ai-sdk.ts # browserTool for a persistent Browser (AI SDK) + browser-tool.ts # harness-neutral browserTool core shared by ai-sdk.ts and tanstack-ai.ts + tool-helpers.ts # model-output + ctx helpers shared by ai.ts and ai-sdk.ts + tanstack-ai.ts # browserTool and createBrowserTools for TanStack AI voice/ # Voice server, client, React, provider, SFU, and text entries channels/ # Messaging core, provider adapters, and AI framework adapters @@ -280,13 +316,15 @@ pnpm run test:e2e # or: pnpm exec vitest run -c src/e2e-tests/vitest.confi End-to-end tests that start real workers and exercise managed-fiber and facet recovery across process termination. -### Evals (`evals/`) - -```bash -pnpm run evals # runs evalite inside evals/ -``` +### Excluded upstream evaluation tooling -AI evaluation suite (scheduling accuracy, etc.). Requires API keys in `.env`. +This fork omits Evalite, `evals/` and the `evals` command. The sole scheduling +evaluation required model credentials and was outside the maintained gate; +keeping its runner would maintain an otherwise-unused application dependency +graph. Preserve this exclusion on upstream syncs. Scheduling behavior remains +covered by the deterministic `src/tests/schedule.test.ts` and +`src/tests/schedules/capability.test.ts` suites in the workspace's `test:agents` +command. See [the local maintenance policy](../../docs/fork-diff.md#local-maintenance-policy). ## Key architecture notes diff --git a/vendor/agents/packages/agents/CHANGELOG.md b/vendor/agents/packages/agents/CHANGELOG.md index 0667e28..ab85303 100644 --- a/vendor/agents/packages/agents/CHANGELOG.md +++ b/vendor/agents/packages/agents/CHANGELOG.md @@ -1,5 +1,107 @@ # @cloudflare/agents +## 0.26.0 + +### Minor Changes + +- [#2451](https://github.com/cloudflare/agents/pull/2451) [`df9c0ef`](https://github.com/cloudflare/agents/commit/df9c0ef6c4541c5552b5ce4d6ba292162dbd0908) Thanks [@aron-cf](https://github.com/aron-cf)! - Update pi-durable and pi-ai to `^1.0.0`. See [Pi harness](https://github.com/cloudflare/agents/blob/main/docs/agents/harnesses/pi.md) docs for details. + +## 0.25.0 + +### Minor Changes + +- [#2005](https://github.com/cloudflare/agents/pull/2005) [`c2f7672`](https://github.com/cloudflare/agents/commit/c2f767235e749cb3f6334ed22e70a03940dcd18c) Thanks [@cjol](https://github.com/cjol)! - Native RPC calls to async Agent and Think methods now start lifecycle initialization first; address Agents by name because raw IDs from `newUniqueId()` and `idFromString()` now fail their first async RPC. See [Lifecycle](https://github.com/cloudflare/agents/blob/main/docs/agents/lifecycle.md). + +### Patch Changes + +- [#2390](https://github.com/cloudflare/agents/pull/2390) [`c55ec80`](https://github.com/cloudflare/agents/commit/c55ec80087ba2531ccdc9e211921fb5bf6ddb065) Thanks [@threepointone](https://github.com/threepointone)! - Report a failed agent-tool child as failed even when it was evicted before recording the failure. See [Agent tools](https://github.com/cloudflare/agents/blob/main/docs/agents/agent-tools.md). + +- [#2384](https://github.com/cloudflare/agents/pull/2384) [`f904999`](https://github.com/cloudflare/agents/commit/f9049991fe9ca637b5326788e08e1cea6b4280c1) Thanks [@threepointone](https://github.com/threepointone)! - Fix agent-tool chunks being duplicated or dropped on reconnect, child re-attach, and fiber recovery. See [Agent tools](https://github.com/cloudflare/agents/blob/main/docs/agents/agent-tools.md). + +- [#2364](https://github.com/cloudflare/agents/pull/2364) [`5e0507e`](https://github.com/cloudflare/agents/commit/5e0507e5f1ba27cc7c2bf2920c380a7c8f9caaad) Thanks [@threepointone](https://github.com/threepointone)! - Add `eventDelivery: "terminal"` to `runAgentTool` to forward only lifecycle, progress, and milestone events for a run. See [Agent tools](https://github.com/cloudflare/agents/blob/main/docs/agents/agent-tools.md). + +- [#2448](https://github.com/cloudflare/agents/pull/2448) [`54f9ca7`](https://github.com/cloudflare/agents/commit/54f9ca793e75f627c4ab33a8ee15df526770883d) Thanks [@aron-cf](https://github.com/aron-cf)! - Add experimental `agents/models/ai-sdk`, a provider for Workers AI and AI Gateway over the `AI` binding. See [Models](https://github.com/cloudflare/agents/blob/main/docs/agents/models.md). + +- [#2446](https://github.com/cloudflare/agents/pull/2446) [`5cf86f8`](https://github.com/cloudflare/agents/commit/5cf86f8cd6117843de45f41f10a7cc4cdc27340b) Thanks [@aron-cf](https://github.com/aron-cf)! - Add experimental `agents/models/pi-ai`, a pi-ai provider for Workers AI and AI Gateway over the `AI` binding. See [Models for pi-ai](https://github.com/cloudflare/agents/blob/main/docs/agents/models-pi-ai.md). + +- [#2424](https://github.com/cloudflare/agents/pull/2424) [`1e54cf1`](https://github.com/cloudflare/agents/commit/1e54cf19d747f122c141e0eb323226ec8b4d4865) Thanks [@aron-cf](https://github.com/aron-cf)! - Add experimental `agents/harnesses/pi` to host pi-durable sessions in a Durable Object. See [Pi harness](https://github.com/cloudflare/agents/blob/main/docs/agents/harnesses/pi.md) and the [runnable example](https://github.com/cloudflare/agents/tree/main/examples/next/harnesses/pi). + +- [#2391](https://github.com/cloudflare/agents/pull/2391) [`d3fe93c`](https://github.com/cloudflare/agents/commit/d3fe93cd968ea4d8e57a909dcbfd56b879df77e0) Thanks [@threepointone](https://github.com/threepointone)! - Keep a tool call's input when its approval request arrives before the input finishes streaming ([#1872](https://github.com/cloudflare/agents/issues/1872)). See [Human in the loop](https://github.com/cloudflare/agents/blob/main/docs/agents/human-in-the-loop.md). + +- [#2369](https://github.com/cloudflare/agents/pull/2369) [`9b70fdb`](https://github.com/cloudflare/agents/commit/9b70fdbfeb8ebebfda1f1dfc2628cceece8b39d5) Thanks [@ben-reitz](https://github.com/ben-reitz)! - `loadCdpSpec` accepts an optional `sessionId` to read the protocol from an existing Browser Run session. See [Browse the web](https://github.com/cloudflare/agents/blob/main/docs/agents/browse-the-web.md). + +- [#2368](https://github.com/cloudflare/agents/pull/2368) [`ed4f5ab`](https://github.com/cloudflare/agents/commit/ed4f5ab68a64fae48a148699e3f9955590743131) Thanks [@ben-reitz](https://github.com/ben-reitz)! - `connectBrowserSession` throws a `BrowserRenderingError` with the HTTP status when Browser Run returns no WebSocket. See [Browse the web](https://github.com/cloudflare/agents/blob/main/docs/agents/browse-the-web.md). + +- [#2294](https://github.com/cloudflare/agents/pull/2294) [`abda4e3`](https://github.com/cloudflare/agents/commit/abda4e3ab57e5ba435af45bc9ba62999eebb46c3) Thanks [@ben-reitz](https://github.com/ben-reitz)! - Add Browser Run hostname guardrails, close and activity callbacks, and the `CdpConnection` name while retaining `CdpSession` as a deprecated alias. See [Browse the web](https://github.com/cloudflare/agents/blob/main/docs/agents/browse-the-web.md). + +- [#2372](https://github.com/cloudflare/agents/pull/2372) [`6e1c346`](https://github.com/cloudflare/agents/commit/6e1c3467338b092da04a058594cd47fca13556db) Thanks [@ben-reitz](https://github.com/ben-reitz)! - Add persistent browser tools for AI SDK and TanStack AI, backed by experimental Browser sessions. See [Browse the web](https://github.com/cloudflare/agents/blob/main/docs/agents/browse-the-web.md). + +- [#2371](https://github.com/cloudflare/agents/pull/2371) [`9cddcd3`](https://github.com/cloudflare/agents/commit/9cddcd3e7687177dca9c10c6569473edcb0f51ed) Thanks [@ben-reitz](https://github.com/ben-reitz)! - `CdpConnection.send()` rejects immediately when its socket is closed instead of waiting for the timeout. See [Browse the web](https://github.com/cloudflare/agents/blob/main/docs/agents/browse-the-web.md). + +- [#2379](https://github.com/cloudflare/agents/pull/2379) [`d49aa82`](https://github.com/cloudflare/agents/commit/d49aa822608b7a39184b0a3825fdd813c3b6b778) Thanks [@ben-reitz](https://github.com/ben-reitz)! - `cdp.spec()` and `loadCdpSpec()` now include command parameters, return types, and type details, so a model can see how to call a CDP method. See [Browse the web](https://github.com/cloudflare/agents/blob/main/docs/agents/browse-the-web.md). + +- [#2394](https://github.com/cloudflare/agents/pull/2394) [`e837967`](https://github.com/cloudflare/agents/commit/e8379676b7f034936730f51153360a3bb8df751c) Thanks [@threepointone](https://github.com/threepointone)! - `useAgentChat` loads the new agent's history when the agent address passed to `useAgent` changes ([#1864](https://github.com/cloudflare/agents/issues/1864), [#1874](https://github.com/cloudflare/agents/issues/1874)). See [Client SDK](https://github.com/cloudflare/agents/blob/main/docs/agents/client-sdk.md). + +- [#2378](https://github.com/cloudflare/agents/pull/2378) [`dbf170c`](https://github.com/cloudflare/agents/commit/dbf170cf7d0313ffe79d7d6a84201841f2e12184) Thanks [@threepointone](https://github.com/threepointone)! - `useAgentChat` gains `onTurnEnd`, and terminal chat frames carry outcomes and user message IDs so clients can settle sends correctly across recovery and reconnects. Replay, tool callbacks, and turn state now remain consistent through terminal delivery; see [Chat agents](https://github.com/cloudflare/agents/blob/main/docs/agents/chat-agents.md). + +- [#2019](https://github.com/cloudflare/agents/pull/2019) [`d5562e0`](https://github.com/cloudflare/agents/commit/d5562e0f2ee31be049ccf2d86c3cb58de20ee9d4) Thanks [@justanotherbyte](https://github.com/justanotherbyte)! - A WebSocket close before the final `done` frame now puts `useAgentChat` in the `error` state instead of showing a truncated answer as complete ([#2013](https://github.com/cloudflare/agents/issues/2013)). See [Chat agents](https://github.com/cloudflare/agents/blob/main/docs/agents/chat-agents.md). + +- [#2036](https://github.com/cloudflare/agents/pull/2036) [`040db5c`](https://github.com/cloudflare/agents/commit/040db5c9342d74c84340858f04fd5410f84ff4f8) Thanks [@justanotherbyte](https://github.com/justanotherbyte)! - Stop storing compaction summaries that clients echo back, and hide duplicates already stored ([#1984](https://github.com/cloudflare/agents/issues/1984)). See [Sessions](https://github.com/cloudflare/agents/blob/main/docs/agents/sessions.md). + +- [#2405](https://github.com/cloudflare/agents/pull/2405) [`11f87b5`](https://github.com/cloudflare/agents/commit/11f87b5332f6cf4dfff71d8249621b28f539280f) Thanks [@threepointone](https://github.com/threepointone)! - Context blocks can set `whenChanged: "remind"` to send changes as a reminder after the cached prompt instead of rewriting it. See [Context](https://github.com/cloudflare/agents/blob/main/docs/agents/context.md). + +- [#2399](https://github.com/cloudflare/agents/pull/2399) [`cbb859b`](https://github.com/cloudflare/agents/commit/cbb859b3c5be8c925e836703afd4ef9ee30f8c3c) Thanks [@threepointone](https://github.com/threepointone)! - Sub-agent broadcasts make at most one root call, and none when no client would receive them. See [Sub-agents](https://github.com/cloudflare/agents/blob/main/docs/agents/sub-agents.md). + +- [#2398](https://github.com/cloudflare/agents/pull/2398) [`d44b67d`](https://github.com/cloudflare/agents/commit/d44b67da8e2e02a722bfc7bca452cb3852bbc771) Thanks [@threepointone](https://github.com/threepointone)! - Sub-agents no longer sync root-owned host jobs, which could fail a facet's first call after restart. See [Sub-agents](https://github.com/cloudflare/agents/blob/main/docs/agents/sub-agents.md). + +- [#2400](https://github.com/cloudflare/agents/pull/2400) [`498bc29`](https://github.com/cloudflare/agents/commit/498bc29e253b18331ac4a0b09ed1723bb375ef42) Thanks [@threepointone](https://github.com/threepointone)! - Fix WebSocket connections to sub-agents nested more than one level deep. See [Sub-agents](https://github.com/cloudflare/agents/blob/main/docs/agents/sub-agents.md). + +- [#2344](https://github.com/cloudflare/agents/pull/2344) [`a91f669`](https://github.com/cloudflare/agents/commit/a91f669d4408b60af8d5771bae293ca9ebe948cd) Thanks [@threepointone](https://github.com/threepointone)! - `useAgentChat` lets the server snapshot repair a scrambled cross-tab or resumed assistant message instead of keeping it until reload. See [Chat agents](https://github.com/cloudflare/agents/blob/main/docs/agents/chat-agents.md). + +- [#2361](https://github.com/cloudflare/agents/pull/2361) [`7588509`](https://github.com/cloudflare/agents/commit/7588509eab3f9175325495d30710f9951a90ae78) Thanks [@threepointone](https://github.com/threepointone)! - `useAgentChat` calls `onToolCall` only after the stream ends, and only for tool calls still waiting on the client ([#2195](https://github.com/cloudflare/agents/issues/2195)). See [Client tools](https://github.com/cloudflare/agents/blob/main/docs/agents/client-tools-continuation.md). + +- [#2238](https://github.com/cloudflare/agents/pull/2238) [`c3a4010`](https://github.com/cloudflare/agents/commit/c3a401006b482fab061030ac13536e1e0025fd59) Thanks [@mattzcarey](https://github.com/mattzcarey)! - Interfaces can now be used as `Props` on `Agent`, `AIChatAgent`, `Think`, and routing helpers. See [Routing](https://github.com/cloudflare/agents/blob/main/docs/agents/routing.md). + +- [#2040](https://github.com/cloudflare/agents/pull/2040) [`2afe0e0`](https://github.com/cloudflare/agents/commit/2afe0e0ba9eb91605adb0bcac289e9df8a723aa7) Thanks [@AntoniTok](https://github.com/AntoniTok)! - Keep assistant messages and tool outputs attached to the correct turn when a provider reuses a `toolCallId`; `resolveToolMergeId` is deprecated in favour of `reconcileMessages`. See [Chat agents](https://github.com/cloudflare/agents/blob/main/docs/agents/chat-agents.md). + +- [#2402](https://github.com/cloudflare/agents/pull/2402) [`01d190e`](https://github.com/cloudflare/agents/commit/01d190e69601d67b8f905f09cf4bf1a78df7b242) Thanks [@threepointone](https://github.com/threepointone)! - `useAgent` and `AgentClient` resolve `ready` only after the agent's state arrives, so `state` is no longer briefly `undefined` ([#2268](https://github.com/cloudflare/agents/issues/2268)). See [Client SDK](https://github.com/cloudflare/agents/blob/main/docs/agents/client-sdk.md). + +- [#2039](https://github.com/cloudflare/agents/pull/2039) [`c658b83`](https://github.com/cloudflare/agents/commit/c658b832d5aa32c45b64b7748aac1c02ea370003) Thanks [@justanotherbyte](https://github.com/justanotherbyte)! - `useAgentChat` keeps messages sent while disconnected when reconnecting, including Think transcripts, instead of erasing them ([#1983](https://github.com/cloudflare/agents/issues/1983)). See [Chat agents](https://github.com/cloudflare/agents/blob/main/docs/agents/chat-agents.md). + +- [#2322](https://github.com/cloudflare/agents/pull/2322) [`677c022`](https://github.com/cloudflare/agents/commit/677c022b4460e1a03c3afc5934aba85cde20ddda) Thanks [@threepointone](https://github.com/threepointone)! - Correct the documented default and unit of `ChatRecoveryConfig.maxRecoveryWork`. See [Chat agents: recovery work units](https://github.com/cloudflare/agents/blob/main/docs/agents/chat-agents.md#recovery-work-units). + +- [#2401](https://github.com/cloudflare/agents/pull/2401) [`218df4a`](https://github.com/cloudflare/agents/commit/218df4aaf443e482f553dfeb0633d204b37752c6) Thanks [@threepointone](https://github.com/threepointone)! - Clients stop reconnecting after a sub-agent rejects a WebSocket, connection errors report every close that ends reconnection, and terminal rejections use close codes `4000 + status` ([#2118](https://github.com/cloudflare/agents/issues/2118)). See [Sub-agents](https://github.com/cloudflare/agents/blob/main/docs/agents/sub-agents.md). + +- [#2348](https://github.com/cloudflare/agents/pull/2348) [`39361fa`](https://github.com/cloudflare/agents/commit/39361fa8c2194bb46c2b165454726252cca80c34) Thanks [@threepointone](https://github.com/threepointone)! - Fix text appearing twice when reconnecting during a tool continuation. See [Resumable streaming](https://github.com/cloudflare/agents/blob/main/docs/agents/resumable-streaming.md). + +- [#2340](https://github.com/cloudflare/agents/pull/2340) [`3b278b2`](https://github.com/cloudflare/agents/commit/3b278b2c987f47247e551731a1fea9b6dd154456) Thanks [@threepointone](https://github.com/threepointone)! - `onChatResponse` still fires, with `recovered: true`, for a turn persisted just before a Durable Object reset ([#2266](https://github.com/cloudflare/agents/issues/2266), [#1842](https://github.com/cloudflare/agents/issues/1842)). See [Think lifecycle hooks](https://github.com/cloudflare/agents/blob/main/docs/think/lifecycle-hooks.md). + +- [#2363](https://github.com/cloudflare/agents/pull/2363) [`d72d343`](https://github.com/cloudflare/agents/commit/d72d343a9f6fde0a89f9b8f1be0ddc8ed2ba4f1f) Thanks [@threepointone](https://github.com/threepointone)! - `runFiber()` no longer calls `onFiberRecovered()` for work that already finished ([#2305](https://github.com/cloudflare/agents/issues/2305)). See [Durable execution](https://github.com/cloudflare/agents/blob/main/docs/agents/durable-execution.md). + +- [#2404](https://github.com/cloudflare/agents/pull/2404) [`9d125c8`](https://github.com/cloudflare/agents/commit/9d125c8d75571ccde8abb8c0c75ff343a7ef149a) Thanks [@threepointone](https://github.com/threepointone)! - Add `session.mirror()` to keep an in-memory transcript in sync with a session's change feed. See [Sessions](https://github.com/cloudflare/agents/blob/main/docs/agents/sessions.md). + +- [#2236](https://github.com/cloudflare/agents/pull/2236) [`14f7c6a`](https://github.com/cloudflare/agents/commit/14f7c6a46e6c81492c4e663ada49895187dae9c3) Thanks [@mattzcarey](https://github.com/mattzcarey)! - Keep attachment references when a message that already contains attachment pointers is written back, so its media isn't garbage-collected. See [Sessions](https://github.com/cloudflare/agents/blob/main/docs/agents/sessions.md). + +- [#2231](https://github.com/cloudflare/agents/pull/2231) [`040458e`](https://github.com/cloudflare/agents/commit/040458edb8f2c87a25e5ac446709054a5f553e14) Thanks [@mattzcarey](https://github.com/mattzcarey)! - `updateMessage()` detects unchanged messages from a stored content hash, cutting reads on large messages. See [Sessions](https://github.com/cloudflare/agents/blob/main/docs/agents/sessions.md). + +- [#2392](https://github.com/cloudflare/agents/pull/2392) [`4f26402`](https://github.com/cloudflare/agents/commit/4f2640204adb629fe6bf0143ed43e65fc6a46703) Thanks [@threepointone](https://github.com/threepointone)! - Settle approved tool calls that never ran once the conversation moves past them, so later turns don't send unresolved tool calls ([#2382](https://github.com/cloudflare/agents/issues/2382)). See [Human in the loop](https://github.com/cloudflare/agents/blob/main/docs/agents/human-in-the-loop.md). + +- [#2387](https://github.com/cloudflare/agents/pull/2387) [`9f70bc8`](https://github.com/cloudflare/agents/commit/9f70bc82db11b2a5ee9f5f8f3134991b21d21c55) Thanks [@threepointone](https://github.com/threepointone)! - Messenger replies hold the thread lock and retain queued follow-ups during slow delivery; typing updates are serialized and settle before reply text arrives. See [Think messengers](https://github.com/cloudflare/agents/blob/main/docs/think/messengers.md). + +- [#2417](https://github.com/cloudflare/agents/pull/2417) [`9906881`](https://github.com/cloudflare/agents/commit/99068812e5e91f039a15d0848e8e0bdf27177158) Thanks [@threepointone](https://github.com/threepointone)! - A regeneration interrupted by a restart now recovers on its own branch. See [Multi-chat](https://github.com/cloudflare/agents/blob/main/docs/think/multi-chat.md). + +- [#2403](https://github.com/cloudflare/agents/pull/2403) [`6b5b4a0`](https://github.com/cloudflare/agents/commit/6b5b4a0156249079b71d69214743c6a055958bef) Thanks [@threepointone](https://github.com/threepointone)! - Fix `useAgentChat` throwing "Maximum update depth exceeded" during long streamed answers ([#2217](https://github.com/cloudflare/agents/issues/2217)). See [Chat agents](https://github.com/cloudflare/agents/blob/main/docs/agents/chat-agents.md). + +- [#2366](https://github.com/cloudflare/agents/pull/2366) [`aaba6cb`](https://github.com/cloudflare/agents/commit/aaba6cbb66e9b0c35b2a7589a009e9cb3b7f44a1) Thanks [@ben-reitz](https://github.com/ben-reitz)! - With `storeTools: true`, oversized tool payloads are recorded with base64 data summarized instead of being dropped. See [Observability](https://github.com/cloudflare/agents/blob/main/docs/agents/observability.md). + +- [#2343](https://github.com/cloudflare/agents/pull/2343) [`a2f6f94`](https://github.com/cloudflare/agents/commit/a2f6f944bfc4a9e1c878e2f74822c9ef98c35857) Thanks [@threepointone](https://github.com/threepointone)! - Harden transient chat recovery across Think and AI Chat, including retry budgeting, cancellation, terminal error delivery, and recovery after restarts. See the [`agents/chat` recovery helpers](https://github.com/cloudflare/agents/blob/main/docs/think/lifecycle-hooks.md). + +- [#2024](https://github.com/cloudflare/agents/pull/2024) [`310c343`](https://github.com/cloudflare/agents/commit/310c3433f2a250a41cbb9208188499bd60a5f4d2) Thanks [@cjol](https://github.com/cjol)! - `deleteSubAgent` now closes the sub-agent's direct client connections, so late messages can't recreate it ([#2003](https://github.com/cloudflare/agents/issues/2003)). See [Sub-agents](https://github.com/cloudflare/agents/blob/main/docs/agents/sub-agents.md). + +- [#2339](https://github.com/cloudflare/agents/pull/2339) [`1edc989`](https://github.com/cloudflare/agents/commit/1edc989c82c58879c37ed8e81f5d6813fb4599eb) Thanks [@threepointone](https://github.com/threepointone)! - Truncate older tool results after model conversion so `toModelOutput` and provider-executed tools keep valid outputs ([#2014](https://github.com/cloudflare/agents/issues/2014)). See [Sessions](https://github.com/cloudflare/agents/blob/main/docs/agents/sessions.md). + +- [#2272](https://github.com/cloudflare/agents/pull/2272) [`5dbf6c2`](https://github.com/cloudflare/agents/commit/5dbf6c2e6bc99bc27154f8e66043cacb4473d180) Thanks [@mattzcarey](https://github.com/mattzcarey)! - `withX402Client` enforces `maxPaymentValue` against the payment requirement selected for signing, before signing or retrying the tool call. See [Pay from Agents SDK](https://developers.cloudflare.com/agents/tools/payments/x402/pay-from-agents-sdk/). + ## 0.24.0 ### Minor Changes diff --git a/vendor/agents/packages/agents/evals/README.md b/vendor/agents/packages/agents/evals/README.md deleted file mode 100644 index cc32f10..0000000 --- a/vendor/agents/packages/agents/evals/README.md +++ /dev/null @@ -1,9 +0,0 @@ -## evals for core agent functionality - -The scheduling eval uses Workers AI by default. Create -`packages/agents/evals/.env` with: - -```dotenv -CLOUDFLARE_ACCOUNT_ID= -CLOUDFLARE_API_TOKEN= -``` diff --git a/vendor/agents/packages/agents/evals/scheduling.eval.ts b/vendor/agents/packages/agents/evals/scheduling.eval.ts deleted file mode 100644 index e00f13b..0000000 --- a/vendor/agents/packages/agents/evals/scheduling.eval.ts +++ /dev/null @@ -1,356 +0,0 @@ -// import { anthropic } from "@ai-sdk/anthropic"; -// import { google } from "@ai-sdk/google"; -// import { openai } from "@ai-sdk/openai"; -import { createWorkersAI } from "workers-ai-provider"; -import { generateText, Output } from "ai"; -import { createScorer, evalite } from "evalite"; -import { - type Schedule, - getSchedulePrompt, - scheduleSchema -} from "../src/schedule"; - -const workersai = createWorkersAI({ - accountId: process.env.CLOUDFLARE_ACCOUNT_ID!, - apiKey: process.env.CLOUDFLARE_API_TOKEN! -}); - -const model = workersai("@cf/moonshotai/kimi-k2.7-code"); -// const model = openai("gpt-4o"); -// const model = google("gemini-2.0-pro-exp-02-05"); -// const model = google("gemini-2.0-flash"); -// const model = google("gemini-1.5-pro"); -// const model = anthropic("claude-3-5-sonnet-20240620"); - -function assert(condition: unknown, message: string): asserts condition { - if (!condition) { - throw new Error(message); - } -} - -// scorers -const getsType = createScorer({ - description: "Checks if the output is the right type", - name: "getsType", - scorer: ({ output, expected }) => { - return output.when.type === expected?.when.type ? 1 : 0; - } -}); - -const getsDetail = createScorer({ - description: "Checks if the output is the right detail", - name: "getsDetail", - scorer: ({ output, expected }) => { - switch (expected?.when.type) { - case "scheduled": { - assert( - output.when.type === "scheduled", - "Output is not a scheduled task" - ); - return output.when?.date === expected.when?.date ? 1 : 0; - } - case "delayed": { - assert(output.when.type === "delayed", "Output is not a delayed task"); - return output.when.delayInSeconds === expected.when.delayInSeconds - ? 1 - : 0; - } - case "cron": { - assert(output.when.type === "cron", "Output is not a cron task"); - return output.when.cron === expected.when.cron ? 1 : 0; - } - - case "no-schedule": { - assert( - output.when.type === "no-schedule", - "Output is not a no-schedule task" - ); - return 1; - } - default: - return 0; - } - } -}); - -const getsDescription = createScorer({ - description: "Checks if the output is the right description", - name: "getsDescription", - scorer: ({ input: _input, output, expected }) => { - return output.description.toLowerCase() === - expected?.description.toLowerCase() - ? 1 - : 0; - } -}); - -evalite("Evals for scheduling", { - // A function that returns an array of test data - data: async () => { - return [ - { - expected: { - description: "jump", - when: { delayInSeconds: 6, type: "delayed" } - }, - input: "jump in 6 seconds" - }, - { - expected: { - description: "meeting with team", - when: { - date: (() => { - const date = new Date(); - date.setDate(date.getDate() + 1); - date.setHours(14, 0, 0, 0); - return date.toISOString(); - })(), - type: "scheduled" - } - }, - input: "meeting with team at 2pm tomorrow" - }, - { - expected: { - description: "run backup", - when: { cron: "0 0 * * *", type: "cron" } - }, - input: "run backup every day at midnight" - }, - { - expected: { - description: "send report", - when: { delayInSeconds: 1800, type: "delayed" } - }, - input: "send report in 30 minutes" - }, - { - expected: { - description: "weekly team sync", - when: { cron: "0 10 * * 1", type: "cron" } - }, - input: "weekly team sync every Monday at 10am" - }, - { - expected: { - description: "just a task without timing", - when: { type: "no-schedule" } - }, - input: "just a task without timing" - }, - { - expected: { - description: "quarterly review", - when: { - date: new Date( - new Date().getFullYear(), - 2, - 15, - 9, - 0, - 0, - 0 - ).toISOString(), - type: "scheduled" - } - }, - input: "quarterly review on March 15th at 9am" - }, - { - expected: { - description: "clean database", - when: { cron: "0 3 * * 0", type: "cron" } - }, - input: "clean database every Sunday at 3am" - }, - { - expected: { - description: "process data", - when: { cron: "*/5 * * * *", type: "cron" } - }, - input: "process data every 5 minutes" - }, - { - expected: { - description: "run maintenance", - when: { cron: "0 2 1 * *", type: "cron" } - }, - input: "run maintenance at 2am every first day of month" - }, - { - expected: { - description: "send reminder", - when: { delayInSeconds: 7200, type: "delayed" } - }, - input: "send reminder in 2 hours" - }, - { - expected: { - description: "team meeting", - when: { - date: (() => { - const date = new Date(); - const daysUntilFriday = (5 - date.getDay() + 7) % 7; - date.setDate(date.getDate() + daysUntilFriday); - date.setHours(15, 30, 0, 0); - return date.toISOString(); - })(), - type: "scheduled" - } - }, - input: "team meeting next Friday at 3:30pm" - }, - { - expected: { - description: "backup database", - when: { cron: "0 */6 * * *", type: "cron" } - }, - input: "backup database every 6 hours" - }, - { - expected: { - description: "generate report", - when: { cron: "0 9 * * 1-5", type: "cron" } - }, - input: "generate report every weekday at 9am" - }, - { - expected: { - description: "check system", - when: { delayInSeconds: 15, type: "delayed" } - }, - input: "check system in 15 seconds" - }, - { - expected: { - description: "update cache", - when: { cron: "*/30 9-17 * * 1-5", type: "cron" } - }, - input: "update cache every 30 minutes during business hours" - }, - { - expected: { - description: "archive logs", - when: { cron: "0 0 * * 0,6", type: "cron" } - }, - input: "archive logs at midnight on weekends" - }, - { - expected: { - description: "sync data", - when: { delayInSeconds: 3600, type: "delayed" } - }, - input: "sync data in 1 hour" - }, - { - expected: { - description: "run health check", - when: { cron: "*/10 9-17 * * 1-5", type: "cron" } - }, - input: "run health check every 10 minutes during work hours" - }, - { - expected: { - description: "send daily digest", - when: { cron: "0 8 * * 1-5", type: "cron" } - }, - input: "send daily digest at 8am on weekdays" - }, - { - expected: { - description: "process invoices", - when: { cron: "*/15 9-17 * * 1-5", type: "cron" } - }, - input: "process invoices every 15 minutes during business hours" - }, - { - expected: { - description: "run backup", - when: { cron: "0 1,13 * * *", type: "cron" } - }, - input: "run backup at 1am and 1pm every day" - }, - { - expected: { - description: "check system status", - when: { delayInSeconds: 45, type: "delayed" } - }, - input: "check system status in 45 seconds" - }, - { - expected: { - description: "generate monthly report", - when: { cron: "0 6 1 * *", type: "cron" } - }, - input: "generate monthly report on the 1st at 6am" - }, - { - expected: { - description: "clean temp files", - when: { cron: "0 */2 * * *", type: "cron" } - }, - input: "clean temp files every 2 hours" - }, - { - expected: { - description: "sync data", - when: { cron: "0 9,17 * * 1-5", type: "cron" } - }, - input: "sync data at 9am and 5pm on weekdays" - }, - { - expected: { - description: "run maintenance", - when: { cron: "0 3 * * 0,6", type: "cron" } - }, - input: "run maintenance at 3am on weekends" - }, - { - expected: { - description: "archive old data", - when: { cron: "0 0 28-31 * *", type: "cron" } - }, - input: "archive old data at midnight on the last day of each month" - }, - { - expected: { - description: "send notification", - when: { delayInSeconds: 10800, type: "delayed" } - }, - input: "send notification in 3 hours" - }, - { - expected: { - description: "run diagnostics", - when: { cron: "0 2 * * 1-5", type: "cron" } - }, - input: "run diagnostics at 2am on weekdays" - }, - { - expected: { - description: "process logs", - when: { cron: "*/30 9-17 * * 1-5", type: "cron" } - }, - input: "process logs every 30 minutes during business hours" - } - ]; - }, - scorers: [getsType, getsDetail, getsDescription], - // The task to perform - task: async (input) => { - try { - const result = await generateText({ - maxRetries: 5, - model, - output: Output.object({ schema: scheduleSchema }), - prompt: `${getSchedulePrompt({ date: new Date() })} - -Input to parse: "${input}"` - }); - return result.output; - } catch (error) { - // Re-throw as plain Error so evalite's reporter can serialize it - throw new Error(error instanceof Error ? error.message : String(error)); - } - } -}); diff --git a/vendor/agents/packages/agents/evals/vite.config.ts b/vendor/agents/packages/agents/evals/vite.config.ts deleted file mode 100644 index 8906acd..0000000 --- a/vendor/agents/packages/agents/evals/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - setupFiles: ["dotenv/config"] - } -}); diff --git a/vendor/agents/packages/agents/package.json b/vendor/agents/packages/agents/package.json index d683cb3..e9ba172 100644 --- a/vendor/agents/packages/agents/package.json +++ b/vendor/agents/packages/agents/package.json @@ -9,7 +9,7 @@ "durable objects" ], "type": "module", - "version": "0.24.0", + "version": "0.26.0", "license": "MIT", "repository": { "directory": "packages/agents", @@ -34,9 +34,14 @@ "yaml": "^2.9.1" }, "devDependencies": { + "@ai-sdk/anthropic": "^4.0.0", + "@ai-sdk/openai": "^4.0.0", + "@ai-sdk/provider": "^4.0.0", "@ai-sdk/react": "^4.0.0", "@ai-sdk/valibot": "3.0.6", "@cloudflare/codemode": "workspace:*", + "@earendil-works/pi-ai": "^1.0.0", + "@earendil-works/pi-durable": "^1.0.0", "@modelcontextprotocol/client": "2.0.0", "@modelcontextprotocol/conformance-v2": "npm:@modelcontextprotocol/conformance@0.2.0-alpha.10", "@modelcontextprotocol/sdk": "1.30.0", @@ -56,8 +61,11 @@ "zod": "^4.6.4" }, "peerDependencies": { + "@ai-sdk/provider": "^4.0.0", "@ai-sdk/react": "^3.0.0 || ^4.0.0", "@cloudflare/codemode": ">=0.5.0", + "@earendil-works/pi-ai": "^1.0.0", + "@earendil-works/pi-durable": "^1.0.0", "@modelcontextprotocol/client": "2.0.0", "@modelcontextprotocol/sdk": "1.30.0", "@modelcontextprotocol/server": "2.0.0", @@ -72,12 +80,21 @@ "zod": "^4.0.0" }, "peerDependenciesMeta": { + "@ai-sdk/provider": { + "optional": true + }, "@ai-sdk/react": { "optional": true }, "@cloudflare/codemode": { "optional": true }, + "@earendil-works/pi-ai": { + "optional": true + }, + "@earendil-works/pi-durable": { + "optional": true + }, "@tanstack/ai": { "optional": true }, @@ -150,6 +167,11 @@ "import": "./dist/lifecycle/index.js", "require": "./dist/lifecycle/index.js" }, + "./harness/pi": { + "types": "./dist/harness/pi/index.d.ts", + "import": "./dist/harness/pi/index.js", + "require": "./dist/harness/pi/index.js" + }, "./agent-tools": { "types": "./dist/agent-tools.d.ts", "import": "./dist/agent-tools.js", @@ -185,6 +207,16 @@ "import": "./dist/observability/index.js", "require": "./dist/observability/index.js" }, + "./models/ai-sdk": { + "types": "./dist/models/ai-sdk/index.d.ts", + "import": "./dist/models/ai-sdk/index.js", + "require": "./dist/models/ai-sdk/index.js" + }, + "./models/pi-ai": { + "types": "./dist/models/pi-ai/index.d.ts", + "import": "./dist/models/pi-ai/index.js", + "require": "./dist/models/pi-ai/index.js" + }, "./observability/ai": { "types": "./dist/observability/ai/index.d.ts", "import": "./dist/observability/ai/index.js", @@ -295,6 +327,11 @@ "import": "./dist/browser/ai.js", "require": "./dist/browser/ai.js" }, + "./browser/ai-sdk": { + "types": "./dist/browser/ai-sdk.d.ts", + "import": "./dist/browser/ai-sdk.js", + "require": "./dist/browser/ai-sdk.js" + }, "./browser/tanstack-ai": { "types": "./dist/browser/tanstack-ai.d.ts", "import": "./dist/browser/tanstack-ai.js", @@ -423,7 +460,6 @@ }, "scripts": { "build": "tsx ./scripts/build.ts", - "evals": "(cd evals; evalite)", "test": "vitest --run", "test:node": "vitest --project node", "test:react": "vitest --project react", @@ -434,6 +470,7 @@ "test:browser": "vitest run --config src/browser-tests/vitest.config.ts", "test:workers": "vitest --project workers", "test:chat": "vitest --project chat", + "test:harness:pi": "vitest --project harness-pi", "test:webmcp": "vitest --project webmcp", "test:x402": "vitest --project x402", "test:e2e": "vitest --run -c src/e2e-tests/vitest.config.ts", diff --git a/vendor/agents/packages/agents/scripts/build.ts b/vendor/agents/packages/agents/scripts/build.ts index 9f53c32..901755b 100644 --- a/vendor/agents/packages/agents/scripts/build.ts +++ b/vendor/agents/packages/agents/scripts/build.ts @@ -10,6 +10,7 @@ const entries = [ "src/skills/index.ts", "src/skills/compile.ts", "src/lifecycle/index.ts", + "src/harness/pi/index.ts", "src/routing/index.ts", "src/chat/index.ts", "src/chat/transport.ts", @@ -21,6 +22,8 @@ const entries = [ "src/mcp/client/do-oauth-client-provider.ts", "src/mcp/client/x402.ts", "src/observability/index.ts", + "src/models/ai-sdk/index.ts", + "src/models/pi-ai/index.ts", "src/observability/ai/index.ts", "src/queue/index.ts", "src/schedules/index.ts", @@ -34,6 +37,7 @@ const entries = [ "src/codemode/ai.ts", "src/browser/index.ts", "src/browser/ai.ts", + "src/browser/ai-sdk.ts", "src/browser/tanstack-ai.ts", "src/experimental/webmcp.ts", "src/voice/index.ts", diff --git a/vendor/agents/packages/agents/src/agent-routing.ts b/vendor/agents/packages/agents/src/agent-routing.ts index e954055..d4cf60e 100644 --- a/vendor/agents/packages/agents/src/agent-routing.ts +++ b/vendor/agents/packages/agents/src/agent-routing.ts @@ -43,7 +43,7 @@ interface AgentRouteMatch { interface AgentRouteOptions< Env = Cloudflare.Env, - Props extends Record = Record + Props extends object = object > { /** URL prefix before the binding and instance name. Default: `agents`. */ prefix?: string; @@ -88,10 +88,7 @@ interface AgentRouteOptions< export type AgentOptions = AgentRouteOptions; /** Options for resolving and starting a named Agent. */ -export type AgentGetOptions< - Env, - Props extends Record = Record -> = Pick< +export type AgentGetOptions = Pick< AgentRouteOptions, "jurisdiction" | "locationHint" | "props" | "routingRetry" >; @@ -393,7 +390,7 @@ export async function routeAgentRequest( export async function getAgentByName< Env extends Cloudflare.Env = Cloudflare.Env, T extends Agent = Agent, - Props extends Record = Record + Props extends object = object >( namespace: DurableObjectNamespace, name: string, diff --git a/vendor/agents/packages/agents/src/agent-tool-types.ts b/vendor/agents/packages/agents/src/agent-tool-types.ts index 15f0c57..730a7ee 100644 --- a/vendor/agents/packages/agents/src/agent-tool-types.ts +++ b/vendor/agents/packages/agents/src/agent-tool-types.ts @@ -90,6 +90,41 @@ export const AGENT_TOOL_PROGRESS_PART = "data-agent-progress"; */ export const AGENT_TOOL_MILESTONE_PART = "data-agent-milestone"; +/** + * Whether a chunk body is a progress or milestone frame. These are broadcast + * but never written to the child's chunk store, so they have no stored-chunk + * position and must not take part in stored-position numbering or dedupe. + */ +export function isAgentToolLifecycleChunk(body: string): boolean { + if ( + !body.includes(AGENT_TOOL_PROGRESS_PART) && + !body.includes(AGENT_TOOL_MILESTONE_PART) + ) { + return false; + } + try { + const type = (JSON.parse(body) as { type?: unknown } | null)?.type; + return ( + type === AGENT_TOOL_PROGRESS_PART || type === AGENT_TOOL_MILESTONE_PART + ); + } catch { + return false; + } +} + +/** + * Whether a forwarded chunk has no stored-chunk position: a progress or + * milestone frame, or a chunk too large to store. Such chunks carry the next + * stored position without consuming it. + */ +export function isPositionlessAgentToolChunk( + chunk: AgentToolStoredChunk +): boolean { + return ( + chunk.unstoredId !== undefined || isAgentToolLifecycleChunk(chunk.body) + ); +} + /** * Ephemeral progress signal a running sub-agent emits with `reportProgress`. The * well-known fields drive generic UI (a bar + status line) with no per-app @@ -263,8 +298,19 @@ export type RunAgentToolOptions< * must outlive the spawning turn; cancel it explicitly via `cancelAgentTool`. */ detached?: boolean | DetachedAgentToolConfig; + /** + * Which child events reach the parent's clients. `"full"` (default) forwards + * every streamed chunk. `"terminal"` forwards only lifecycle events: started, + * progress and milestone frames, and the terminal event. The child still + * persists its whole stream, and the parent still tails it for completion, + * cancellation, progress and recovery. Use it for a headless parent with no + * client watching the child. Not supported with `detached`. + */ + eventDelivery?: AgentToolEventDelivery; }; +export type AgentToolEventDelivery = "full" | "terminal"; + /** * Result of dispatching a detached run. Returns immediately after dispatch * rather than after completion. @@ -375,12 +421,26 @@ export type AgentToolStoredChunk = { sequence: number; body: string; cursor?: AgentToolReplayCursor; + /** + * Set when the child broadcast this chunk but could not store it (it exceeds + * the stored-chunk size limit). The chunk is never replayed, so it carries + * the next stored position without consuming it and dedupes on this id. + */ + unstoredId?: string; }; export type AgentToolChildAdapter = { startAgentToolRun( input: Input, - options: { runId: string; signal?: AbortSignal } + options: { + runId: string; + signal?: AbortSignal; + /** + * `"terminal"` means no client is watching this run's chunks, so the + * child can skip broadcasting them. + */ + eventDelivery?: AgentToolEventDelivery; + } ): Promise>; /** A false acknowledgment confirms settlement; a void reply leaves it unknown. */ cancelAgentToolRun( @@ -389,7 +449,14 @@ export type AgentToolChildAdapter = { ): Promise; inspectAgentToolRun( runId: string, - options?: { includeChunks?: boolean } + options?: { + includeChunks?: boolean; + /** + * `false` reports the stored row as-is instead of first reconciling + * (and possibly sealing) a stale run. Defaults to `true`. + */ + reconcile?: boolean; + } ): Promise | null>; getAgentToolChunks( runId: string, @@ -421,6 +488,8 @@ export type AgentToolEvent = runId: string; body: string; cursor?: AgentToolReplayCursor; + /** See {@link AgentToolStoredChunk.unstoredId}. */ + unstoredId?: string; } | { kind: "snapshot"; diff --git a/vendor/agents/packages/agents/src/agent-tools.ts b/vendor/agents/packages/agents/src/agent-tools.ts index 1b4b6cd..7d15116 100644 --- a/vendor/agents/packages/agents/src/agent-tools.ts +++ b/vendor/agents/packages/agents/src/agent-tools.ts @@ -231,6 +231,7 @@ export type { AgentToolChildAdapter, AgentToolDisplayMetadata, AgentToolEvent, + AgentToolEventDelivery, AgentToolEventMessage, AgentToolEventState, AgentToolFailure, diff --git a/vendor/agents/packages/agents/src/browser-tests/browser.test.ts b/vendor/agents/packages/agents/src/browser-tests/browser.test.ts index 32aa622..540c025 100644 --- a/vendor/agents/packages/agents/src/browser-tests/browser.test.ts +++ b/vendor/agents/packages/agents/src/browser-tests/browser.test.ts @@ -17,7 +17,9 @@ function sleep(ms: number): Promise { function killProcessOnPort(port: number): void { try { - const output = execSync(`lsof -ti tcp:${port} 2>/dev/null || true`) + const output = execSync( + `lsof -ti tcp:${port} -sTCP:LISTEN 2>/dev/null || true` + ) .toString() .trim(); if (output) { @@ -192,6 +194,18 @@ type StoredSessions = Record< { sessionId: string; createdAt: number; updatedAt: number } >; +interface NamedRunOutput extends RunOutput { + report: { + restarted: boolean; + newTabs: Array<{ targetId: string; url?: string }>; + } | null; +} + +/** Run code against the persistent named browser. */ +async function runNamed(code: string): Promise { + return (await callAgent("runNamed", [code])) as NamedRunOutput; +} + async function run( code: string, mode: "one-shot" | "reuse" | "dynamic" = "one-shot" @@ -589,4 +603,211 @@ describe("browser connector e2e", () => { await callAgent("closeSession", ["reuse"]); }); }); + // The persistent named browser behind BrowserSessionConnector. These run + // against real Chrome, so they also check what the unit-test fake assumes. + describe("persistent named browser", () => { + afterAll(async () => { + await callAgent("closeNamed"); + }); + + const setTitle = (title: string) => `async () => { + await cdp.send({ + method: "Runtime.evaluate", + params: { expression: "document.title = '${title}'" }, + sessionId: "active" + }); + }`; + const readTitle = `async () => { + const { result } = await cdp.send({ + method: "Runtime.evaluate", + params: { expression: "document.title", returnByValue: true }, + sessionId: "active" + }); + return result.value; + }`; + + it("keeps the active tab's page between executions", async () => { + const first = await runNamed(setTitle("kept")); + expect(first.status).toBe("completed"); + + const second = await runNamed(readTitle); + expect(second.status).toBe("completed"); + expect(second.result).toBe("kept"); + expect(second.report?.restarted).toBe(false); + }); + + it("reports a popup as a new tab without switching to it", async () => { + await runNamed(setTitle("opener")); + const output = await runNamed(`async () => { + await cdp.send({ + method: "Runtime.evaluate", + params: { expression: "void window.open('about:blank', '_blank')", userGesture: true }, + sessionId: "active" + }); + }`); + expect(output.status).toBe("completed"); + expect(output.report?.newTabs).toHaveLength(1); + + const title = await runNamed(readTitle); + expect(title.result).toBe("opener"); + }); + + it("reports noopener popups as new tabs too", async () => { + await runNamed(setTitle("noopener-opener")); + // Chrome still sets openerId on these; only canAccessOpener is false. + const output = await runNamed(`async () => { + const open = (expression) => cdp.send({ + method: "Runtime.evaluate", + params: { expression, userGesture: true }, + sessionId: "active" + }); + await open("void window.open('about:blank#noopener', '_blank', 'noopener')"); + await open("(() => { const a = document.createElement('a'); a.href = 'about:blank#rel-noopener'; a.target = '_blank'; a.rel = 'noopener noreferrer'; document.body.appendChild(a); a.click(); })()"); + }`); + expect(output.status).toBe("completed"); + const urls = (output.report?.newTabs ?? []).map((tab) => tab.url); + expect(urls).toEqual( + expect.arrayContaining([ + "about:blank#noopener", + "about:blank#rel-noopener" + ]) + ); + }); + + it("keeps the active tab across a pause for approval", async () => { + const output = await runNamed(`async () => { + await cdp.send({ + method: "Runtime.evaluate", + params: { expression: "document.title = 'paused'" }, + sessionId: "active" + }); + await gate.confirm({ label: "continue" }); + const { result } = await cdp.send({ + method: "Runtime.evaluate", + params: { expression: "document.title", returnByValue: true }, + sessionId: "active" + }); + return result.value; + }`); + expect(output.status).toBe("paused"); + + const resumed = (await callAgent("approveNamed", [ + output.executionId + ])) as RunOutput; + expect(resumed.status).toBe("completed"); + expect(resumed.result).toBe("paused"); + }); + + it("passes a raw Target.attachToTarget through to Chrome", async () => { + await runNamed(setTitle("raw-attach")); + const output = await runNamed(`async () => { + const { targetInfos } = await cdp.send({ method: "Target.getTargets" }); + const page = targetInfos.find((t) => t.type === "page" && t.title === "raw-attach"); + const { sessionId } = await cdp.send({ + method: "Target.attachToTarget", + params: { targetId: page.targetId, flatten: true } + }); + const { result } = await cdp.send({ + method: "Runtime.evaluate", + params: { expression: "document.title", returnByValue: true }, + sessionId + }); + return { sessionId, title: result.value }; + }`); + expect(output.status).toBe("completed"); + const { sessionId, title } = output.result as { + sessionId: string; + title: string; + }; + expect(sessionId).not.toMatch(/^target:/); + expect(title).toBe("raw-attach"); + + const later = await runNamed(`async () => { + await cdp.send({ + method: "Runtime.evaluate", + params: { expression: "1" }, + sessionId: "${sessionId}" + }); + }`); + expect(later.status).toBe("error"); + expect(later.error).toContain("don't carry over between runs"); + }); + + it("doesn't report a tab opened with Target.createTarget as a popup", async () => { + const output = await runNamed(`async () => { + const { targetId } = await cdp.send({ + method: "Target.createTarget", + params: { url: "about:blank" } + }); + return targetId; + }`); + expect(output.status).toBe("completed"); + expect(output.report?.newTabs).toEqual([]); + }); + + it('teaches sessionId: "active" for a page command sent without one', async () => { + const output = await runNamed(`async () => { + await cdp.send({ method: "Runtime.evaluate", params: { expression: "1" } }); + }`); + expect(output.status).toBe("error"); + expect(output.error).toContain('sessionId: "active"'); + }); + + it("explains that a CDP event cannot be sent, using the live spec", async () => { + const output = await runNamed(`async () => { + await cdp.send({ method: "Page.loadEventFired" }); + }`); + expect(output.status).toBe("error"); + expect(output.error).toContain("CDP *event*"); + }); + + it("reattaches after the model detaches from the active tab", async () => { + await runNamed(setTitle("detached")); + const output = await runNamed(`async () => { + const { targetInfos } = await cdp.send({ method: "Target.getTargets" }); + await cdp.send({ + method: "Runtime.evaluate", + params: { expression: "1" }, + sessionId: "active" + }); + const page = targetInfos.find((t) => t.type === "page" && t.title === "detached"); + await cdp.send({ + method: "Target.detachFromTarget", + params: { targetId: page.targetId } + }); + const { result } = await cdp.send({ + method: "Runtime.evaluate", + params: { expression: "document.title", returnByValue: true }, + sessionId: "active" + }); + return result.value; + }`); + expect(output.status).toBe("completed"); + expect(output.result).toBe("detached"); + }); + + it("refuses to close the browser", async () => { + await runNamed(setTitle("survivor")); + const output = await runNamed(`async () => { + await cdp.send({ method: "Browser.close" }); + }`); + expect(output.status).toBe("error"); + expect(output.error).toContain("managed for you"); + + const after = await runNamed(readTitle); + expect(after.result).toBe("survivor"); + expect(after.report?.restarted).toBe(false); + }); + + it("reports restarted when the browser was replaced", async () => { + await runNamed(setTitle("lost")); + const key = (await callAgent("namedSessionKey")) as string; + await callAgent("corruptStoredSession", [key]); + + const output = await runNamed(readTitle); + expect(output.status).toBe("completed"); + expect(output.report?.restarted).toBe(true); + expect(output.result).not.toBe("lost"); + }); + }); }); diff --git a/vendor/agents/packages/agents/src/browser-tests/worker.ts b/vendor/agents/packages/agents/src/browser-tests/worker.ts index 6653234..4c14e05 100644 --- a/vendor/agents/packages/agents/src/browser-tests/worker.ts +++ b/vendor/agents/packages/agents/src/browser-tests/worker.ts @@ -9,10 +9,19 @@ import { type ProxyToolOutput } from "@cloudflare/codemode"; import { BrowserConnector } from "../browser/connector"; +import { + BrowserSessionConnector, + type BrowserExecutionReport +} from "../browser/session-connector"; +import { + Browser, + browserRun, + namedBrowserSessionKey +} from "../browser/browser"; import { DurableBrowserSessionStore, type StoredBrowserSession -} from "../browser/session-manager"; +} from "../browser/session-store"; import { listBrowserTargets, connectBrowserSession, @@ -32,6 +41,9 @@ type Env = { type SessionMode = "one-shot" | "reuse" | "dynamic"; +/** The named session the persistent-browser tests drive. */ +const NAMED_SESSION = "e2e"; + /** Approval-gated connector used to pause executions mid-run in tests. */ class GateConnector extends CodemodeConnector { name(): string { @@ -90,6 +102,62 @@ export class BrowserTestAgent extends Agent { )) as ProxyToolOutput; } + // ── Persistent named browser (BrowserSessionConnector) ── + + #namedBrowser(): Browser { + return new Browser({ + provider: browserRun(this.env.BROWSER), + name: NAMED_SESSION, + store: this.#store() + }); + } + + #namedConnector(): BrowserSessionConnector { + return new BrowserSessionConnector(this.ctx, { + browser: this.#namedBrowser() + }); + } + + #namedRuntime(connector: BrowserSessionConnector): CodemodeRuntimeHandle { + return createCodemodeRuntime({ + ctx: this.ctx, + executor: new DynamicWorkerExecutor({ loader: this.env.LOADER }), + connectors: [connector, new GateConnector(this.ctx, this.env)], + name: "browser-named" + }); + } + + /** Run code against the persistent browser; include the browser report. */ + @callable() + async runNamed( + code: string + ): Promise { + const connector = this.#namedConnector(); + const output = await this.#execute(this.#namedRuntime(connector), code); + return { + ...output, + report: connector.takeReport(output.executionId) ?? null + }; + } + + @callable() + async approveNamed(executionId: string) { + const connector = this.#namedConnector(); + return this.#namedRuntime(connector).approve({ executionId }); + } + + /** Close the persistent browser so it doesn't outlive the suite. */ + @callable() + async closeNamed(): Promise { + await this.#namedBrowser().close(); + } + + /** Storage key of the named session, for corruptStoredSession. */ + @callable() + async namedSessionKey(): Promise { + return namedBrowserSessionKey(NAMED_SESSION); + } + @callable() async run( code: string, diff --git a/vendor/agents/packages/agents/src/browser/ai-sdk.ts b/vendor/agents/packages/agents/src/browser/ai-sdk.ts new file mode 100644 index 0000000..bcf8bbb --- /dev/null +++ b/vendor/agents/packages/agents/src/browser/ai-sdk.ts @@ -0,0 +1,94 @@ +/** + * `agents/browser/ai-sdk` — the AI SDK tool for a persistent `Browser`. + * + * The older `createBrowserTools` stays in `agents/browser/ai`. + */ +import type { FlexibleSchema } from "ai"; +import { + browserReportNotes, + createBrowserToolCore, + type BrowserToolInput, + type BrowserToolOptions, + type BrowserToolOutput +} from "./browser-tool"; +import { + browserExecuteModelOutput, + type BrowserModelOutput +} from "./tool-helpers"; + +export type { + BrowserToolInput, + BrowserToolOptions, + BrowserToolOutput +} from "./browser-tool"; +export type { BrowserNewTab, BrowserSource } from "./session-connector"; + +// Stateless Quick Action tools, so one import covers both. +export { + createQuickActionTools, + type CreateQuickActionToolsOptions, + type QuickActionToolName +} from "./ai"; + +/** + * The AI SDK tool {@link browserTool} returns. Assignable to the AI SDK's + * `Tool`, and `execute` / `toModelOutput` are always present. + */ +export interface BrowserTool { + description: string; + inputSchema: FlexibleSchema; + execute( + input: BrowserToolInput, + options: unknown + ): Promise; + toModelOutput(options: { output: BrowserToolOutput }): BrowserModelOutput; +} + +/** + * Create an AI SDK tool that lets the model drive a persistent browser with + * JavaScript and the Chrome DevTools Protocol. + * + * The browser outlives each run: tabs, cookies, and logins carry over. The + * model never starts, closes, or resets it, and `sessionId: "active"` + * addresses the tab it last worked in. If the browser had to be replaced + * (it expired or was closed), the code still runs in the new browser and the + * result says `restarted: true`. + * + * Browser Run only (Chromium). Guardrails, `keepAliveMs`, and recording are + * set on the `Browser`'s provider. + * + * @example + * ```ts + * import { Browser, browserRun } from "agents/browser"; + * import { browserTool } from "agents/browser/ai-sdk"; + * + * export class MyAgent extends Agent { + * browser = new Browser({ provider: browserRun(this.env.BROWSER) }); + * + * constructor(ctx: AgentContext, env: Env) { + * super(ctx, env); + * this.lifecycle.use(this.browser); + * } + * + * async onChatMessage() { + * const tools = { + * browser: browserTool({ browser: this.browser, loader: this.env.LOADER }) + * }; + * // …pass `tools` to streamText / generateText + * } + * } + * ``` + */ +export function browserTool(options: BrowserToolOptions): BrowserTool { + const core = createBrowserToolCore(options, { + screenshotHint: + "Return screenshots as { type: 'browser_screenshot', mediaType: 'image/png', data: screenshot.data }; the UI keeps the image while the model receives a compact summary." + }); + return { + description: core.description, + inputSchema: core.inputSchema, + execute: core.execute, + toModelOutput: ({ output }) => + browserExecuteModelOutput(output, browserReportNotes(output)) + }; +} diff --git a/vendor/agents/packages/agents/src/browser/ai.ts b/vendor/agents/packages/agents/src/browser/ai.ts index a160633..7c0ef24 100644 --- a/vendor/agents/packages/agents/src/browser/ai.ts +++ b/vendor/agents/packages/agents/src/browser/ai.ts @@ -1,12 +1,10 @@ -import { tool, type JSONValue, type ToolSet } from "ai"; +import { tool, type ToolSet } from "ai"; import { z } from "zod"; import { createCodemodeRuntime, DynamicWorkerExecutor, - truncateResult, type CodemodeRuntimeHandle } from "@cloudflare/codemode"; -import { __DO_NOT_USE_WILL_BREAK__agentContext as agentContext } from "../internal_context"; import type { BrowserBinding } from "./browser-run"; import { browserContent, @@ -26,7 +24,12 @@ import { import { DurableBrowserSessionStore, type BrowserSessionStore -} from "./session-manager"; +} from "./session-store"; +import { + browserExecuteModelOutput, + resolveCtx, + transformBrowserResult +} from "./tool-helpers"; export interface CreateBrowserToolsOptions { /** @@ -143,188 +146,6 @@ export interface BrowserRuntime { let didWarnExperimental = false; let didDebugQuickActionSkip = false; -interface BrowserScreenshotOutput { - type: "browser_screenshot"; - mediaType: string; - data: string; -} - -function browserScreenshotOutput( - value: unknown -): BrowserScreenshotOutput | null { - const outer = - typeof value === "object" && value !== null - ? (value as Record) - : null; - const result = - outer && typeof outer.result === "object" && outer.result !== null - ? (outer.result as Record) - : outer; - if ( - result?.type !== "browser_screenshot" || - typeof result.mediaType !== "string" || - typeof result.data !== "string" - ) { - return null; - } - return result as unknown as BrowserScreenshotOutput; -} - -const BASE64_REDACTION_THRESHOLD = 4096; -const MAX_REDACTION_DEPTH = 20; -const MAX_REDACTION_NODES = 10_000; - -function base64Details( - value: string, - minimumLength = BASE64_REDACTION_THRESHOLD -): { - mediaType?: string; - chars: number; - bytes: number; -} | null { - if (value.length < minimumLength) return null; - - const dataUrl = - /^data:([^;,]+)(?:;[^;,]*)*;base64,([A-Za-z0-9+/]*={0,2})$/i.exec(value); - const encoded = dataUrl?.[2] ?? value; - if (encoded.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) { - return null; - } - - const padding = encoded.endsWith("==") ? 2 : encoded.endsWith("=") ? 1 : 0; - return { - mediaType: dataUrl?.[1], - chars: encoded.length, - bytes: (encoded.length / 4) * 3 - padding - }; -} - -function base64Redaction( - value: string, - mediaType?: string, - minimumLength?: number -): string { - const details = base64Details(value, minimumLength); - if (!details) return value; - const type = mediaType ?? details.mediaType; - return `[base64${type ? ` ${type}` : ""} data omitted: ${details.chars.toLocaleString()} chars, approximately ${details.bytes.toLocaleString()} bytes]`; -} - -function redactBase64Payloads(value: unknown): unknown { - const ancestors = new WeakSet(); - let nodes = 0; - - function visit(current: unknown, depth: number): unknown { - if (depth > MAX_REDACTION_DEPTH) return "[nested value omitted]"; - if (++nodes > MAX_REDACTION_NODES) return "[remaining values omitted]"; - if (typeof current === "string") return base64Redaction(current); - if (typeof current !== "object" || current === null) return current; - // Binary values cross the sandbox boundary as Uint8Array/ArrayBuffer — - // walking them would rebuild them as index-keyed plain objects. The same - // is true of Date/Map/Set, whose own enumerable entries are empty. - if ( - current instanceof ArrayBuffer || - ArrayBuffer.isView(current) || - current instanceof Date || - current instanceof Map || - current instanceof Set - ) { - return current; - } - if (ancestors.has(current)) return "[circular reference omitted]"; - - ancestors.add(current); - try { - if (Array.isArray(current)) { - return current.map((entry) => visit(entry, depth + 1)); - } - - const record = current as Record; - const screenshot = - record.type === "browser_screenshot" && - typeof record.mediaType === "string"; - return Object.fromEntries( - Object.entries(record).map(([key, entry]) => [ - key, - screenshot && key === "data" && typeof entry === "string" - ? base64Redaction(entry, record.mediaType as string, 0) - : visit(entry, depth + 1) - ]) - ); - } finally { - ancestors.delete(current); - } - } - - return visit(value, 0); -} - -function transformBrowserResult(value: unknown): unknown { - // Keep canonical screenshot output intact for UIMessage persistence and the - // chat renderer. Other results are redacted before truncation so a nested - // binary payload cannot become a large serialized preview. - return browserScreenshotOutput(value) - ? value - : truncateResult(redactBase64Payloads(value)); -} - -function browserExecuteModelOutput( - output: unknown -): { type: "text"; value: string } | { type: "json"; value: JSONValue } { - const screenshot = browserScreenshotOutput(output); - if (screenshot) { - const approximateBytes = Math.floor((screenshot.data.length * 3) / 4); - return { - type: "text", - value: `Screenshot captured successfully (${screenshot.mediaType}, approximately ${approximateBytes.toLocaleString()} bytes); the image is kept for the UI and omitted here.` - }; - } - - // `calls` is the durable audit log; like the codemode tool's own projection, - // it stays on the persisted part and never enters the model's context, and - // the sandbox `logs` are bounded like a result. - const modelFacing = - typeof output === "object" && output !== null && !Array.isArray(output) - ? (({ calls: _calls, ...rest }: { calls?: unknown; logs?: unknown }) => ({ - ...rest, - ...(Array.isArray(rest.logs) - ? { logs: truncateResult(rest.logs) } - : {}) - }))(output) - : output; - const redacted = redactBase64Payloads(modelFacing); - try { - const serialized = JSON.stringify(redacted); - return { - type: "json", - value: - serialized === undefined ? null : (JSON.parse(serialized) as JSONValue) - }; - } catch { - return { - type: "text", - value: - "Browser execution completed, but its result could not be serialized for model context." - }; - } -} - -/** - * The Durable Object state to build the runtime in: the explicit `ctx` if - * given, otherwise the current Agent's `ctx` (via `getCurrentAgent()`), so - * `createBrowserRuntime` can be called from an Agent method without threading - * `this.ctx` through. - */ -function resolveCtx( - options: CreateBrowserToolsOptions -): DurableObjectState | undefined { - if (options.ctx) return options.ctx; - const agent = agentContext.getStore()?.agent as - | { ctx?: DurableObjectState } - | undefined; - return agent?.ctx; -} - function connectorOptions( options: CreateBrowserToolsOptions, ctx: DurableObjectState diff --git a/vendor/agents/packages/agents/src/browser/browser-run.ts b/vendor/agents/packages/agents/src/browser/browser-run.ts index fa4c645..432a5cc 100644 --- a/vendor/agents/packages/agents/src/browser/browser-run.ts +++ b/vendor/agents/packages/agents/src/browser/browser-run.ts @@ -1,4 +1,4 @@ -import { CdpSession } from "./cdp-session"; +import { CdpConnection } from "./cdp-connection"; /** * A Browser Rendering binding. Structural so it accepts both the classic @@ -9,6 +9,24 @@ export interface BrowserBinding { fetch(input: RequestInfo | URL, init?: RequestInit): Promise; } +/** + * Browser Run [hostname guardrails](https://developers.cloudflare.com/browser-run/features/guardrails/): + * restrict which hostnames the session's HTTP/HTTPS requests may reach. Fixed + * at session launch for every connection to the session, including Live View. + * Omitted entirely, the platform default applies: all hostnames are allowed. + * Not supported by Kitesurf. + */ +export interface BrowserSessionGuardrails { + /** + * Hostname patterns the browser may request — bare hostnames only (no + * protocol, port, or path). `*.example.com` matches subdomains; add + * `example.com` separately to allow the apex. + */ + allowedDomains?: string[]; + /** Named Cloudflare-maintained domain sets, e.g. `"common-cdns"`. */ + allowedDomainSets?: string[]; +} + export interface BrowserTargetInfo { id: string; type?: string; @@ -25,7 +43,10 @@ export interface BrowserSessionInfo { webSocketDebuggerUrl?: string; } -export interface ConnectBrowserOptions { +/** {@link connectBrowser} options for the default Chromium engine. */ +export interface ConnectChromiumBrowserOptions { + /** Select the browser engine. Defaults to Chromium. */ + browser?: "chromium"; timeoutMs?: number; keepAliveMs?: number; includeTargets?: boolean; @@ -36,13 +57,27 @@ export interface ConnectBrowserOptions { * {@link getBrowserRecording}. */ recording?: boolean; - /** - * Select the browser engine. Defaults to Chromium. Use `"kitesurf"` for - * Cloudflare's connection-scoped, agent-first browser engine. - */ - browser?: "kitesurf"; } +/** + * {@link connectBrowser} options for Kitesurf, Cloudflare's connection-scoped, + * agent-first browser engine. A Kitesurf browser lives and dies with its + * WebSocket, so the Chromium-only options (`keepAliveMs`, `includeTargets`, + * `recording`) do not exist on this arm. + */ +export interface ConnectKitesurfBrowserOptions { + browser: "kitesurf"; + timeoutMs?: number; +} + +/** + * Engine-discriminated {@link connectBrowser} options: selecting + * `browser: "kitesurf"` removes the Chromium-only options at the type level. + */ +export type ConnectBrowserOptions = + | ConnectChromiumBrowserOptions + | ConnectKitesurfBrowserOptions; + /** An rrweb session recording for a closed Browser Run session. */ export interface BrowserRecording { sessionId: string; @@ -65,6 +100,17 @@ export class BrowserRenderingError extends Error { } } +/** + * Whether an error means the platform session is gone: Browser Run uses 404 + * for unknown ids and 410 after `keep_alive` expiry. + */ +export function isMissingBrowserSession(error: unknown): boolean { + return ( + error instanceof BrowserRenderingError && + (error.status === 404 || error.status === 410) + ); +} + function browserSessionEndpoint( sessionId?: string, options?: { @@ -128,11 +174,22 @@ export async function createBrowserSession( keepAliveMs?: number; includeTargets?: boolean; recording?: boolean; + guardrails?: BrowserSessionGuardrails; } ): Promise { + // Guardrails ride the acquire request's JSON body (the query string only + // carries scalar options). The endpoint accepts an empty `{}` body — + // verified against the live acquire API — so the request shape stays + // uniform whether or not guardrails are set. const response = await browser.fetch( browserSessionEndpoint(undefined, options), - { method: "POST" } + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify( + options?.guardrails ? { guardrails: options.guardrails } : {} + ) + } ); if (!response.ok) { @@ -187,30 +244,37 @@ export async function deleteBrowserSession( export async function connectBrowser( browser: BrowserBinding, options?: number | ConnectBrowserOptions -): Promise { - const normalizedOptions = +): Promise { + const normalizedOptions: ConnectBrowserOptions = typeof options === "number" ? { timeoutMs: options } : (options ?? {}); - const isKitesurf = normalizedOptions.browser === "kitesurf"; - if ( - isKitesurf && - (normalizedOptions.keepAliveMs || - normalizedOptions.includeTargets || - normalizedOptions.recording) - ) { - throw new Error( - "Kitesurf does not support keepAliveMs, includeTargets, or recording" - ); + if (normalizedOptions.browser === "kitesurf") { + // The options union already rejects these at the type level for literal + // call sites; plain-JS callers and spreads can still smuggle them in. + // Explicitly disabled values are tolerated but never sent — `keep_alive=0` + // is not a valid Kitesurf query parameter. + const smuggled = normalizedOptions as { + keepAliveMs?: number; + includeTargets?: boolean; + recording?: boolean; + }; + if (smuggled.keepAliveMs || smuggled.includeTargets || smuggled.recording) { + throw new Error( + "Kitesurf does not support keepAliveMs, includeTargets, or recording" + ); + } } const response = await browser.fetch( - browserSessionEndpoint(undefined, { - // Explicitly disabled Chromium-only options are accepted but never sent: - // `keep_alive=0` is not a valid Kitesurf query parameter. - keepAliveMs: isKitesurf ? undefined : normalizedOptions.keepAliveMs, - includeTargets: normalizedOptions.includeTargets, - recording: normalizedOptions.recording, - browser: normalizedOptions.browser - }), + browserSessionEndpoint( + undefined, + normalizedOptions.browser === "kitesurf" + ? { browser: "kitesurf" } + : { + keepAliveMs: normalizedOptions.keepAliveMs, + includeTargets: normalizedOptions.includeTargets, + recording: normalizedOptions.recording + } + ), { headers: { Upgrade: "websocket" } } ); @@ -227,7 +291,7 @@ export async function connectBrowser( // an ID for analytics correlation, but it cannot be used with the // session-scoped reconnect or delete endpoints. ws.accept(); - return new CdpSession(ws, normalizedOptions.timeoutMs); + return new CdpConnection(ws, { timeoutMs: normalizedOptions.timeoutMs }); } const sessionId = response.headers.get("cf-browser-session-id"); @@ -238,10 +302,9 @@ export async function connectBrowser( } ws.accept(); - return new CdpSession( - ws, - normalizedOptions.timeoutMs, - () => { + return new CdpConnection(ws, { + timeoutMs: normalizedOptions.timeoutMs, + onClose: () => { deleteBrowserSession(browser, sessionId).catch((error: unknown) => { console.warn( `[agents/browser] Failed to delete one-shot Browser Run session ${sessionId}`, @@ -250,7 +313,7 @@ export async function connectBrowser( }); }, sessionId - ); + }); } /** @@ -299,25 +362,159 @@ export async function getBrowserRecording(options: { return recording as BrowserRecording; } +export interface ConnectBrowserSessionOptions { + timeoutMs?: number; + /** + * Invoked once when the returned {@link CdpConnection} reaches a terminal + * state — an explicit `close()`, peer closure, or a socket error. The + * session itself is never deleted on close — pass an `onClose` that + * deletes it for one-shot (create-and-close) semantics. + */ + onClose?: () => void; + /** + * Invoked on every CDP command sent over the returned {@link CdpConnection} — + * an activity signal for idle tracking. Keep it cheap and synchronous; + * throttle any I/O it triggers. + */ + onActivity?: () => void; +} + /** * Connect to an existing Browser Rendering session without deleting it on close. */ +export async function connectBrowserSession( + browser: BrowserBinding, + sessionId: string, + options?: ConnectBrowserSessionOptions +): Promise; +/** + * @deprecated Pass `{ timeoutMs }` instead of a bare number — the numeric + * form will be removed. + */ export async function connectBrowserSession( browser: BrowserBinding, sessionId: string, timeoutMs?: number -): Promise { +): Promise; +export async function connectBrowserSession( + browser: BrowserBinding, + sessionId: string, + options?: number | ConnectBrowserSessionOptions +): Promise { + const normalized = + typeof options === "number" ? { timeoutMs: options } : (options ?? {}); const response = await browser.fetch(browserSessionEndpoint(sessionId), { headers: { Upgrade: "websocket" } }); const ws = response.webSocket; if (!ws) { - throw new Error( - `Browser Rendering binding did not return a WebSocket for session ${sessionId}` + // Carry the upgrade status: a 404/410 here means the browser expired + // after the caller last saw it alive (see isMissingBrowserSession). + throw new BrowserRenderingError( + `Browser Rendering binding did not return a WebSocket for session ${sessionId} (${response.status})`, + response.status ); } ws.accept(); - return new CdpSession(ws, timeoutMs, undefined, sessionId); + return new CdpConnection(ws, { + timeoutMs: normalized.timeoutMs, + onClose: normalized.onClose, + sessionId, + onActivity: normalized.onActivity + }); +} + +/** One-shot session options for the default Chromium engine. */ +export interface OneShotChromiumSessionOptions { + /** Select the browser engine. Defaults to Chromium. */ + browser?: "chromium"; + timeoutMs?: number; + /** Platform `keep_alive` in milliseconds. */ + keepAliveMs?: number; + /** Opt into Browser Run session recording (rrweb capture). */ + recording?: boolean; + /** Hostname guardrails, fixed at launch. */ + guardrails?: BrowserSessionGuardrails; +} + +/** + * One-shot session options for Kitesurf. The Chromium-only options — + * `guardrails`, `keepAliveMs`, `recording` — do not exist on this arm: + * Kitesurf does not support them. + */ +export interface OneShotKitesurfSessionOptions { + browser: "kitesurf"; + timeoutMs?: number; +} + +/** + * Engine-discriminated {@link openOneShotBrowserSession} options: selecting + * `browser: "kitesurf"` removes the Chromium-only options at the type level. + */ +export type OneShotBrowserSessionOptions = + | OneShotChromiumSessionOptions + | OneShotKitesurfSessionOptions; + +/** + * Open a one-shot browser session: create, connect, and delete the platform + * session when the returned {@link CdpConnection} closes. No store involved — + * one-shot sessions have no name and no durability. + */ +export async function openOneShotBrowserSession( + browser: BrowserBinding, + options: OneShotBrowserSessionOptions = {} +): Promise { + if (options.browser === "kitesurf") { + // The options union already rejects these at the type level for literal + // call sites; plain-JS callers and spreads can still smuggle them in, so + // fail loudly in one place with one message. + const smuggled = options as { + guardrails?: unknown; + keepAliveMs?: unknown; + recording?: unknown; + }; + if (smuggled.guardrails || smuggled.keepAliveMs || smuggled.recording) { + throw new Error( + "Kitesurf does not support guardrails, keepAliveMs, or recording" + ); + } + // Kitesurf browsers are scoped to their WebSocket — connectBrowser is + // already one-shot there. + return connectBrowser(browser, { + browser: "kitesurf", + timeoutMs: options.timeoutMs + }); + } + + const info = await createBrowserSession(browser, { + keepAliveMs: options.keepAliveMs, + recording: options.recording, + guardrails: options.guardrails + }); + try { + return await connectBrowserSession(browser, info.sessionId, { + timeoutMs: options.timeoutMs, + onClose: () => { + deleteBrowserSession(browser, info.sessionId).catch( + (error: unknown) => { + console.warn( + `[agents/browser] Failed to delete one-shot Browser Run session ${info.sessionId}`, + error + ); + } + ); + } + }); + } catch (error) { + // The session was allocated but never got its delete-on-close owner — + // reclaim it now instead of leaving it to expire. + try { + await deleteBrowserSession(browser, info.sessionId); + } catch { + // Best-effort: keep_alive expiry reclaims it. + } + throw error; + } } diff --git a/vendor/agents/packages/agents/src/browser/browser-tool.ts b/vendor/agents/packages/agents/src/browser/browser-tool.ts new file mode 100644 index 0000000..3179c3f --- /dev/null +++ b/vendor/agents/packages/agents/src/browser/browser-tool.ts @@ -0,0 +1,160 @@ +/** + * The harness-neutral core of `browserTool`, shared by the AI SDK + * (`agents/browser/ai-sdk`) and TanStack AI (`agents/browser/tanstack-ai`) + * adapters. Internal — not an entry point. + */ +import { + createCodemodeRuntime, + DynamicWorkerExecutor, + type ProxyToolOutput +} from "@cloudflare/codemode"; +import { + BrowserSessionConnector, + type BrowserExecutionReport, + type BrowserNewTab, + type BrowserSource +} from "./session-connector"; +import { resolveCtx, transformBrowserResult } from "./tool-helpers"; + +export interface BrowserToolOptions { + /** + * The browser the tool drives — usually a `Browser` installed on the + * host's Lifecycle. Tools built from the same `Browser` share it. + */ + browser: BrowserSource; + + /** + * WorkerLoader binding for sandboxed code execution. + * + * Requires `"worker_loaders": [{ "binding": "LOADER" }]` in wrangler.jsonc. + */ + loader: WorkerLoader; + + /** Sandbox execution timeout in milliseconds. Defaults to 30000 (30s). */ + timeoutMs?: number; + + /** + * Durable Object state for the codemode runtime facet. Optional inside an + * Agent (resolved via `getCurrentAgent()`); pass it explicitly elsewhere. + * + * The worker must export the `CodemodeRuntime` class (the + * `@cloudflare/codemode/vite` plugin does this automatically, or add + * `export { CodemodeRuntime } from "@cloudflare/codemode"` to your entry). + */ + ctx?: DurableObjectState; +} + +/** The model's input to `browserTool`: JavaScript to run. */ +export interface BrowserToolInput { + code: string; +} + +/** + * The result of one `browserTool` run: the codemode execution result, + * plus what happened to the browser. + */ +export type BrowserToolOutput = ProxyToolOutput & { + /** The browser was replaced before this run; earlier tabs are gone. */ + restarted?: true; + /** A sentence telling the model what `restarted` means for it. */ + notice?: string; + /** Tabs the page opened itself (popups, `target=_blank` links). */ + newTabs?: BrowserNewTab[]; +}; + +const RESTARTED_NOTICE = + "The browser was restarted before this run (it expired or was closed): earlier tabs, logins, and page state are gone. Your code ran in a fresh browser — navigate again before relying on page state."; + +/** + * A codemode runtime name per browser. Browser names are host-chosen and + * unrestricted; runtime names allow only `[a-zA-Z0-9_.-]`, so anything else + * (including `.`, the escape) is hex-escaped. + */ +function browserRuntimeName(name: string): string { + const escaped = name.replace( + /[^a-zA-Z0-9_-]/g, + (char) => `.${char.codePointAt(0)?.toString(16)}.` + ); + return `browser-tool_${escaped}`; +} + +/** Add what happened to the browser to the codemode result. */ +function withBrowserReport( + output: ProxyToolOutput, + report: BrowserExecutionReport | undefined +): BrowserToolOutput { + if (!report) return output; + return { + ...output, + ...(report.restarted + ? { restarted: true as const, notice: RESTARTED_NOTICE } + : {}), + ...(report.newTabs.length > 0 ? { newTabs: report.newTabs } : {}) + }; +} + +/** Report sentences that must survive a screenshot's text summary. */ +export function browserReportNotes(output: BrowserToolOutput): string[] { + const notes: string[] = []; + if (output.notice) notes.push(output.notice); + if (output.newTabs?.length) { + notes.push( + `New tabs opened by the page: ${JSON.stringify(output.newTabs)}` + ); + } + return notes; +} + +/** + * Build the codemode runtime and connector for one `browserTool`, and wrap + * `execute` so each result carries the browser report. + */ +export function createBrowserToolCore( + options: BrowserToolOptions, + adapter: { + /** What the adapter does with screenshots, told to the model. */ + screenshotHint: string; + } +) { + const ctx = resolveCtx(options); + if (!ctx) { + throw new Error( + "browserTool requires a Durable Object 'ctx' — pass it explicitly, or call from within an Agent so it can be resolved via getCurrentAgent()" + ); + } + + const connector = new BrowserSessionConnector(ctx, { + browser: options.browser + }); + const runtime = createCodemodeRuntime({ + ctx, + executor: new DynamicWorkerExecutor({ + loader: options.loader, + timeout: options.timeoutMs + }), + connectors: [connector], + name: browserRuntimeName(options.browser.name), + transformResult: transformBrowserResult + }); + + const codemodeTool = runtime.tool({ + connectorHints: { + cdp: `A persistent browser over CDP — tabs and logins carry over between runs. Use sessionId: "active" for page commands. ${adapter.screenshotHint}` + } + }); + + return { + description: codemodeTool.description, + inputSchema: codemodeTool.inputSchema, + execute: async ( + input: BrowserToolInput, + executeOptions?: unknown + ): Promise => { + const output = await codemodeTool.execute(input, executeOptions); + return withBrowserReport( + output, + connector.takeReport(output.executionId) + ); + } + }; +} diff --git a/vendor/agents/packages/agents/src/browser/browser.ts b/vendor/agents/packages/agents/src/browser/browser.ts new file mode 100644 index 0000000..95495c8 --- /dev/null +++ b/vendor/agents/packages/agents/src/browser/browser.ts @@ -0,0 +1,578 @@ +/** + * `Browser`: one named, persistent browser for an agent or Durable Object. + * + * Its tabs and logins survive between agent runs. When the browser is lost + * (closed, idle past `keep_alive`, or crashed), the next use starts a fresh + * one and reports `restarted: true` so the model knows its earlier state is + * gone. + * + * Browser Run is the only provider today; see {@link browserRun}. + */ + +import { LifecycleCapability } from "../lifecycle/capability"; +import type { CdpConnection } from "./cdp-connection"; +import { + type BrowserBinding, + type BrowserSessionGuardrails, + connectBrowserSession, + createBrowserSession, + deleteBrowserSession, + isMissingBrowserSession, + listBrowserTargets +} from "./browser-run"; +import { + createLiveView, + type BrowserLiveView, + type LiveViewMode +} from "./live-view"; +import { + DurableBrowserSessionStore, + type BrowserSessionStore, + type StoredBrowserSession +} from "./session-store"; +import { loadCdpSpec, type SearchableCdpSpec } from "./spec"; + +/** + * Browser Run's server-side `keep_alive` maximum (600 seconds). A `Browser` + * pins keep-alive here by default so it survives quiet spells between agent + * turns; the platform reclaims it only after this long idle. + */ +export const BROWSER_SESSION_KEEP_ALIVE_MAX_MS = 600_000; + +/** + * Minimum interval between store `updatedAt` refreshes driven by CDP traffic + * on connections returned by {@link Browser.connect}. + */ +export const SESSION_TOUCH_INTERVAL_MS = 60_000; + +/** The browser name used when a host doesn't pick one. */ +export const DEFAULT_BROWSER_NAME = "default"; + +const NAMED_SESSION_KEY_PREFIX = "browser:session:"; + +/** The store key holding the named browser's current record. */ +export function namedBrowserSessionKey(name: string): string { + return `${NAMED_SESSION_KEY_PREFIX}${name}`; +} + +/** + * Where a closed or lost browser's record moves: permanent evidence that the + * name once owned a browser, so a later resolve reports `restarted: true`. + * Kept outside {@link NAMED_SESSION_KEY_PREFIX} so listing that prefix + * yields only names that currently own a browser. Grows with the number of + * distinct names the host has ever used. + */ +const RETIRED_SESSION_KEY_PREFIX = "browser:retired:"; + +function retiredBrowserSessionKey(name: string): string { + return `${RETIRED_SESSION_KEY_PREFIX}${name}`; +} + +/** + * Browser Run settings applied every time a browser is created — including + * when a lost browser is replaced — so options like guardrails survive a + * restart. + */ +export interface BrowserRunOptions { + /** + * Platform `keep_alive` in milliseconds: how long an idle browser lives. + * Defaults to {@link BROWSER_SESSION_KEEP_ALIVE_MAX_MS} (the platform + * maximum). + */ + keepAliveMs?: number; + /** Opt into Browser Run session recording (rrweb capture). */ + recording?: boolean; + /** Hostname guardrails, fixed at launch for every connection. */ + guardrails?: BrowserSessionGuardrails; +} + +/** A {@link Browser} provider backed by Cloudflare Browser Run. */ +export interface BrowserRunProvider { + readonly kind: "browser-run"; + readonly binding: BrowserBinding; + readonly options: BrowserRunOptions; +} + +/** Where a {@link Browser} gets its browser from. */ +export type BrowserProvider = BrowserRunProvider; + +/** + * Run the browser on Cloudflare Browser Run. + * + * @example + * ```ts + * new Browser({ provider: browserRun(env.BROWSER, { recording: true }) }); + * ``` + */ +export function browserRun( + binding: BrowserBinding, + options: BrowserRunOptions = {} +): BrowserRunProvider { + return { kind: "browser-run", binding, options }; +} + +export interface BrowserOptions { + /** Where the browser runs. Create one with {@link browserRun}. */ + provider: BrowserProvider; + /** + * Which browser this is. Two `Browser` objects on the same Durable Object + * need different names. Defaults to {@link DEFAULT_BROWSER_NAME}. + */ + name?: string; + /** + * Where the browser's record lives. Defaults to a + * {@link DurableBrowserSessionStore} over the host object's storage, which + * requires installing the `Browser` with `Lifecycle.use()`. Passing a store + * lets the `Browser` work without Lifecycle. + */ + store?: BrowserSessionStore; + /** Default CDP command timeout for {@link Browser.connect}. */ + timeoutMs?: number; + /** + * Minimum interval between activity-driven `updatedAt` refreshes. + * Defaults to {@link SESSION_TOUCH_INTERVAL_MS}, capped at half the + * keep-alive window. + * + * @internal For tests. + */ + touchIntervalMs?: number; +} + +export interface ResolvedBrowser { + name: string; + /** The Browser Run session id — host-side only, never model-visible. */ + sessionId: string; + /** + * `true` when this resolution had to create a fresh browser to replace one + * that previously existed (was closed, or expired or died upstream). Page + * state from the prior browser is gone; surface this loudly to the model. + * `false` only on first-ever use of the name — nothing was lost. + */ + restarted: boolean; + createdAt: number; + updatedAt: number; + /** + * The tab the agent last worked in, when one was recorded for this + * browser. Absent on a browser this resolution created; a replacement a + * concurrent caller already created and used may carry one. + */ + activeTargetId?: string; +} + +export interface BrowserConnection { + name: string; + sessionId: string; + /** + * `true` when the browser this caller resolved is gone, even if a + * concurrent caller already replaced it. See + * {@link ResolvedBrowser.restarted}. + */ + restarted: boolean; + /** See {@link ResolvedBrowser.activeTargetId}. */ + activeTargetId?: string; + /** Closing this connection does NOT close the browser. */ + cdp: CdpConnection; + /** + * Record the tab the agent is working in (or clear it with `undefined`). + * Never resurrects: returns `false` when the browser was closed or + * replaced since this connection resolved it. + */ + setActiveTarget(targetId: string | undefined): Promise; + /** + * The Chrome DevTools Protocol description this browser serves, read from + * the browser itself (cached per binding). + */ + spec(): Promise; +} + +/** + * One named, persistent browser. + * + * Install it with `Lifecycle.use()` — on an Agent subclass or any Durable + * Object that composes `Lifecycle` — and it stores its record in the + * object's own storage. It schedules nothing: Browser Run reclaims idle + * browsers itself once `keep_alive` elapses, and the next use replaces the + * lost browser with `restarted: true`. + * + * Everything here is host-side. Models never see browser names, Browser Run + * ids, or Live View URLs through this surface. + * + * Store discipline: locks wrap storage operations only — liveness probes and + * Browser Run create/delete calls always happen outside any lock, with a + * commit re-check to detect concurrent swaps. + * + * @experimental The API surface may change before stabilizing. + */ +export class Browser extends LifecycleCapability { + /** Which browser this is; see {@link BrowserOptions.name}. */ + readonly name: string; + readonly #options: BrowserOptions; + readonly #key: string; + #store?: BrowserSessionStore; + + constructor(options: BrowserOptions) { + const name = options.name ?? DEFAULT_BROWSER_NAME; + super(`browser:${name}`); + if (name.trim() === "") { + throw new Error("Browser names must be non-empty"); + } + this.name = name; + this.#options = options; + this.#key = namedBrowserSessionKey(name); + } + + /** + * Reattach to the browser when it is still alive, otherwise create a fresh + * one. See {@link ResolvedBrowser.restarted} for the mortality signal. + */ + async resolve(): Promise { + const { name } = this; + const key = this.#key; + + // Dead-browser recovery consumes two attempts (retire, then create). + for (let attempt = 0; attempt < 4; attempt++) { + const existing = await this.#readStored(); + + if (existing === undefined) { + // No browser on record: create one. The commit reports whether the + // name was ever used before (see #createAndCommit). + const { session, restarted } = await this.#createAndCommit(); + return { name, restarted, ...session }; + } + + // Live entry on record — probe it outside any lock. + const alive = await this.#isAlive(existing); + const lock = await this.#sessionStore.acquireLock(key); + try { + const current = await this.#sessionStore.get(key); + if (current?.sessionId !== existing.sessionId) { + continue; // swapped or retired while we probed — revalidate + } + if (alive) { + const refreshed = { ...current, updatedAt: Date.now() }; + await this.#sessionStore.set(key, refreshed); + return { name, restarted: false, ...refreshed }; + } + // The browser died upstream (expired or reclaimed). Retire the + // record under this lock, so any resolver that reads it during the + // replacement window sees the marker and reports restarted: true + // too. + await this.#retire(current); + } finally { + await lock.release(); + } + // Re-enter the loop: the next attempt takes the create path. + } + + throw new Error(`Browser "${name}" kept changing concurrently — retry`); + } + + /** + * Resolve the browser and open a CDP connection to it. Commands sent over + * the connection refresh the record's `updatedAt` (throttled to + * {@link SESSION_TOUCH_INTERVAL_MS}), so hosts can tell an actively used + * browser from one the platform has likely reclaimed. + * + * If the browser expires between the liveness probe and the WebSocket + * upgrade, the record is retired and the browser resolved once more, so + * the caller gets a fresh browser with `restarted: true` instead of an + * error. + */ + async connect(): Promise { + const resolved = await this.resolve(); + try { + return await this.#attach(resolved); + } catch (error) { + if (!isMissingBrowserSession(error)) throw error; + await this.#retireIfCurrent(resolved.sessionId); + } + // The browser this caller resolved is gone, so report a restart even + // when a concurrent resolver already replaced it and this resolve + // reattaches to that replacement. + const replaced = await this.resolve(); + return this.#attach({ ...replaced, restarted: true }); + } + + async #attach(resolved: ResolvedBrowser): Promise { + let lastTouchAt = Date.now(); + let touchInFlight = false; + const cdp = await connectBrowserSession( + this.#provider.binding, + resolved.sessionId, + { + timeoutMs: this.#options.timeoutMs, + onActivity: () => { + const now = Date.now(); + if (touchInFlight || now - lastTouchAt < this.#touchIntervalMs) { + return; + } + touchInFlight = true; + lastTouchAt = now; + void this.#touch(resolved.sessionId) + .catch((error: unknown) => { + console.warn( + `[agents/browser] Failed to refresh activity for browser "${this.name}"`, + error + ); + }) + .finally(() => { + touchInFlight = false; + }); + } + } + ); + const { binding } = this.#provider; + return { + name: resolved.name, + sessionId: resolved.sessionId, + restarted: resolved.restarted, + activeTargetId: resolved.activeTargetId, + cdp, + setActiveTarget: (targetId) => + this.#update(resolved.sessionId, (current) => ({ + ...current, + activeTargetId: targetId, + updatedAt: Date.now() + })), + spec: () => + loadCdpSpec({ browser: binding, sessionId: resolved.sessionId }) + }; + } + + /** + * Close the browser: retire the record (so the next resolve reports + * `restarted: true`) and delete its Browser Run session. Returns `false` + * when there was nothing to close. + * + * The platform delete is best-effort: the retired record is the durable + * outcome, and a browser whose delete failed is unreachable through this + * store, so the pinned `keep_alive` (≤600s) reclaims it. + */ + async close(): Promise { + let stored: StoredBrowserSession | undefined; + const lock = await this.#sessionStore.acquireLock(this.#key); + try { + const current = await this.#sessionStore.get(this.#key); + if (!current) return false; + stored = current; + await this.#retire(current); + } finally { + await lock.release(); + } + try { + await deleteBrowserSession(this.#provider.binding, stored.sessionId); + } catch (error) { + console.warn( + `[agents/browser] Failed to delete closed Browser Run session ${stored.sessionId}`, + error + ); + } + return true; + } + + /** + * Mint Live View URLs for the browser's open tabs, fresh from a target + * listing. `undefined` when the browser was never created, is closed, or + * is gone. The URLs are bearer credentials with a short connect window + * (~5 min) — hand them to a trusted human, never to the model, and never + * store them: re-mint instead. + */ + async liveView(options?: { + mode?: LiveViewMode; + }): Promise { + const entry = await this.#sessionStore.get(this.#key); + if (!entry) return undefined; + try { + const targets = await listBrowserTargets( + this.#provider.binding, + entry.sessionId + ); + // A human is about to look: minting counts as activity. Target + // listing yields to the network, so a concurrent close or replacement + // can retire the browser mid-mint — the touch and the retire + // serialize on the key lock, and a lost touch means the listed + // targets are already dead: report the browser gone rather than + // minting doomed links. Touch *errors* stay best effort — a store + // blip must not break minting. + try { + if (!(await this.#touch(entry.sessionId))) return undefined; + } catch (error) { + console.warn( + `[agents/browser] Failed to refresh activity for browser "${this.name}"`, + error + ); + } + return createLiveView(entry.sessionId, targets, options?.mode); + } catch (error) { + if (isMissingBrowserSession(error)) return undefined; + throw error; + } + } + + // ── Internals ──────────────────────────────────────────────────────────── + + get #provider(): BrowserRunProvider { + return this.#options.provider; + } + + /** The platform `keep_alive` every create applies. */ + get #keepAliveMs(): number { + return ( + this.#provider.options.keepAliveMs ?? BROWSER_SESSION_KEEP_ALIVE_MAX_MS + ); + } + + /** + * Capped at half the keep-alive window: a browser with continuous CDP + * traffic must never look older than the window the platform uses to + * reclaim it. + */ + get #touchIntervalMs(): number { + return Math.min( + this.#options.touchIntervalMs ?? SESSION_TOUCH_INTERVAL_MS, + Math.floor(this.#keepAliveMs / 2) + ); + } + + /** Lazy: `lifecycle.storage` exists only once `Lifecycle.use()` ran. */ + get #sessionStore(): BrowserSessionStore { + this.#store ??= + this.#options.store ?? + new DurableBrowserSessionStore(this.lifecycle.storage); + return this.#store; + } + + /** + * Refresh `updatedAt` while the record still holds `sessionId`. Returns + * false when a concurrent close or replacement already retired it. + */ + #touch(sessionId: string): Promise { + return this.#update(sessionId, (current) => ({ + ...current, + updatedAt: Date.now() + })); + } + + /** + * Rewrite the record only while it still holds `sessionId`: a replaced or + * retired record is never resurrected. + */ + async #update( + sessionId: string, + change: (current: StoredBrowserSession) => StoredBrowserSession + ): Promise { + const lock = await this.#sessionStore.acquireLock(this.#key); + try { + const current = await this.#sessionStore.get(this.#key); + if (current?.sessionId !== sessionId) { + return false; // replaced or gone — the caller's view is stale + } + await this.#sessionStore.set(this.#key, change(current)); + return true; + } finally { + await lock.release(); + } + } + + /** Retire the record if it still holds `sessionId`. */ + async #retireIfCurrent(sessionId: string): Promise { + const lock = await this.#sessionStore.acquireLock(this.#key); + try { + const current = await this.#sessionStore.get(this.#key); + if (current?.sessionId === sessionId) await this.#retire(current); + } finally { + await lock.release(); + } + } + + /** + * Move the record to its retired marker. Callers hold the key lock, so a + * resolver always sees either the record or the marker. + */ + async #retire(current: StoredBrowserSession): Promise { + await this.#sessionStore.set(retiredBrowserSessionKey(this.name), { + ...current, + closedAt: Date.now() + }); + await this.#sessionStore.delete(this.#key); + } + + /** + * Create a Browser Run session (outside any lock) and commit it, applying + * the provider's creation options. If a concurrent caller committed an + * entry first, theirs wins and the redundant session is deleted + * best-effort. + * + * `restarted` is read under the commit lock: a retired marker — left by + * close() or a dead-browser recovery — is evidence a prior browser + * existed, and only first-ever use of the name is not a restart. Markers + * are permanent, so reading at commit time also catches a browser that + * was created and closed while this create was in flight. + */ + async #createAndCommit(): Promise<{ + session: StoredBrowserSession; + restarted: boolean; + }> { + const { binding, options } = this.#provider; + const info = await createBrowserSession(binding, { + keepAliveMs: this.#keepAliveMs, + recording: options.recording, + guardrails: options.guardrails + }); + const now = Date.now(); + const stored: StoredBrowserSession = { + sessionId: info.sessionId, + createdAt: now, + updatedAt: now + }; + + let winner: StoredBrowserSession | undefined; + let restarted: boolean; + const lock = await this.#sessionStore.acquireLock(this.#key); + try { + restarted = + (await this.#sessionStore.get(retiredBrowserSessionKey(this.name))) !== + undefined; + const current = await this.#sessionStore.get(this.#key); + if (current === undefined) { + await this.#sessionStore.set(this.#key, stored); + } else { + winner = current; + } + } finally { + await lock.release(); + } + + if (winner) { + try { + await deleteBrowserSession(binding, stored.sessionId); + } catch (error) { + console.warn( + `[agents/browser] Failed to delete redundant Browser Run session ${stored.sessionId}`, + error + ); + } + return { session: winner, restarted }; + } + return { session: stored, restarted }; + } + + async #isAlive(stored: StoredBrowserSession): Promise { + try { + await listBrowserTargets(this.#provider.binding, stored.sessionId); + return true; + } catch (error) { + if (isMissingBrowserSession(error)) return false; + throw error; + } + } + + async #readStored(): Promise { + const lock = await this.#sessionStore.acquireLock(this.#key); + try { + return await this.#sessionStore.get(this.#key); + } finally { + await lock.release(); + } + } +} diff --git a/vendor/agents/packages/agents/src/browser/cdp-connection.ts b/vendor/agents/packages/agents/src/browser/cdp-connection.ts new file mode 100644 index 0000000..71b7411 --- /dev/null +++ b/vendor/agents/packages/agents/src/browser/cdp-connection.ts @@ -0,0 +1,377 @@ +interface PendingCommand { + resolve: (result: unknown) => void; + reject: (error: Error) => void; + timeoutId: ReturnType; + method: string; + sessionId?: string; + startedAt: number; +} + +interface DebugEntry { + at: string; + type: string; + [key: string]: unknown; +} + +export interface CdpSendOptions { + timeoutMs?: number; + sessionId?: string; +} + +export interface CdpAttachOptions { + timeoutMs?: number; +} + +/** Construction options for {@link CdpConnection}. */ +export interface CdpConnectionOptions { + /** Default per-command timeout. Defaults to 10 seconds. */ + timeoutMs?: number; + /** + * Invoked exactly once when the session reaches a terminal state — an + * explicit `close()`, peer closure, or a socket error. + */ + onClose?: () => void; + /** Browser Run session id, when connected to a session-scoped browser. */ + sessionId?: string; + /** Invoked on every CDP command sent — an activity signal for idle tracking. */ + onActivity?: () => void; +} + +const DEFAULT_TIMEOUT_MS = 10_000; + +/** JSON-RPC's "method not found" code, which Chrome also uses for CDP. */ +export const CDP_METHOD_NOT_FOUND = -32601; + +/** The browser answered a command with a JSON-RPC error. */ +export class CdpProtocolError extends Error { + override readonly name = "CdpProtocolError"; + /** JSON-RPC error code, e.g. {@link CDP_METHOD_NOT_FOUND}. */ + readonly code: number | undefined; + /** The CDP method that failed. */ + readonly method: string; + + constructor(method: string, code: number | undefined, message: string) { + super(`CDP error ${code ?? "unknown"}: ${message} for ${method}`); + this.code = code; + this.method = method; + } +} +const MAX_DEBUG_ENTRIES = 400; + +/** + * One Chrome DevTools Protocol connection over an open WebSocket. Manages + * command correlation, timeouts, per-tab CDP sessions, and a debug event + * ring buffer. + * + * Used host-side (not in the sandbox) — the sandbox calls into this + * via DynamicWorkerExecutor's ToolDispatcher RPC. + */ +export class CdpConnection { + #socket: WebSocket; + #nextId = 1; + #pending = new Map(); + #debugLog: DebugEntry[] = []; + #defaultTimeoutMs: number; + #dispose?: () => void; + #disposed = false; + #onActivity?: () => void; + readonly sessionId?: string; + + constructor(socket: WebSocket, options?: CdpConnectionOptions); + /** + * @deprecated Pass a {@link CdpConnectionOptions} object instead — + * `new CdpConnection(socket, { timeoutMs, onClose, sessionId })`. The + * positional form will be removed. + */ + constructor( + socket: WebSocket, + timeoutMs?: number, + onClose?: () => void, + sessionId?: string + ); + constructor( + socket: WebSocket, + optionsOrTimeoutMs?: CdpConnectionOptions | number, + onClose?: () => void, + sessionId?: string + ) { + const options: CdpConnectionOptions = + typeof optionsOrTimeoutMs === "object" + ? optionsOrTimeoutMs + : { timeoutMs: optionsOrTimeoutMs, onClose, sessionId }; + this.#socket = socket; + this.#defaultTimeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS; + this.#dispose = options.onClose; + this.sessionId = options.sessionId; + this.#onActivity = options.onActivity; + + socket.addEventListener("message", (event) => this.#handleMessage(event)); + socket.addEventListener("error", () => { + this.#rejectAll(new Error("CDP socket error")); + this.#runDispose(); + }); + socket.addEventListener("close", () => { + this.#rejectAll(new Error("CDP connection closed")); + this.#runDispose(); + }); + } + + send( + method: string, + params?: unknown, + options: CdpSendOptions = {} + ): Promise { + this.#onActivity?.(); + const id = this.#nextId++; + const timeoutMs = options.timeoutMs ?? this.#defaultTimeoutMs; + const sessionId = + typeof options.sessionId === "string" && options.sessionId.length > 0 + ? options.sessionId + : undefined; + + const domain = typeof method === "string" ? method.split(".")[0] : ""; + if (!sessionId && domain && !["Browser", "Target"].includes(domain)) { + this.#recordDebug("warning", { + id, + method, + reason: "target-scoped method sent without sessionId" + }); + } + + const result = new Promise((resolve, reject) => { + const startedAt = performance.now(); + const timeoutId = setTimeout(() => { + this.#pending.delete(id); + reject( + new Error(`CDP command timed out after ${timeoutMs}ms: ${method}`) + ); + }, timeoutMs); + this.#pending.set(id, { + resolve, + reject, + timeoutId, + method, + sessionId, + startedAt + }); + }); + + this.#recordDebug("send", { id, method, sessionId, timeoutMs }); + try { + this.#socket.send(JSON.stringify({ id, method, params, sessionId })); + } catch (error) { + // A closed socket throws on send: fail this command now rather than + // leave it pending until it times out. + const pending = this.#pending.get(id); + if (pending) { + clearTimeout(pending.timeoutId); + this.#pending.delete(id); + pending.reject( + error instanceof Error ? error : new Error(String(error)) + ); + } + } + return result; + } + + async attachToTarget( + targetId: string, + options: CdpAttachOptions = {} + ): Promise { + if (typeof targetId !== "string" || !targetId) { + throw new Error( + "attachToTarget requires a targetId — list open tabs with " + + "send('Target.getTargets') or create one with " + + "send('Target.createTarget', { url })" + ); + } + + const result = (await this.send( + "Target.attachToTarget", + { + targetId, + flatten: true + }, + { timeoutMs: options.timeoutMs } + )) as { sessionId?: string }; + + const sessionId = result?.sessionId ?? ""; + if (!sessionId) { + throw new Error( + `Target.attachToTarget did not return a sessionId for target ${targetId}` + ); + } + + this.#recordDebug("attach", { targetId, sessionId }); + return sessionId; + } + + getDebugLog(limit = 50): DebugEntry[] { + const normalized = Number.isFinite(limit) + ? Math.max(1, Math.floor(limit)) + : 50; + return this.#debugLog.slice(-normalized); + } + + clearDebugLog(): void { + this.#debugLog = []; + } + + disconnect(): void { + this.#rejectAll(new Error("CDP session disconnected")); + try { + this.#socket.close(1000, "Done"); + } catch { + // socket may already be closed + } + } + + close(): void { + this.disconnect(); + this.#runDispose(); + } + + /** + * Run the dispose callback exactly once, on the first terminal event — + * an explicit {@link close}, peer closure, or a socket error. + */ + #runDispose(): void { + if (this.#disposed) return; + this.#disposed = true; + this.#dispose?.(); + } + + #rejectAll(error: Error): void { + for (const [id, pending] of this.#pending.entries()) { + clearTimeout(pending.timeoutId); + this.#pending.delete(id); + pending.reject(error); + } + } + + #handleMessage(event: MessageEvent): void { + if (typeof event.data !== "string") { + return; + } + + let payload: Record; + try { + payload = JSON.parse(event.data) as Record; + } catch { + return; + } + + this.#recordDebug("receive", { + id: payload.id, + method: payload.method, + sessionId: payload.sessionId, + hasError: !!payload.error + }); + + if (typeof payload.id !== "number") { + return; + } + + const pending = this.#pending.get(payload.id); + if (!pending) { + return; + } + + clearTimeout(pending.timeoutId); + this.#pending.delete(payload.id); + + if (payload.error) { + const err = payload.error as { code?: unknown; message?: string }; + pending.reject( + new CdpProtocolError( + pending.method, + typeof err.code === "number" ? err.code : undefined, + err.message ?? "CDP error" + ) + ); + return; + } + + pending.resolve(payload.result); + } + + #recordDebug(type: string, data: Record): void { + this.#debugLog.push({ + at: new Date().toISOString(), + type, + ...data + }); + if (this.#debugLog.length > MAX_DEBUG_ENTRIES) { + this.#debugLog.splice(0, this.#debugLog.length - MAX_DEBUG_ENTRIES); + } + } +} + +const LOCALHOST_HOSTS = new Set([ + "localhost", + "127.0.0.1", + "0.0.0.0", + "::1", + "[::1]" +]); + +/** + * Connect to a browser via a CDP base URL (e.g. http://localhost:9222). + * Discovers the WebSocket debugger URL via /json/version, + * rewrites localhost URLs to the base URL host, and opens the WebSocket. + * + * Useful for local development with `chrome --remote-debugging-port=9222` + * or when connecting through a tunnel. + */ +export async function connectUrl( + baseUrl: string, + options?: { timeoutMs?: number; headers?: Record } +): Promise { + const endpoint = new URL("/json/version", baseUrl).toString(); + const response = await fetch(endpoint, { + headers: options?.headers + }); + if (!response.ok) { + throw new Error( + `Failed to discover CDP endpoint at ${endpoint}: ${response.status}` + ); + } + + const payload = (await response.json()) as { + webSocketDebuggerUrl?: string; + }; + if (!payload.webSocketDebuggerUrl) { + throw new Error("CDP /json/version did not include webSocketDebuggerUrl"); + } + + let wsUrl = payload.webSocketDebuggerUrl; + const parsed = new URL(wsUrl); + if (LOCALHOST_HOSTS.has(parsed.hostname)) { + const base = new URL(baseUrl); + parsed.hostname = base.hostname; + parsed.port = base.port; + parsed.protocol = base.protocol; + } else { + // Workers runtime requires fetch + Upgrade header for outbound WebSockets + parsed.protocol = parsed.protocol === "wss:" ? "https:" : "http:"; + } + const fetchUrl = parsed.toString(); + + const wsResponse = await fetch(fetchUrl, { + headers: { ...options?.headers, Upgrade: "websocket" } + }); + const ws = wsResponse.webSocket; + if (!ws) { + throw new Error( + `Failed to establish CDP WebSocket at ${fetchUrl} (status ${wsResponse.status})` + ); + } + ws.accept(); + + return new CdpConnection(ws, { timeoutMs: options?.timeoutMs }); +} + +/** @deprecated Renamed to {@link CdpConnection}. */ +export const CdpSession = CdpConnection; +/** @deprecated Renamed to {@link CdpConnection}. */ +export type CdpSession = CdpConnection; diff --git a/vendor/agents/packages/agents/src/browser/connector-validation.ts b/vendor/agents/packages/agents/src/browser/connector-validation.ts new file mode 100644 index 0000000..c7d5f41 --- /dev/null +++ b/vendor/agents/packages/agents/src/browser/connector-validation.ts @@ -0,0 +1,54 @@ +import { Validator, type OutputUnit, type Schema } from "@cfworker/json-schema"; +import type { ConnectorTool } from "@cloudflare/codemode"; + +function formatToolValidationError( + connector: string, + tool: string, + errors: OutputUnit[] +): string { + // A failing property emits both a generic parent `properties` error and a + // specific child error. Prefer the latter so the model sees what to fix. + const specific = errors.filter((error) => error.keyword !== "properties"); + const relevant = specific.length > 0 ? specific : errors; + const details = relevant.map((error) => { + const location = error.instanceLocation + .replace(/^#\/?/, "") + .replaceAll("~1", "/") + .replaceAll("~0", "~") + .replaceAll("/", "."); + return `${location ? ` at ${location}` : ""}: ${error.error}`; + }); + return `Invalid arguments for ${connector}.${tool}${details.join(";")}`; +} + +/** + * Validate a connector tool's arguments against its input schema before it + * runs, so the model gets a precise error instead of a failure deep inside + * browser work. An omitted argument counts as `{}`: argumentless tools are + * documented as `cdp.spec()`. + */ +export function validateConnectorArgs( + connector: string, + name: string, + tool: ConnectorTool +): ConnectorTool { + if (!tool.inputSchema) return tool; + + // Both types describe draft-7 schemas, but @cfworker's `Schema` type is + // narrower than JSONSchema7 around boolean subschemas. + const schema = tool.inputSchema as unknown as Schema; + const validator = new Validator(schema, "7", false); + return { + ...tool, + execute: async (args, ctx) => { + const input = args === undefined ? {} : args; + const result = validator.validate(input); + if (!result.valid) { + throw new Error( + formatToolValidationError(connector, name, result.errors) + ); + } + return await tool.execute(input, ctx); + } + }; +} diff --git a/vendor/agents/packages/agents/src/browser/connector.ts b/vendor/agents/packages/agents/src/browser/connector.ts index e847e6b..34fc1a8 100644 --- a/vendor/agents/packages/agents/src/browser/connector.ts +++ b/vendor/agents/packages/agents/src/browser/connector.ts @@ -1,4 +1,3 @@ -import { Validator, type OutputUnit, type Schema } from "@cfworker/json-schema"; import { CodemodeConnector, type ConnectorTool, @@ -7,7 +6,13 @@ import { type PassEndStatus, type ToolExecuteContext } from "@cloudflare/codemode"; -import { CdpSession, connectUrl } from "./cdp-session"; +import { + CDP_METHOD_NOT_FOUND, + CdpConnection, + CdpProtocolError, + connectUrl +} from "./cdp-connection"; +import { validateConnectorArgs } from "./connector-validation"; import { connectBrowser, connectBrowserSession, @@ -19,12 +24,20 @@ import { type BrowserSessionInfo, type BrowserTargetInfo } from "./browser-run"; +import { + applyLiveViewMode, + LIVE_VIEW_URL_TTL_MS, + createLiveView, + type BrowserLiveView, + type BrowserLiveViewUrl, + type LiveViewMode +} from "./live-view"; import { loadCdpSpec, type SearchableCdpSpec } from "./spec"; import type { BrowserSessionStore, StoredBrowserSession -} from "./session-manager"; -import { DEFAULT_SWEEP_IDLE_MS } from "./session-manager"; +} from "./session-store"; +import { DEFAULT_SWEEP_IDLE_MS } from "./session-store"; /** Browser session lifecycle for the connector (binding-backed only). */ export interface BrowserConnectorSessionOptions { @@ -111,47 +124,12 @@ export interface BrowserConnectorSweepResult { swept: Array<{ key: string; sessionId: string }>; } -/** - * Live View rendering mode (the `mode` query param the hosted UI at - * `live.browser.run` understands): - * - * - `"tab"` — a standalone, interactive page view (best for handing control - * to a human). - * - `"devtools"` — the full DevTools inspector panel (Elements, Console, - * Network, …). - * - * Omit it to use whatever mode the binding's `devtoolsFrontendUrl` defaults - * to. - */ -export type LiveViewMode = "tab" | "devtools"; - -/** A single tab's Live View URL. */ -export interface BrowserLiveViewUrl { - /** Open this in a browser to watch/control the tab in real time. */ - url: string; - /** CDP target (tab) id the URL points at. */ - targetId: string; - /** Milliseconds the URL stays valid from when it was generated (~5 min). */ - expiresInMs: number; -} - -export interface BrowserLiveViewTarget { - targetId: string; - /** Embeddable Live View URL (the `devtoolsFrontendUrl`) for this tab. */ - url: string; - /** The page the tab is currently showing (e.g. `https://example.com`). */ - pageUrl?: string; - title?: string; - type?: string; -} - -/** Live View URLs for every tab in a (shared) session. */ -export interface BrowserLiveView { - sessionId: string; - targets: BrowserLiveViewTarget[]; - /** Milliseconds the URLs stay valid from when they were generated (~5 min). */ - expiresInMs: number; -} +export type { + BrowserLiveView, + BrowserLiveViewTarget, + BrowserLiveViewUrl, + LiveViewMode +} from "./live-view"; const EXEC_KEY_PREFIX = "cdp:exec:"; /** @@ -177,13 +155,6 @@ export const DEFAULT_EXEC_SWEEP_IDLE_MS = 24 * 60 * 60 * 1000; */ const EXEC_TOUCH_INTERVAL_MS = 60 * 1000; -/** - * Browser Run mints `devtoolsFrontendUrl`s (the Live View links) that are - * valid for ~5 minutes. We surface the window so callers can decide how long - * a shared link is good for before re-listing targets. - */ -const LIVE_VIEW_URL_TTL_MS = 5 * 60 * 1000; - function isMissingBrowserSession(error: unknown): boolean { // Browser Run uses 404 for unknown ids and 410 after keep_alive expiry. return ( @@ -192,44 +163,8 @@ function isMissingBrowserSession(error: unknown): boolean { ); } -function formatToolValidationError( - connector: string, - tool: string, - errors: OutputUnit[] -): string { - // A failing property emits both a generic parent `properties` error and a - // specific child error. Prefer the latter so the model sees what to fix. - const specific = errors.filter((error) => error.keyword !== "properties"); - const relevant = specific.length > 0 ? specific : errors; - const details = relevant.map((error) => { - const location = error.instanceLocation - .replace(/^#\/?/, "") - .replaceAll("~1", "/") - .replaceAll("~0", "~") - .replaceAll("/", "."); - return `${location ? ` at ${location}` : ""}: ${error.error}`; - }); - return `Invalid arguments for ${connector}.${tool}${details.join(";")}`; -} - -/** - * Rewrite the hosted Live View UI's `mode` query param (`tab` | `devtools`). - * The raw `devtoolsFrontendUrl` is returned unchanged when no mode is asked - * for or the URL can't be parsed. - */ -function applyLiveViewMode(rawUrl: string, mode?: LiveViewMode): string { - if (!mode) return rawUrl; - try { - const url = new URL(rawUrl); - url.searchParams.set("mode", mode === "devtools" ? "devtools" : "tab"); - return url.toString(); - } catch { - return rawUrl; - } -} - interface CachedSocket { - session: CdpSession; + session: CdpConnection; /** Browser Run session id the socket is attached to (undefined for cdpUrl). */ browserSessionId?: string; /** @@ -272,7 +207,7 @@ const ATTACH_HANDLE_PREFIX = "target:"; export class BrowserConnector extends CodemodeConnector { #options: BrowserConnectorOptions; #sockets = new Map(); - #connecting = new Map>(); + #connecting = new Map>(); constructor( ctx: DurableObjectState | ExecutionContext, @@ -327,7 +262,7 @@ export class BrowserConnector extends CodemodeConnector { ); } else { lines.push( - "Use cdp.spec() to discover commands, events, and types when unsure.", + "Use cdp.spec() to look up commands, their parameters, events, and types when unsure.", "When a step needs a human (login, MFA, CAPTCHA, sensitive input), call cdp.getLiveViewUrl() to get a link they can open to control the browser live — surface it, then make an approval-gated call so the run pauses until they're done." ); } @@ -348,27 +283,7 @@ export class BrowserConnector extends CodemodeConnector { } protected override tool(name: string, tool: ConnectorTool): ConnectorTool { - if (!tool.inputSchema) return tool; - - // Both types describe draft-7 schemas, but @cfworker's `Schema` type is - // narrower than JSONSchema7 around boolean subschemas. - const schema = tool.inputSchema as unknown as Schema; - const validator = new Validator(schema, "7", false); - return { - ...tool, - execute: async (args, ctx) => { - // Browser's argumentless tools are documented as `cdp.spec()` etc.; - // treat an omitted argument as the empty object their schemas expect. - const input = args === undefined ? {} : args; - const result = validator.validate(input); - if (!result.valid) { - throw new Error( - formatToolValidationError(this.name(), name, result.errors) - ); - } - return await tool.execute(input, ctx); - } - }; + return validateConnectorArgs(this.name(), name, tool); } protected tools(): ConnectorTools { @@ -424,8 +339,8 @@ export class BrowserConnector extends CodemodeConnector { // sent), or a page-scoped command went to the browser-level // session because no sessionId was passed. if ( - err instanceof Error && - /-32601|wasn't found/.test(err.message) + err instanceof CdpProtocolError && + err.code === CDP_METHOD_NOT_FOUND ) { if (await this.#isSpecEvent(method)) { throw new Error( @@ -488,7 +403,7 @@ export class BrowserConnector extends CodemodeConnector { spec: { description: - "Return the searchable Chrome DevTools Protocol spec: domains with their commands, events, and types. Use it to discover method names and capabilities.", + "Return the searchable Chrome DevTools Protocol spec: domains with their commands (parameters and returns), events, and types. Use it to find a method and exactly how to call it.", replay: "reexecute", inputSchema: { type: "object", properties: {} }, execute: async (): Promise => { @@ -767,20 +682,7 @@ export class BrowserConnector extends CodemodeConnector { }): Promise { const info = await this.sessionInfo(); if (!info) return undefined; - const targets = (info.targets ?? []) - .filter((target) => target.devtoolsFrontendUrl) - .map((target) => ({ - targetId: target.id, - url: applyLiveViewMode(target.devtoolsFrontendUrl!, options?.mode), - pageUrl: target.url, - title: target.title, - type: target.type - })); - return { - sessionId: info.sessionId, - targets, - expiresInMs: LIVE_VIEW_URL_TTL_MS - }; + return createLiveView(info.sessionId, info.targets ?? [], options?.mode); } /** Close the shared (reuse/promoted) session, if one exists. */ @@ -1027,7 +929,7 @@ export class BrowserConnector extends CodemodeConnector { * uses Promise.all) share one in-flight connect instead of racing and * leaking the loser's WebSocket. */ - #socket(executionId: string): Promise { + #socket(executionId: string): Promise { const inFlight = this.#connecting.get(executionId); if (inFlight) return inFlight; const promise = this.#socketInner(executionId).finally(() => { @@ -1039,7 +941,7 @@ export class BrowserConnector extends CodemodeConnector { return promise; } - async #socketInner(executionId: string): Promise { + async #socketInner(executionId: string): Promise { if (this.#options.cdpUrl) { const cached = this.#sockets.get(executionId); if (cached) return cached.session; @@ -1097,11 +999,9 @@ export class BrowserConnector extends CodemodeConnector { } if (cached) this.#dropSocket(executionId); - const session = await connectBrowserSession( - browser, - stored.sessionId, - this.#options.timeout - ); + const session = await connectBrowserSession(browser, stored.sessionId, { + timeoutMs: this.#options.timeout + }); this.#sockets.set(executionId, { session, browserSessionId: stored.sessionId, diff --git a/vendor/agents/packages/agents/src/browser/index.ts b/vendor/agents/packages/agents/src/browser/index.ts index 4ee2b40..965c4c0 100644 --- a/vendor/agents/packages/agents/src/browser/index.ts +++ b/vendor/agents/packages/agents/src/browser/index.ts @@ -1,9 +1,11 @@ export { + CdpConnection, CdpSession, connectUrl, type CdpSendOptions, - type CdpAttachOptions -} from "./cdp-session"; + type CdpAttachOptions, + type CdpConnectionOptions +} from "./cdp-connection"; export { connectBrowser, @@ -15,9 +17,13 @@ export { BrowserRenderingError, type BrowserBinding, type BrowserRecording, + type BrowserSessionGuardrails, type BrowserSessionInfo, type BrowserTargetInfo, - type ConnectBrowserOptions + type ConnectBrowserOptions, + type ConnectBrowserSessionOptions, + type ConnectChromiumBrowserOptions, + type ConnectKitesurfBrowserOptions } from "./browser-run"; export { @@ -26,7 +32,18 @@ export { type BrowserSessionLock, type BrowserSessionStore, type StoredBrowserSession -} from "./session-manager"; +} from "./session-store"; + +export { + Browser, + browserRun, + type BrowserConnection, + type BrowserOptions, + type BrowserProvider, + type BrowserRunOptions, + type BrowserRunProvider, + type ResolvedBrowser +} from "./browser"; export { browserContent, @@ -53,6 +70,8 @@ export { export { loadCdpSpec, + type CdpField, + type CdpItems, type CdpSpecSource, type SearchableCdpSpec } from "./spec"; diff --git a/vendor/agents/packages/agents/src/browser/interaction/contract.ts b/vendor/agents/packages/agents/src/browser/interaction/contract.ts deleted file mode 100644 index 2ef646a..0000000 --- a/vendor/agents/packages/agents/src/browser/interaction/contract.ts +++ /dev/null @@ -1,348 +0,0 @@ -/** - * The provider-agnostic browser interaction contract: plain-data types shared - * by every lane (hand-rolled CDP, `@cloudflare/playwright`) and every - * projection (codemode verbs today; discrete tools / WebMCP later). - * - * Everything here is serializable data — no live object handles ever cross - * the model boundary. Providers implement {@link InteractionProvider}; the - * model-facing surface is {@link BrowserVerbs}. The only difference between - * the two is that the session core adds session-level facts - * (`sessionRestarted`, `humanHandoffResolved`) that a provider cannot know. - * - * Raw CDP access (`cdp.send`, target attachment, `cdp.spec`) is a first-class - * co-surface next to these verbs, not part of this contract: hosts choose to - * expose verbs, CDP, or both. Nothing here assumes the verbs are the only way - * the model drives the browser. - */ - -import type { VerbName } from "./verbs"; - -// --------------------------------------------------------------------------- -// Refs and targeting -// --------------------------------------------------------------------------- - -/** - * An opaque element reference minted by a snapshot. Deliberately - * short-lived. The lifetime contract: - * - * - navigation always invalidates a ref; - * - a provider may invalidate refs on re-snapshot (validity beyond the - * minting snapshot is provider quality-of-implementation — the CDP lane - * backs refs with loader identity + `backendNodeId` and may keep them - * while the element survives; never rely on it); - * - the one guarantee: a ref never silently resolves to a different element - * than the one it named — stale use fails with a structured `STALE_REF` - * teaching error, never a guess. - * - * Backing identity (CDP `loaderId`/`backendNodeId`, Playwright `aria-ref`) - * never leaks through this type. - */ -export type ElementRef = string; - -/** - * Where an element verb should act. Exactly one addressing mode, as distinct - * named fields — no string-sniffing. Taught precedence: `ref` first (from - * `snapshot()`), CSS `selector` for known-selector or poor-accessibility - * cases, `x`/`y` coordinates last (paired with `screenshot()`). - */ -export type ActionTarget = - | { ref: ElementRef; selector?: never; x?: never; y?: never } - | { selector: string; ref?: never; x?: never; y?: never } - | { x: number; y: number; ref?: never; selector?: never }; - -// --------------------------------------------------------------------------- -// Snapshot -// --------------------------------------------------------------------------- - -/** - * One accessibility node in the structured snapshot projection. Distilled: - * refs appear only on visible, interactable elements; state fields appear - * only when meaningful for the role. - */ -export interface SnapshotNode { - role: string; - name?: string; - /** Present only on visible, interactable nodes. */ - ref?: ElementRef; - /** Current value for inputs/comboboxes. */ - value?: string; - checked?: boolean | "mixed"; - disabled?: boolean; - expanded?: boolean; - selected?: boolean; - children?: SnapshotNode[]; -} - -/** - * Dual projection from one accessibility-tree traversal: structured - * {@link SnapshotNode} data for code to filter/map, and a compact `text` - * rendering (role/name/state lines) for direct model reading. - */ -export interface BrowserSnapshot { - url: string; - title?: string; - /** Compact human/model-readable rendering of `nodes`. */ - text: string; - nodes: SnapshotNode[]; -} - -// --------------------------------------------------------------------------- -// Envelope facts -// --------------------------------------------------------------------------- - -/** Tab identity is a stable opaque id — never a CDP targetId. */ -export interface TabInfo { - id: string; - url: string; - title: string; - active: boolean; -} - -/** Pushed fact: tabs opened/closed as a side effect of the last action. */ -export interface TabsChanged { - opened: TabInfo[]; - /** Ids of tabs that closed. */ - closed: string[]; -} - -/** Pushed fact: a dialog opened and now blocks the page. */ -export interface DialogFact { - type: "alert" | "confirm" | "prompt" | "beforeunload"; - message: string; -} - -/** Pushed fact: the last action triggered a download (never silent). */ -export interface DownloadFact { - url: string; - suggestedFilename?: string; -} - -/** - * Console activity since the previous action, as counts. Content stays out - * of the envelope — read it on demand with `console()`. - */ -export interface ConsoleDelta { - errors: number; - warnings: number; -} - -/** - * Which bounded wait gave up, when `settled` is `false`. The first three are - * post-action settle machinery; `text`/`text-gone` are `waitFor` conditions - * that did not hold within their timeout. - */ -export type SettleTimeoutReason = - | "navigation" - | "requests" - | "dom-quiet" - | "text" - | "text-gone"; - -/** - * The fixed-size outcome envelope every state-changing verb returns. Counts - * not content; small facts are pushed, streams are on-demand; no automatic - * snapshot — `snapshot()` is one line away. - */ -export interface ActionEnvelope { - ok: boolean; - action: VerbName; - url: string; - urlChanged: boolean; - /** HTTP status of the main document, when the action navigated. */ - status?: number; - /** - * Whether the page reached quiescence within bounds. Settle never throws: - * `false` plus {@link settleTimeoutReason} reports what timed out. - */ - settled: boolean; - settleTimeoutReason?: SettleTimeoutReason; - tabsChanged?: TabsChanged; - dialog?: DialogFact; - download?: DownloadFact; - consoleDelta: ConsoleDelta; - /** - * Set by the session core when this action ran in a freshly recreated - * browser: all page state was lost — verify, don't assume. - */ - sessionRestarted?: boolean; - /** - * Reserved for the HITL wave: set on the first action after a human - * handoff resolved, instructing the model to verify browser state. - */ - humanHandoffResolved?: boolean; - warnings: string[]; -} - -/** - * What a provider returns for a state-changing verb: the envelope minus the - * session-level facts only the session core can know. - */ -export type ProviderActionResult = Omit< - ActionEnvelope, - "sessionRestarted" | "humanHandoffResolved" ->; - -// --------------------------------------------------------------------------- -// On-demand reads (bounded ring buffers, filtered in code before context) -// --------------------------------------------------------------------------- - -export interface ConsoleMessage { - level: "log" | "info" | "warning" | "error" | "debug"; - text: string; - url?: string; - timestamp: number; -} - -export interface RequestRecord { - method: string; - url: string; - status?: number; - resourceType?: string; - /** Set when the request failed before a response. */ - failure?: string; -} - -export interface ConsoleReadOptions { - level?: ConsoleMessage["level"]; - limit?: number; -} - -export interface RequestReadOptions { - urlContains?: string; - limit?: number; -} - -// --------------------------------------------------------------------------- -// Verb options -// --------------------------------------------------------------------------- - -export interface NavigateOptions { - timeoutMs?: number; -} - -export interface ClickOptions { - button?: "left" | "middle" | "right"; - clickCount?: number; -} - -export interface TypeOptions { - /** Delay between keystrokes. */ - delayMs?: number; -} - -export interface ScrollOptions { - /** Scroll within this element; defaults to the page. */ - target?: ActionTarget; - deltaX?: number; - deltaY?: number; -} - -/** - * What `waitFor` waits for. At least one condition is required — an empty - * condition has nothing to wait for. When both are present, `waitFor` - * resolves only once **both** hold (conjunction). On timeout it reports - * `settled: false` with `settleTimeoutReason` `"text"` or `"text-gone"` - * (the first unmet condition) — it never throws. - */ -export type WaitForCondition = { timeoutMs?: number } & ( - | { - /** Wait until this text is visible on the page. */ - text: string; - /** Optionally also wait until this text is gone from the page. */ - textGone?: string; - } - | { - /** Wait until this text is gone from the page. */ - textGone: string; - /** Optionally also wait until this text is visible on the page. */ - text?: string; - } -); - -export interface ScreenshotOptions { - fullPage?: boolean; -} - -export interface ScreenshotResult { - format: "png" | "jpeg"; - base64: string; -} - -export interface HandleDialogOptions { - /** Text to enter before accepting a `prompt` dialog. */ - promptText?: string; -} - -// --------------------------------------------------------------------------- -// The verb set -// --------------------------------------------------------------------------- - -/** - * The v1 verb signatures, generic over the outcome type so the model-facing - * surface ({@link BrowserVerbs}) and the provider seam - * ({@link InteractionProvider}) share one definition. `drag` and `upload` - * are deferred (upload needs a Workers-native `{data | url}` design). - */ -export interface InteractionVerbs { - // navigate - goto(url: string, options?: NavigateOptions): Promise; - back(): Promise; - reload(): Promise; - // tabs — stable ids, in-session parallelism - tabs(): Promise; - openTab(url?: string): Promise; - selectTab(tabId: string): Promise; - closeTab(tabId: string): Promise; - // act - click(target: ActionTarget, options?: ClickOptions): Promise; - /** Set a field's value directly (clears first). For keystrokes use `type`. */ - fill(target: ActionTarget, value: string): Promise; - /** Type character by character, triggering per-keystroke handlers. */ - type( - target: ActionTarget, - text: string, - options?: TypeOptions - ): Promise; - press(key: string): Promise; - /** Select option(s) by value or visible text (forgiving form semantics). */ - select(target: ActionTarget, values: string | string[]): Promise; - hover(target: ActionTarget): Promise; - scroll(options: ScrollOptions): Promise; - // await - waitFor(condition: WaitForCondition): Promise; - // observe - snapshot(): Promise; - screenshot(options?: ScreenshotOptions): Promise; - /** - * Evaluate a JS expression in the page world (the sandbox cannot touch the - * DOM) and return its JSON-serializable result. For extraction, app-state - * reads, ground-truth probes, and custom-widget workarounds. - */ - evaluate(expression: string): Promise; - console(options?: ConsoleReadOptions): Promise; - requests(options?: RequestReadOptions): Promise; - // dialogs - handleDialog( - action: "accept" | "dismiss", - options?: HandleDialogOptions - ): Promise; -} - -/** The model-facing verb surface: full envelopes with session-level facts. */ -export type BrowserVerbs = InteractionVerbs; - -/** - * The seam a lane implements. Verb-level: the provider owns action - * execution, its own actionability checks (the CDP lane specifies and tests - * its own subset — no Playwright-parity claims), and bounded settle. The - * session core owns everything else: session lifecycle, ref-free session - * facts, and assembling {@link ActionEnvelope}s from - * {@link ProviderActionResult}s. Providers are selected by config/capability - * detection — never hard-coupled to a runtime. - */ -export interface InteractionProvider extends InteractionVerbs { - /** Lane identifier, e.g. `"cdp"` or `"playwright"`. */ - readonly name: string; - /** Detach from the browser without closing the underlying session. */ - dispose(): Promise; -} diff --git a/vendor/agents/packages/agents/src/browser/interaction/errors.ts b/vendor/agents/packages/agents/src/browser/interaction/errors.ts deleted file mode 100644 index ab1f428..0000000 --- a/vendor/agents/packages/agents/src/browser/interaction/errors.ts +++ /dev/null @@ -1,109 +0,0 @@ -/** - * The interaction error taxonomy: machine codes plus fix-oriented teaching. - * Both provider lanes throw these — the code is for programs, the message is - * for the model, and every message says what to do next, not just what broke. - */ - -/** Every machine code an interaction verb can fail with. */ -export const INTERACTION_ERROR_CODES = [ - "STALE_REF", - "TARGET_NOT_FOUND", - "NOT_INTERACTIVE", - "DIALOG_BLOCKED", - "SESSION_RESTARTED", - "NAVIGATION_TIMEOUT" -] as const; - -export type InteractionErrorCode = (typeof INTERACTION_ERROR_CODES)[number]; - -/** - * One fix-oriented teaching sentence per code — the canonical wording both - * lanes use, so the model gets identical guidance whatever engine is - * underneath. Corrective (Playwright posture), with the cause detail - * preserved rather than erased. - */ -export const INTERACTION_ERROR_TEACHING: Record = - { - STALE_REF: - "This ref is from an older snapshot and no longer matches a live element — call snapshot() again and use a fresh ref.", - TARGET_NOT_FOUND: - "No element matched this target — call snapshot() to see the current page; if it is genuinely absent there, escalate: screenshot() for visual layout, evaluate() for raw DOM/HTML.", - NOT_INTERACTIVE: - "The element exists but cannot be interacted with right now — check detail for the cause, then scroll it into view, wait for it to enable, or pick a different target from a fresh snapshot().", - DIALOG_BLOCKED: - 'A dialog is open and blocks the page — call handleDialog("accept") or handleDialog("dismiss") first, then retry the action.', - SESSION_RESTARTED: - "The browser session was restarted and all page state was lost (tabs, navigation, cookies, logins). Do not repeat prior actions blindly — verify the current state with snapshot() and redo any setup that matters.", - NAVIGATION_TIMEOUT: - "Navigation did not complete in time — the page may be slow or unreachable. Check where you are with snapshot() before retrying, or waitFor({ text }) for content on slow pages." - }; - -export interface BrowserInteractionErrorOptions { - /** Replace the default teaching sentence for this code. */ - message?: string; - /** - * The preserved cause — e.g. the actionability check that failed for - * `NOT_INTERACTIVE`. Appended to the message so one read has both. - */ - detail?: string; -} - -/** - * The wire shape of an interaction error: what survives serialization across - * the sandbox boundary. {@link isBrowserInteractionError} recognizes this - * shape structurally, because `instanceof` dies with the prototype. - */ -export interface BrowserInteractionErrorShape { - name: "BrowserInteractionError"; - code: InteractionErrorCode; - message: string; - detail?: string; -} - -export class BrowserInteractionError extends Error { - readonly code: InteractionErrorCode; - readonly detail?: string; - - constructor( - code: InteractionErrorCode, - options: BrowserInteractionErrorOptions = {} - ) { - const base = options.message ?? INTERACTION_ERROR_TEACHING[code]; - super(options.detail ? `${base} (detail: ${options.detail})` : base); - this.name = "BrowserInteractionError"; - this.code = code; - this.detail = options.detail; - } - - toJSON(): BrowserInteractionErrorShape { - return { - name: "BrowserInteractionError", - code: this.code, - message: this.message, - detail: this.detail - }; - } -} - -/** - * Structural guard — works on live instances and on serialized copies that - * crossed the sandbox boundary and lost their prototype. - */ -export function isBrowserInteractionError( - value: unknown -): value is BrowserInteractionErrorShape { - if (typeof value !== "object" || value === null) return false; - const candidate = value as { - name?: unknown; - code?: unknown; - message?: unknown; - detail?: unknown; - }; - return ( - candidate.name === "BrowserInteractionError" && - typeof candidate.message === "string" && - typeof candidate.code === "string" && - (candidate.detail === undefined || typeof candidate.detail === "string") && - (INTERACTION_ERROR_CODES as readonly string[]).includes(candidate.code) - ); -} diff --git a/vendor/agents/packages/agents/src/browser/interaction/index.ts b/vendor/agents/packages/agents/src/browser/interaction/index.ts deleted file mode 100644 index a3f60e5..0000000 --- a/vendor/agents/packages/agents/src/browser/interaction/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -export type { - ActionEnvelope, - ActionTarget, - BrowserSnapshot, - BrowserVerbs, - ClickOptions, - ConsoleDelta, - ConsoleMessage, - ConsoleReadOptions, - DialogFact, - DownloadFact, - ElementRef, - HandleDialogOptions, - InteractionProvider, - InteractionVerbs, - NavigateOptions, - ProviderActionResult, - RequestReadOptions, - RequestRecord, - ScreenshotOptions, - ScreenshotResult, - ScrollOptions, - SettleTimeoutReason, - SnapshotNode, - TabInfo, - TabsChanged, - TypeOptions, - WaitForCondition -} from "./contract"; -export { - BrowserInteractionError, - INTERACTION_ERROR_CODES, - INTERACTION_ERROR_TEACHING, - isBrowserInteractionError, - type BrowserInteractionErrorOptions, - type BrowserInteractionErrorShape, - type InteractionErrorCode -} from "./errors"; -export { VERB_DESCRIPTIONS, VERB_NAMES, type VerbName } from "./verbs"; diff --git a/vendor/agents/packages/agents/src/browser/interaction/verbs.ts b/vendor/agents/packages/agents/src/browser/interaction/verbs.ts deleted file mode 100644 index 01e01cb..0000000 --- a/vendor/agents/packages/agents/src/browser/interaction/verbs.ts +++ /dev/null @@ -1,70 +0,0 @@ -/** - * The v1 verb names and their one-line descriptions. The descriptions are - * contract, not decoration: the model-facing sandbox projection (built in a - * later slice) fulfills the probe-friendly promise — `Object.keys(browser)` - * enumerates the verbs and every verb function carries a `.description` — - * by decorating its verb functions from this record. This module ships the - * canonical wording; the projection ships the runtime shape. - */ - -export const VERB_NAMES = [ - "goto", - "back", - "reload", - "tabs", - "openTab", - "selectTab", - "closeTab", - "click", - "fill", - "type", - "press", - "select", - "hover", - "scroll", - "waitFor", - "snapshot", - "screenshot", - "evaluate", - "console", - "requests", - "handleDialog" -] as const; - -export type VerbName = (typeof VERB_NAMES)[number]; - -export const VERB_DESCRIPTIONS: Record = { - goto: "goto(url) — navigate the active tab and wait for the page to settle.", - back: "back() — go back one history entry in the active tab.", - reload: "reload() — reload the active tab.", - tabs: "tabs() — list open tabs as { id, url, title, active }; ids are stable.", - openTab: - "openTab(url?) — open a new tab (optionally at url) and make it active.", - selectTab: "selectTab(tabId) — make the given tab active.", - closeTab: "closeTab(tabId) — close the given tab.", - click: - "click({ref} | {selector} | {x,y}, options?) — click an element; prefer refs from snapshot().", - fill: "fill(target, value) — set a field's value directly (clears it first); use type() when the page needs per-keystroke events.", - type: "type(target, text, {delayMs?}) — type text keystroke by keystroke, triggering input handlers.", - press: - "press(key) — press a key or combination, e.g. 'Enter' or 'Control+a'.", - select: - "select(target, values) — choose