diff --git a/.changeset/eve-extension-eve-0-83.md b/.changeset/eve-extension-eve-0-83.md new file mode 100644 index 0000000..8b3d79b --- /dev/null +++ b/.changeset/eve-extension-eve-0-83.md @@ -0,0 +1,5 @@ +--- +"@upstash/agentkit-eve-extension": patch +--- + +Rebuild against eve 0.83.0 and raise the `eve` peer floor to `>=0.83.0`. The compiled extension now declares tool contract 102, dynamicTool 92 and hook 51, which only eve 0.83.0 accepts (0.82.0 and earlier reject them; eve 0.83.0 also rejects the tool 96 / dynamicTool 88 / hook 48 stamps of an eve 0.82.0 build). diff --git a/.changeset/eve-sandbox-eve-0-75.md b/.changeset/eve-sandbox-eve-0-75.md new file mode 100644 index 0000000..e903216 --- /dev/null +++ b/.changeset/eve-sandbox-eve-0-75.md @@ -0,0 +1,5 @@ +--- +"@upstash/agentkit-eve": patch +--- + +`UpstashSandbox` now works on eve 0.75 and later: the provider handle uses eve's renamed `onSandboxStop` / `onSandboxDelete` hooks (the old names are never called by eve 0.75+, so boxes were not paused or deleted). `setNetworkPolicy` is typed by the exported `UpstashSandboxSession`, since eve removed `MutableNetworkSandboxSession`. The `eve` peer floor is raised to `>=0.75.0`. diff --git a/.changeset/tanstack-ai-activities-store.md b/.changeset/tanstack-ai-activities-store.md new file mode 100644 index 0000000..050c467 --- /dev/null +++ b/.changeset/tanstack-ai-activities-store.md @@ -0,0 +1,5 @@ +--- +"@upstash/agentkit-tanstack-ai": minor +--- + +`upstashPersistence()` now includes an `activities` store (TanStack AI's `ActivityStore`): frontend-only AG-UI activity rows are persisted per thread in Redis, with the same TTL as the transcript, so they survive reloads and instance changes. It passes `@tanstack/ai-persistence` 0.10's conformance suite. Peer floors are raised to `@tanstack/ai` `>=0.65.0` and `@tanstack/ai-persistence` `>=0.8.0`. diff --git a/CLAUDE.md b/CLAUDE.md index 20349f6..9717ce9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -126,9 +126,9 @@ implements TanStack AI's own backend contracts (see its section below) — keep npm/yarn hoisted layouts — was fixed upstream in eve 0.25.3; no workaround needed on ≥0.25.3.) **Consumer eve version:** `eve extension build` stamps the manifest's `requires` with the building eve's *current* contribution-format versions, and a consumer rejects any version not in its own - supported list — the current dist, built with **eve 0.74.0**, stamps formatVersion 2; extension 1 / - **tool 78** / **dynamicTool 73** / **hook 39** / instructions 2 / config 1, which needs consumers on - **eve ≥0.74.0** — 0.74.0 is the first release accepting all three (0.72.0–0.73.0 refuse them: a pack of this dist built + supported list — the current dist, built with **eve 0.83.0**, stamps formatVersion 2; extension 1 / + **tool 102** / **dynamicTool 92** / **hook 51** / instructions 2 / config 1, which needs consumers on + **eve ≥0.83.0** — 0.83.0 is the first release accepting all three (0.82.0 refuses them, and **0.83.0 in turn refuses the 0.82.0 stamps 96/88/48** — verified by packing a 0.82.0-built dist into an `eve@0.83.0` consumer: "requires tool contract v96 … supports …"; 0.75.0–0.81.1 refuse them too; the 0.74.0 build stamped 78/73/39 with floor 0.74.0, published `0.16.0`; 0.72.0–0.73.0 refuse those: a pack of this dist built against 0.72.0/0.72.1/0.73.0 fails `eve build` with the obtuse "has no compile or runtime usage" error; the intermediate 0.72.1 build stamped 76/72/38 with floor 0.72.0 and was never released; 0.72.0 **dropped tool 71–75**; the published dist, built with 0.69.0, stamped 71/68/35 with floor 0.69.0 and fails on eve ≥0.72.0). Earlier: 0.69.0 was the first release accepting any of 71/68/35 (0.65.0–0.68.0 accept none @@ -164,7 +164,7 @@ implements TanStack AI's own backend contracts (see its section below) — keep release's worth of headroom. Since ~0.50 eve also **drops** contracts out of the middle of its supported range, so a *newer* eve is not automatically compatible either: the floor has repeatedly landed on the pinned version itself, with **no back-compat window at all**. - The `eve` peer is **`">=0.74.0"`, not `"*"`** — issue #22 proved the wildcard is a trap: eve + The `eve` peer is **`">=0.83.0"`, not `"*"`** — issue #22 proved the wildcard is a trap: eve 0.33 dropped hook contracts ≤9 *nine hours* after 0.32 shipped, so a wildcard install succeeds and then fails at `eve build` with a manifest error. The manifest is still the real compatibility tie; the peer floor is the install-time guard. **On every eve devDep bump: rebuild, read the new @@ -888,7 +888,7 @@ implements TanStack AI's own backend contracts (see its section below) — keep ## Eve framework facts - **The repo is split (since 2026-09-30): `packages/eve-extension` + `examples/eve-extension-demo` are - on `eve@0.74.0` (extension peer `>=0.74.0`, since 2026-10-08; 0.70.0 / `>=0.70.0` and 0.72.1 / `>=0.72.0` were never released); + on `eve@0.83.0` (extension peer `>=0.83.0`, since 2026-10-23; `>=0.82.0` since 2026-10-22, never released; `>=0.74.0` since 2026-10-08; 0.70.0 / `>=0.70.0` and 0.72.1 / `>=0.72.0` were never released); `packages/eve` + `examples/eve-demo` stay on `eve@0.65.0` (peer `>=0.65.0`)** — see the 0.68.0 → 0.69.0 and 0.65.0 → 0.68.0 bump notes below. Before that (2026-09-23) it was one `eve@0.65.0` everywhere, with both packages declaring `eve: ">=0.65.0"`. (For one @@ -1075,6 +1075,9 @@ implements TanStack AI's own backend contracts (see its section below) — keep implementation needed **no** new member for 0.55.0 — `pnpm typecheck` is clean across all four packages. Even the extension's compiled output is unchanged: **`_manifest.json` is the only file in `packages/eve-extension/dist` that differs from published `0.10.0`.** +- **TanStack AI 1.0.0 (2026-10-22) is NOT applied yet; `packages/tanstack-ai` + `examples/tanstack-ai-demo` stay on 0.71.0 / ai-persistence 0.10.1.** Against 1.0.0 `src` builds and the persistence conformance suite passes, but `pnpm typecheck` fails in tests only: `chat()` now requires `threadId` (`middleware.test.ts`, `search-tools.test.ts`; 4 runtime failures "chat() needs a threadId"), and `ArtifactRecord` requires `blobKey` (`persistence.test.ts` fixtures). Also: `@tanstack/ai@1.0.0`'s own `.d.ts` has a broken import (`spawn.d.ts`: `import('../../..')`), so `skipLibCheck: false` consumers get TS2307 from upstream. New 1.0 contracts not implemented yet: `SessionIndexStore`, `CredentialStore` (BYOK). ai 7.0.149+ added the `interrupted` finish reason; `@ai-sdk/react` pins `ai` exactly, so keep it in step (`^4.0.154` for ai 7.0.150). +- **eve 0.83.0 (2026-10-23) is applied to the extension only; `packages/eve` stays on 0.82.0.** 0.83.0 dropped the 0.82.0 contract stamps (extension rebuild: tool 96→102, dynamicTool 88→92, hook 48→51; extension peer `>=0.83.0`) and also **broke `packages/eve/src/sandbox.ts`'s typing** (not migrated yet — needs a source change): `eve/sandbox/provider` no longer exports `SandboxProviderHandle`/`SandboxProviderResources`; `NetworkPolicy` lists are mutable `string[]` (ours are `readonly`); `SandboxSession` requires `writeFiles`; `SandboxPrepareContext` lost `resources`/`sourceRevision`; the connection no longer has `handle`/`sandbox`/`onSandboxDelete`. Until that migration lands, `packages/eve` + `examples/eve-demo` pin `eve ^0.82.0` (two eve versions in the workspace on purpose). +- **The 0.74.0 → 0.82.0 bump (2026-10-22) moves everything, with a source migration in `packages/eve`.** eve 0.75.0 renamed the sandbox provider handle hooks `onSessionStop`/`onSessionDelete` → `onSandboxStop`/`onSandboxDelete`, and eve 0.66.0 had removed `MutableNetworkSandboxSession` (network policy became provider-specific). `packages/eve/src/sandbox.ts` now declares its own `UpstashSandboxSession = SandboxSession & { setNetworkPolicy }` (exported; what `ctx.getSandbox(environment)` returns) and uses the new hook names, so the `eve` peer floor moved `>=0.65.0` → **`>=0.75.0`** (floor read off the 0.74.0 vs 0.75.0 tarballs: `onSessionStop` present vs absent in `shared/sandbox-provider.d.ts`; not verified by a full `tsc` against 0.75.0). `packages/eve` + `examples/eve-demo` are on eve ^0.82.0. The extension rebuild re-stamps **tool 78→96, dynamicTool 73→88, hook 39→48**; only 0.82.0 accepts them (0.75.0–0.81.1 do not), floor `>=0.74.0` → **`>=0.82.0`**. `upstashPersistence` gained an `activities` store (`ActivityStore`, one JSON doc per thread at `:activities:`, same TTL as messages) because `@tanstack/ai-persistence` ≥0.8.0's conformance suite requires it, so ai-persistence moves 0.7.2 → 0.10.1 and the peer floors become `@tanstack/ai` `>=0.65.0` (`ActivityRecord` type), `@tanstack/ai-persistence` `>=0.8.0` (`ActivityStore` type). ai 7.0.148, @tanstack/ai 0.71.0, -memory 0.2.16 and the demo packages are bumped. - **The 0.72.1 → 0.74.0 bump (2026-10-08) is EXTENSION-ONLY again** (same reason: `packages/eve` still imports the removed `MutableNetworkSandboxSession`, `TS2305` in `src/sandbox.ts`/`sandbox.test.ts` on 0.74.0; `packages/eve` + `examples/eve-demo` stay on 0.65.0). The rebuild re-stamps **tool 76→78, dynamicTool 72→73, hook 38→39**; only 0.74.0 accepts them (verified by building the packed dist against a consumer on each of diff --git a/examples/ai-sdk-demo/package.json b/examples/ai-sdk-demo/package.json index dd9afb5..8fbfe98 100644 --- a/examples/ai-sdk-demo/package.json +++ b/examples/ai-sdk-demo/package.json @@ -9,11 +9,11 @@ }, "dependencies": { "@ai-sdk/openai": "^4.0.71", - "@ai-sdk/react": "^4.0.110", + "@ai-sdk/react": "^4.0.154", "@upstash/agentkit-ai-sdk": "workspace:*", "@upstash/agentkit-sdk": "workspace:*", "@upstash/redis": "^1.38.4", - "ai": "7.0.133", + "ai": "7.0.150", "dotenv": "^16.4.5", "next": "16.2.9", "react": "19.2.6", diff --git a/examples/eve-demo/package.json b/examples/eve-demo/package.json index 0c3eda3..1c1138a 100644 --- a/examples/eve-demo/package.json +++ b/examples/eve-demo/package.json @@ -28,11 +28,11 @@ "@upstash/box": "^0.7.5", "@upstash/redis": "^1.38.4", "@vercel/connect": "0.2.2", - "ai": "7.0.133", + "ai": "7.0.150", "class-variance-authority": "0.7.1", "clsx": "2.1.1", "cmdk": "1.1.1", - "eve": "^0.65.0", + "eve": "^0.82.0", "lucide-react": "1.16.0", "motion": "12.40.0", "nanoid": "5.1.11", diff --git a/examples/eve-extension-demo/package.json b/examples/eve-extension-demo/package.json index 6599fbf..a23b026 100644 --- a/examples/eve-extension-demo/package.json +++ b/examples/eve-extension-demo/package.json @@ -18,8 +18,8 @@ "@upstash/agentkit-eve-extension": "workspace:*", "@upstash/redis": "^1.38.4", "@vercel/connect": "0.2.2", - "ai": "7.0.133", - "eve": "^0.74.0", + "ai": "7.0.150", + "eve": "^0.83.0", "zod": "4.4.3" }, "devDependencies": { diff --git a/examples/tanstack-ai-demo/package.json b/examples/tanstack-ai-demo/package.json index 0b884ca..4a36476 100644 --- a/examples/tanstack-ai-demo/package.json +++ b/examples/tanstack-ai-demo/package.json @@ -10,12 +10,12 @@ "e2e": "vitest run --config e2e/vitest.config.ts" }, "dependencies": { - "@tanstack/ai": "0.65.1", - "@tanstack/ai-client": "0.38.0", - "@tanstack/ai-memory": "0.2.10", - "@tanstack/ai-openai": "0.27.0", - "@tanstack/ai-persistence": "0.7.2", - "@tanstack/ai-react": "0.30.0", + "@tanstack/ai": "0.71.0", + "@tanstack/ai-client": "0.40.1", + "@tanstack/ai-memory": "0.2.16", + "@tanstack/ai-openai": "0.31.0", + "@tanstack/ai-persistence": "0.10.1", + "@tanstack/ai-react": "0.31.1", "@upstash/agentkit-tanstack-ai": "workspace:*", "@upstash/redis": "^1.38.4", "next": "16.2.9", diff --git a/packages/ai-sdk/package.json b/packages/ai-sdk/package.json index 433b643..9bf3837 100644 --- a/packages/ai-sdk/package.json +++ b/packages/ai-sdk/package.json @@ -53,7 +53,7 @@ "@ai-sdk/openai": "^4.0.71", "@ai-sdk/provider": "^4.0.17", "@upstash/redis": "^1.38.4", - "ai": "7.0.133", + "ai": "7.0.150", "dotenv": "^16.4.5" }, "peerDependencies": { diff --git a/packages/eve-extension/AGENTS.md b/packages/eve-extension/AGENTS.md index 90443c7..29fcc98 100644 --- a/packages/eve-extension/AGENTS.md +++ b/packages/eve-extension/AGENTS.md @@ -37,7 +37,7 @@ unavailable, use https://eve.dev/docs/extensions as a fallback. agent-shaped source tree into `dist/extension/`, emits type declarations and a compatibility manifest, and fills the package `exports` map. Ship `dist/` only. `eve` is a required peer so the consumer's eve is the one that runs, but NOT a -wildcard: keep the floor (`>=0.74.0`) in sync with what the built manifest's +wildcard: keep the floor (`>=0.83.0`) in sync with what the built manifest's contracts require, so an incompatible eve fails at install instead of at `eve build` (see issue #22). eve validates the real compatibility from the generated manifest. diff --git a/packages/eve-extension/README.md b/packages/eve-extension/README.md index 175ef62..6ca4951 100644 --- a/packages/eve-extension/README.md +++ b/packages/eve-extension/README.md @@ -15,7 +15,7 @@ no repeated schemas; upgrades come through the package manager. `` is the mount file's basename — the examples below use `agentkit`. -Start from an eve project (eve ≥ 0.74.0 — the prebuilt extension is built with eve 0.74.0 and its compatibility manifest requires tool contract v78 (dynamicTool v73, hook v39), which eve 0.74.0 is the first release to support; the package declares this as its `eve` peer range), then: +Start from an eve project (eve ≥ 0.83.0 — the prebuilt extension is built with eve 0.83.0 and its compatibility manifest requires tool contract v102 (dynamicTool v92, hook v51), which eve 0.83.0 is the first release to support; the package declares this as its `eve` peer range), then: ```bash pnpm add @upstash/agentkit-eve-extension diff --git a/packages/eve-extension/package.json b/packages/eve-extension/package.json index fd9f7fc..5fcbb13 100644 --- a/packages/eve-extension/package.json +++ b/packages/eve-extension/package.json @@ -56,10 +56,10 @@ }, "devDependencies": { "@types/node": "24.x", - "eve": "^0.74.0", + "eve": "^0.83.0", "typescript": "7.0.2" }, "peerDependencies": { - "eve": ">=0.74.0" + "eve": ">=0.83.0" } } diff --git a/packages/eve/package.json b/packages/eve/package.json index f7f8013..c1ba33c 100644 --- a/packages/eve/package.json +++ b/packages/eve/package.json @@ -60,14 +60,14 @@ "devDependencies": { "@upstash/box": "^0.7.5", "@upstash/redis": "^1.38.4", - "ai": "7.0.133", + "ai": "7.0.150", "dotenv": "^16.4.5", - "eve": "^0.65.0" + "eve": "^0.82.0" }, "peerDependencies": { "@upstash/box": ">=0.7.1", "@upstash/redis": ">=1.38.4", - "eve": ">=0.65.0" + "eve": ">=0.75.0" }, "peerDependenciesMeta": { "@upstash/box": { diff --git a/packages/eve/src/sandbox.test.ts b/packages/eve/src/sandbox.test.ts index f4a0aee..00783c6 100644 --- a/packages/eve/src/sandbox.test.ts +++ b/packages/eve/src/sandbox.test.ts @@ -2,7 +2,7 @@ import { config } from "dotenv"; import { afterEach, describe, expect, it, vi } from "vitest"; import { Box } from "@upstash/box"; import type { SandboxProviderImplementation } from "eve/sandbox/provider"; -import type { MutableNetworkSandboxSession } from "eve/sandbox"; +import type { UpstashSandboxSession } from "./sandbox.js"; import { UpstashSandbox, rewriteWorkspacePaths, @@ -18,7 +18,7 @@ type Impl = SandboxProviderImplementation< { networkPolicy?: unknown } | undefined, { snapshotId: string | null }, { boxId: string; version: 1 }, - MutableNetworkSandboxSession + UpstashSandboxSession >; /** @@ -237,16 +237,16 @@ describe("UpstashSandbox provider (offline)", () => { vi.spyOn(Box, "create").mockResolvedValue(fakeBox(calls) as unknown as Box); const { handle } = await implementationOf().start(sessionCtx(), undefined, noArtifact); - await handle.onSessionStop(); + await handle.onSandboxStop(); await handle.onRuntimeShutdown(); expect(calls).toEqual(["pause", "pause"]); - await handle.onSessionDelete(); + await handle.onSandboxDelete(); expect(calls).toEqual(["pause", "pause", "delete"]); // Gone: repeat teardown is a no-op (eve can still call shutdown on a deleted handle). - await handle.onSessionDelete(); - await handle.onSessionStop(); + await handle.onSandboxDelete(); + await handle.onSandboxStop(); await handle.onRuntimeShutdown(); expect(calls).toEqual(["pause", "pause", "delete"]); }); @@ -256,7 +256,7 @@ describe("UpstashSandbox provider (offline)", () => { box.pause.mockRejectedValue(new Error("keep-alive boxes cannot be paused")); vi.spyOn(Box, "create").mockResolvedValue(box as unknown as Box); const { handle } = await implementationOf().start(sessionCtx(), undefined, noArtifact); - await expect(handle.onSessionStop()).rejects.toThrow(/keep-alive/); + await expect(handle.onSandboxStop()).rejects.toThrow(/keep-alive/); await expect(handle.onRuntimeShutdown()).resolves.toBeUndefined(); }); @@ -264,7 +264,7 @@ describe("UpstashSandbox provider (offline)", () => { const calls: string[] = []; vi.spyOn(Box, "create").mockResolvedValue(fakeBox(calls) as unknown as Box); const { handle } = await implementationOf().start(sessionCtx(), undefined, noArtifact); - await expect(handle.onSessionDelete({ abortSignal: AbortSignal.abort() })).rejects.toThrow(); + await expect(handle.onSandboxDelete({ abortSignal: AbortSignal.abort() })).rejects.toThrow(); expect(calls).toEqual([]); }); }); @@ -336,13 +336,13 @@ describe.skipIf(!hasBoxCreds)("UpstashSandbox provider (live Upstash Box)", () = // stop = pause; resume reattaches the SAME box (state survives), network policy included. await s.writeTextFile({ path: "turn1.txt", content: "kept" }); - await handle.onSessionStop(); + await handle.onSandboxStop(); const resumed = await impl.resume(sessionCtx("live"), artifact, state); expect(await resumed.sandbox.readTextFile({ path: "turn1.txt" })).toBe("kept"); expect((await resumed.sandbox.run({ command: fetchCmd })).exitCode).toBe(0); // delete = gone for good; resuming it now fails instead of silently making a new box. - await resumed.onSessionDelete(); + await resumed.onSandboxDelete(); await expect(impl.resume(sessionCtx("live"), artifact, state)).rejects.toThrow( /no longer available/, ); diff --git a/packages/eve/src/sandbox.ts b/packages/eve/src/sandbox.ts index 75d9bf2..e74b122 100644 --- a/packages/eve/src/sandbox.ts +++ b/packages/eve/src/sandbox.ts @@ -59,11 +59,7 @@ import { createHash, randomBytes } from "node:crypto"; import { Box } from "@upstash/box"; import type { BoxConfig, NetworkPolicy as BoxNetworkPolicy } from "@upstash/box"; -import type { - MutableNetworkSandboxSession, - SandboxNetworkPolicy, - SandboxProcess, -} from "eve/sandbox"; +import type { SandboxNetworkPolicy, SandboxProcess, SandboxSession } from "eve/sandbox"; import { defineSandboxProvider } from "eve/sandbox/provider"; import type { SandboxDeleteOptions, @@ -71,6 +67,16 @@ import type { SandboxProviderResources, } from "eve/sandbox/provider"; +/** + * The session type of an Upstash Box sandbox: eve's {@link SandboxSession} plus `setNetworkPolicy`. + * eve ≥0.66 made network policy provider-specific (it left the common session), so this provider + * declares it; `ctx.getSandbox(environment)` returns this type. + */ +export type UpstashSandboxSession = SandboxSession & { + /** Replace the box's egress policy (deny-all by default). */ + setNetworkPolicy(policy: SandboxNetworkPolicy): Promise; +}; + /** Options for `environment.open(...)` — applied once, when eve starts the session's box. */ export interface UpstashSandboxOpenOptions { /** Network policy for the session's box. Defaults to deny-all. */ @@ -98,7 +104,7 @@ export type UpstashSandboxEnvironmentOptions = Omit Promise | void; + prepare?: (sandbox: UpstashSandboxSession) => Promise | void; /** * A **base Box snapshot** to build on instead of a bare `Box.create` — for heavy, slow-changing * setup (browser binaries, a toolchain) you bake and manage yourself, out of band. `prepare` layers @@ -324,8 +330,8 @@ async function spawnOnBox(box: Box, options: ProcessOptions): Promise toBoxPath(path); @@ -465,14 +471,14 @@ function requireState(state: unknown): UpstashSandboxState { } /** Provider handle over a live box: the session plus eve's lifecycle hooks. */ -function createHandle(box: Box): SandboxProviderHandle { - // Set once `onSessionDelete` destroyed the box: eve may still call stop/shutdown on the handle. +function createHandle(box: Box): SandboxProviderHandle { + // Set once `onSandboxDelete` destroyed the box: eve may still call stop/shutdown on the handle. let deleted = false; return { sandbox: buildSession(box), // `sandbox.stop()`: release compute, keep the box resumable (`resume` → `Box.get` auto-resumes). // Provider errors must reject — keep-alive boxes can't be paused and will. - async onSessionStop() { + async onSandboxStop() { if (deleted) return; await box.pause(); }, @@ -484,7 +490,7 @@ function createHandle(box: Box): SandboxProviderHandle({ name: "upstash", environment(options) { diff --git a/packages/tanstack-ai/README.md b/packages/tanstack-ai/README.md index a410367..4e9345f 100644 --- a/packages/tanstack-ai/README.md +++ b/packages/tanstack-ai/README.md @@ -46,7 +46,7 @@ const persistence = upstashPersistence({ chat({ adapter, messages, threadId, middleware: [withPersistence(persistence)] }); ``` -Stores `messages`, `runs`, `interrupts` and `metadata` (the full `ChatPersistence` shape). Runs are +Stores `messages`, `activities` (frontend-only AG-UI activity rows), `runs`, `interrupts` and `metadata` (the full `ChatPersistence` shape). Runs are indexed by thread, parent run and detach time, so reconnect (`findActiveRun`), subagent cards (`listByParentRun`) and the sandbox reaper (`listReclaimable`) are index reads. Every mutation is a single command or one Lua script, so concurrent instances cannot interleave a write. diff --git a/packages/tanstack-ai/package.json b/packages/tanstack-ai/package.json index 7a893e7..e97d6ef 100644 --- a/packages/tanstack-ai/package.json +++ b/packages/tanstack-ai/package.json @@ -58,16 +58,16 @@ "zod": "^3.23.8 || ^4" }, "devDependencies": { - "@tanstack/ai": "0.65.1", - "@tanstack/ai-memory": "0.2.10", - "@tanstack/ai-persistence": "0.7.2", + "@tanstack/ai": "0.71.0", + "@tanstack/ai-memory": "0.2.16", + "@tanstack/ai-persistence": "0.10.1", "dotenv": "^16.4.5", "@upstash/blob": "0.0.7" }, "peerDependencies": { - "@tanstack/ai": ">=0.63.0", + "@tanstack/ai": ">=0.65.0", "@tanstack/ai-memory": ">=0.2.8", - "@tanstack/ai-persistence": ">=0.7.1", + "@tanstack/ai-persistence": ">=0.8.0", "@upstash/blob": ">=0.0.7" }, "peerDependenciesMeta": { diff --git a/packages/tanstack-ai/src/persistence/persistence.test.ts b/packages/tanstack-ai/src/persistence/persistence.test.ts index c4fe9d3..3142959 100644 --- a/packages/tanstack-ai/src/persistence/persistence.test.ts +++ b/packages/tanstack-ai/src/persistence/persistence.test.ts @@ -7,7 +7,7 @@ import { upstashPersistence } from "./persistence.js"; import { testBucket, type TestBucket } from "../testing/test-bucket.js"; import { cleanupKeys, hasRedisCreds, testRedis, uniquePrefix } from "../testing/test-support.js"; -// Every opt-in check the kit offers (as of @tanstack/ai-persistence 0.7.1); none is skipped. +// Every opt-in check the kit offers (as of @tanstack/ai-persistence 0.10.1); none is skipped. const OPT_IN_CHECKS: PersistenceConformanceCheck[] = [ "messages.metadata", "runs.listByThread.state", @@ -16,7 +16,7 @@ const OPT_IN_CHECKS: PersistenceConformanceCheck[] = [ const hasBlobToken = Boolean(process.env.UPSTASH_BLOB_TOKEN); // TanStack AI's own backend conformance suite, run against a real Upstash Redis, with every store -// present and none skipped: messages, runs, interrupts, metadata, generationRuns, artifacts, blobs. +// present and none skipped: messages, activities, runs, interrupts, metadata, generationRuns, artifacts, blobs. // Blob bytes go to a stand-in bucket whose signed URLs are served over real HTTP with Range support. describe.skipIf(!hasRedisCreds)("upstashPersistence (live Redis)", () => { const redis = testRedis(); diff --git a/packages/tanstack-ai/src/persistence/persistence.ts b/packages/tanstack-ai/src/persistence/persistence.ts index 22d8647..82a4a49 100644 --- a/packages/tanstack-ai/src/persistence/persistence.ts +++ b/packages/tanstack-ai/src/persistence/persistence.ts @@ -1,8 +1,9 @@ import type { Redis } from "@upstash/redis"; import { Redis as RedisClient } from "@upstash/redis"; -import type { ModelMessage, RunRecord, RunStore } from "@tanstack/ai"; +import type { ActivityRecord, ModelMessage, RunRecord, RunStore } from "@tanstack/ai"; import type { AIPersistence, + ActivityStore, ArtifactStore, BlobStore, ChatPersistenceStores, @@ -32,7 +33,7 @@ export interface UpstashPersistenceConfig { /** Base key prefix. Defaults to `agentkit:tanstack`. */ prefix?: string; /** - * Expire a thread's stored transcript this many seconds after its last save. Omit to keep + * Expire a thread's stored transcript and activity rows this many seconds after its last save. Omit to keep * transcripts forever. Run, interrupt and metadata records are never expired automatically. */ messagesTtlSeconds?: number; @@ -95,6 +96,8 @@ return 1`; * `withGenerationPersistence()`. * * - **messages**: the thread transcript, one JSON document per thread (`saveThread` overwrites). + * - **activities**: frontend-only AG-UI activity rows for a thread, one JSON document per thread + * (`saveActivities` overwrites), kept out of the transcript. * - **runs**: a JSON document per run plus sorted-set indexes by thread, by parent run and by detach * time, so `findActiveRun`, `listByThread`, `listByParentRun` and `listReclaimable` are index reads. * - **interrupts**: human-in-the-loop pauses, indexed by thread and run; `commitBatch` is atomic. @@ -121,6 +124,7 @@ export function upstashPersistence( const p = config.prefix ?? "agentkit:tanstack"; const k = { thread: (id: string) => `${p}:thread:${id}`, + activities: (id: string) => `${p}:activities:${id}`, run: (id: string) => `${p}:run:${id}`, threadRuns: (id: string) => `${p}:threadRuns:${id}`, parentRuns: (id: string) => `${p}:parentRuns:${id}`, @@ -152,6 +156,20 @@ export function upstashPersistence( }, }; + const activities: ActivityStore = { + async loadActivities(threadId) { + assertId(threadId, "threadId"); + return (await redis.json.get(k.activities(threadId))) ?? []; + }, + async saveActivities(threadId, list) { + assertId(threadId, "threadId"); + const tx = redis.multi(); + tx.json.set(k.activities(threadId), "$", list as unknown as Record); + if (config.messagesTtlSeconds) tx.expire(k.activities(threadId), config.messagesTtlSeconds); + await tx.exec(); + }, + }; + const runs: RunStore = { async createOrResume(input) { assertId(input.runId, "runId"); @@ -344,6 +362,7 @@ export function upstashPersistence( return { stores: { messages, + activities, runs, interrupts, metadata, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 49dbdcb..36a18b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: specifier: ^4.0.71 version: 4.0.71(zod@4.4.3) '@ai-sdk/react': - specifier: ^4.0.110 - version: 4.0.110(react@19.2.6)(zod@4.4.3) + specifier: ^4.0.154 + version: 4.0.154(react@19.2.6)(zod@4.4.3) '@upstash/agentkit-ai-sdk': specifier: workspace:* version: link:../../packages/ai-sdk @@ -60,8 +60,8 @@ importers: specifier: ^1.38.4 version: 1.38.4 ai: - specifier: 7.0.133 - version: 7.0.133(zod@4.4.3) + specifier: 7.0.150 + version: 7.0.150(zod@4.4.3) dotenv: specifier: ^16.4.5 version: 16.6.1 @@ -134,10 +134,10 @@ importers: version: 1.38.4 '@vercel/connect': specifier: 0.2.2 - version: 0.2.2(@ai-sdk/mcp@2.0.54(zod@4.4.3))(ai@7.0.133(zod@4.4.3))(eve@0.65.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3))) + version: 0.2.2(@ai-sdk/mcp@2.0.83(zod@4.4.3))(ai@7.0.150(zod@4.4.3))(eve@0.82.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3))) ai: - specifier: 7.0.133 - version: 7.0.133(zod@4.4.3) + specifier: 7.0.150 + version: 7.0.150(zod@4.4.3) class-variance-authority: specifier: 0.7.1 version: 0.7.1 @@ -148,8 +148,8 @@ importers: specifier: 1.1.1 version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) eve: - specifier: ^0.65.0 - version: 0.65.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3)) + specifier: ^0.82.0 + version: 0.82.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3)) lucide-react: specifier: 1.16.0 version: 1.16.0(react@19.2.6) @@ -216,13 +216,13 @@ importers: version: 1.38.4 '@vercel/connect': specifier: 0.2.2 - version: 0.2.2(@ai-sdk/mcp@2.0.54(zod@4.4.3))(ai@7.0.133(zod@4.4.3))(eve@0.74.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3))) + version: 0.2.2(@ai-sdk/mcp@2.0.83(zod@4.4.3))(ai@7.0.150(zod@4.4.3))(eve@0.83.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3))) ai: - specifier: 7.0.133 - version: 7.0.133(zod@4.4.3) + specifier: 7.0.150 + version: 7.0.150(zod@4.4.3) eve: - specifier: ^0.74.0 - version: 0.74.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3)) + specifier: ^0.83.0 + version: 0.83.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3)) zod: specifier: 4.4.3 version: 4.4.3 @@ -280,23 +280,23 @@ importers: examples/tanstack-ai-demo: dependencies: '@tanstack/ai': - specifier: 0.65.1 - version: 0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3) + specifier: 0.71.0 + version: 0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3) '@tanstack/ai-client': - specifier: 0.38.0 - version: 0.38.0(@opentelemetry/api@1.9.1)(zod@4.4.3) + specifier: 0.40.1 + version: 0.40.1(@opentelemetry/api@1.9.1)(zod@4.4.3) '@tanstack/ai-memory': - specifier: 0.2.10 - version: 0.2.10(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0)) + specifier: 0.2.16 + version: 0.2.16(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0)) '@tanstack/ai-openai': - specifier: 0.27.0 - version: 0.27.0(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(ws@8.21.3)(zod@4.4.3) + specifier: 0.31.0 + version: 0.31.0(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(undici@8.10.2)(ws@8.21.3)(zod@4.4.3) '@tanstack/ai-persistence': - specifier: 0.7.2 - version: 0.7.2(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0)) + specifier: 0.10.1 + version: 0.10.1(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0)) '@tanstack/ai-react': - specifier: 0.30.0 - version: 0.30.0(@opentelemetry/api@1.9.1)(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + specifier: 0.31.1 + version: 0.31.1(@opentelemetry/api@1.9.1)(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) '@upstash/agentkit-tanstack-ai': specifier: workspace:* version: link:../../packages/tanstack-ai @@ -354,8 +354,8 @@ importers: specifier: ^4.0.17 version: 4.0.17 ai: - specifier: 7.0.133 - version: 7.0.133(zod@4.4.3) + specifier: 7.0.150 + version: 7.0.150(zod@4.4.3) dotenv: specifier: ^16.4.5 version: 16.6.1 @@ -379,14 +379,14 @@ importers: specifier: ^1.38.4 version: 1.38.4 ai: - specifier: 7.0.133 - version: 7.0.133(zod@4.4.3) + specifier: 7.0.150 + version: 7.0.150(zod@4.4.3) dotenv: specifier: ^16.4.5 version: 16.6.1 eve: - specifier: ^0.65.0 - version: 0.65.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3)) + specifier: ^0.82.0 + version: 0.82.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3)) packages/eve-extension: dependencies: @@ -404,8 +404,8 @@ importers: specifier: 24.x version: 24.13.2 eve: - specifier: ^0.74.0 - version: 0.74.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3)) + specifier: ^0.83.0 + version: 0.83.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3)) typescript: specifier: 7.0.2 version: 7.0.2 @@ -464,14 +464,14 @@ importers: version: 4.4.3 devDependencies: '@tanstack/ai': - specifier: 0.65.1 - version: 0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3) + specifier: 0.71.0 + version: 0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3) '@tanstack/ai-memory': - specifier: 0.2.10 - version: 0.2.10(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0)) + specifier: 0.2.16 + version: 0.2.16(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0)) '@tanstack/ai-persistence': - specifier: 0.7.2 - version: 0.7.2(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0)) + specifier: 0.10.1 + version: 0.10.1(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0)) '@upstash/blob': specifier: 0.0.7 version: 0.0.7(react@19.2.6) @@ -489,20 +489,14 @@ packages: zod: optional: true - '@ai-sdk/gateway@4.0.108': - resolution: {integrity: sha512-UgtnyyuIpMSzhha89MAK6c2pTeQW8s9jLSmDeYI92NzqDsoyEYFZ/lYAXTXLUQxA25j5iTWPEnzGVl5adIy+8w==} + '@ai-sdk/gateway@4.0.123': + resolution: {integrity: sha512-IC6w1vADmRyOfB7Kl9A7348p5pazYodb2humlQAahSJSBW9MGCoafbM8h8+rgukYBSV8gjcZoAxPxPX5RQK8mw==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@4.0.87': - resolution: {integrity: sha512-6wJmX/D5OO7tvDJbtFdXdBuRt8AkCnW+FLK+W35UHe/tHgolAa4hclXtJcMSYnlTDy/t5DNRgdesVaoMXtwzow==} - engines: {node: '>=22'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/mcp@2.0.54': - resolution: {integrity: sha512-Q9o7KCyPNRrC7VhBtbnZh2OiApNbFhsNupjDQLW6P/y3xV6l9HES2KWeu0905T9IH6HurN6ckJwRXE0PnLL7Mg==} + '@ai-sdk/mcp@2.0.83': + resolution: {integrity: sha512-XcDGqrMvbJHZOE5GS/RFLCYGMgH+4CDqQMWtpu9ddzdujbCJU3dDLCT5h573ba4tJedv9K9UiAggawbayT+4IA==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -519,8 +513,8 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@5.0.57': - resolution: {integrity: sha512-giQ9mNwVzYUbahU2DG1FWEjXkDU8D8Hitz7Rk4AlRGtqh8Ss48msQ9+wEAXquWs/GYOETzxMMFsgcHK0i7TbUQ==} + '@ai-sdk/provider-utils@5.0.67': + resolution: {integrity: sha512-EUzV6GXutGcesWKOY8tRKgijfuv1LUBpqAquMh5k0n74NCjDbca5d5ZG12qhVtM2X5UwM4B2ZMP2XpnAwZlA8Q==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -529,12 +523,12 @@ packages: resolution: {integrity: sha512-VYMBxIQdcHqbIf1j+YZlI9Ati6LZ4wJe0GGd4z4a5H/KxTggjeOiyaVYTnfF7LHZK5jMQ+rofmzz4QPqf++NUw==} engines: {node: '>=22'} - '@ai-sdk/provider@4.0.25': - resolution: {integrity: sha512-vG0l7MUavfhn6c5+Z0y1/E6lKUrzecsLtFkuIknnHjAGAIiuwFDucafzebJuFVTZcLyhf8qhYYU2zeKP55Mymw==} + '@ai-sdk/provider@4.0.33': + resolution: {integrity: sha512-C6ylMuAXjgqKJllp6ODIJwUltK/tm3ZmIj4V2fqENP3Y8gif2DyeJSsTcDwFrXppgEKcrBisi/BWx2tYeoeCAw==} engines: {node: '>=22'} - '@ai-sdk/react@4.0.110': - resolution: {integrity: sha512-5WSYzAwdnECdDekICJjj2e83793YYNAcTk8yAEvt/sxme1NXTE3OWr3QLSJPjkyOaa6XAmJ6iE/R9l+2YvcI3Q==} + '@ai-sdk/react@4.0.154': + resolution: {integrity: sha512-kaKzm0PBWcKA4CJ9MhM2Sv8HLuL3mG/1Bw4B8OEAH0blyGn0dv/62RP4xUTLZaA4dzlKp4ODs40vHoM/J9Jxzg==} engines: {node: '>=22'} peerDependencies: react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 @@ -553,6 +547,9 @@ packages: '@braintree/sanitize-url@7.1.2': resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + '@cfworker/json-schema@4.1.1': + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + '@changesets/apply-release-plan@7.1.1': resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} @@ -990,89 +987,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -1178,48 +1191,56 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@16.2.9': resolution: {integrity: sha512-hBD75iWpUtkL9SmQmcRhmLomn9jgkPzCEkbOcLgHymPEKzv+6ONy13RRiIEz/iEObjkS2Jlb5gYS2XGoS3X4rw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@16.2.6': resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@16.2.9': resolution: {integrity: sha512-qZTI3pf9SGc/obr8NkQAekBxmp1QK+kVm+VAf3BALLfFAj+1kUhkTxmrWpVos9R/UYIA8AWX2p6cGI5WdwzVUA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@16.2.6': resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@16.2.9': resolution: {integrity: sha512-xm0HfRNX+UkH4R3c18ynswjj5o5uEj/7iI9p9omdtTSIsRCzQqkGMA+10nzJ4EHnYC3as65IMhbbl5fWRUWHYg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@16.2.6': resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@16.2.9': resolution: {integrity: sha512-QumimHkGEG6vM3PfEDWKyKen03NcqLOkeKB1EfcPe7VxzmEiCa4jNnMyBn/US5zcd/VE1CI+O8Ovb3lfjVHfGw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@16.2.6': resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==} @@ -2166,36 +2187,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.2.7': resolution: {integrity: sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.2.7': resolution: {integrity: sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.2.7': resolution: {integrity: sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.2.7': resolution: {integrity: sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-musl@1.2.7': resolution: {integrity: sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-openharmony-arm64@1.2.7': resolution: {integrity: sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==} @@ -2252,66 +2279,79 @@ packages: resolution: {integrity: sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.62.0': resolution: {integrity: sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.62.0': resolution: {integrity: sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.62.0': resolution: {integrity: sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.62.0': resolution: {integrity: sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.62.0': resolution: {integrity: sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.62.0': resolution: {integrity: sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.62.0': resolution: {integrity: sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.62.0': resolution: {integrity: sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.62.0': resolution: {integrity: sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.62.0': resolution: {integrity: sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.62.0': resolution: {integrity: sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.62.0': resolution: {integrity: sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.62.0': resolution: {integrity: sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==} @@ -2456,24 +2496,28 @@ packages: engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.3.0': resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.3.0': resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.3.0': resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.3.0': resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} @@ -2506,17 +2550,17 @@ packages: '@tailwindcss/postcss@4.3.0': resolution: {integrity: sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==} - '@tanstack/ai-client@0.38.0': - resolution: {integrity: sha512-FezxsKqU+lSXxAqWa+oKWtieJ8r16C0V0t3ERvcK67l8fXUmVjKh8oSZA3XH8ffsOESHxr4zrTZbEY+dDpZ4bg==} + '@tanstack/ai-client@0.40.1': + resolution: {integrity: sha512-nXCPiQHii1gZdvhmbfXwqpOtDNaoRYcLAcURfcSoBvH2YN4OT3B0jGU1VC3b9wYHv/bjyGGyRVdihlgKkLbsWw==} '@tanstack/ai-event-client@0.13.1': resolution: {integrity: sha512-lCPcshu6Sd4tFNeMSr+HXgdqCGupYU2cpJZVUent4GkFx41dXzrBaKkwOgkji6olDBT99OBagWCce1NZ15XeJA==} - '@tanstack/ai-memory@0.2.10': - resolution: {integrity: sha512-9kxCmiRx6kclo7disvAldP63bqWbcPk6pEo40T+vMLy7dZ1mPQztVTakQ16m4YZqYtUITJdFE0EntdflA4Bf+g==} + '@tanstack/ai-memory@0.2.16': + resolution: {integrity: sha512-0gWJ69FwJdMDkuKBalcCkK8AdL9g671aLXEaGEtqAaw252qSvPgJvHGOaKhoRlpPSk4ZG63xF2E7JhP+2CQQig==} peerDependencies: '@honcho-ai/sdk': '>=2.0.0' - '@tanstack/ai': ^0.65.0 + '@tanstack/ai': ^0.71.0 '@vectorize-io/hindsight-client': '>=0.6.0' ioredis: '>=5.0.0' redis: '>=4.0.0' @@ -2533,25 +2577,25 @@ packages: vitest: optional: true - '@tanstack/ai-openai@0.27.0': - resolution: {integrity: sha512-LNNdld4q8ztpbuWWLznlErF7KX5HBZhDfC3UlzDIsMVMA56RRJZiW2i8RSH0weoIajoAeAWUjQLAo3c6RsC9EQ==} + '@tanstack/ai-openai@0.31.0': + resolution: {integrity: sha512-ugSh6YAuy5gLeWecspwJzpTE3//8JOEhP9gQMbjy87l4vo4lfUcTfd/sXzfii8Z9cOncDoB9Gwe6TfgBFBynLA==} peerDependencies: - '@tanstack/ai': ^0.65.0 + '@tanstack/ai': ^0.71.0 - '@tanstack/ai-persistence@0.7.2': - resolution: {integrity: sha512-m81bTdWZQw2mGrQcBYnLylkSXGhsC6GfqxSEGv/XQUlRAEjVnlp7Fwk2fNiA3DmSaRLsoNIij6X6ZNChmN8fqg==} + '@tanstack/ai-persistence@0.10.1': + resolution: {integrity: sha512-EQ4XNUzoVY13rPobuZX6kWnKnedxgvuCdTfbrzySQFnqmAFlPaPqOwWHs/yfVe7fusSaBZSHEGScbkIoiLXhuw==} peerDependencies: - '@tanstack/ai': ^0.64.0 + '@tanstack/ai': ^0.71.0 vitest: ^4.1.10 peerDependenciesMeta: vitest: optional: true - '@tanstack/ai-react@0.30.0': - resolution: {integrity: sha512-V1ZB5Kxo9dzUM7Fi3a3pLd/nEWCpMnYoKjKrbe0he+RkIdDMYsR0GyqW2fzO0bsvir/ZWdRBYkXMQPR2GOwSBQ==} + '@tanstack/ai-react@0.31.1': + resolution: {integrity: sha512-c/NzzXAbyBrjRntUrrlMa8zKTLgbronXkVi/Prq+XhR+vUh3VgvSQ1I3sQ33uHtBYS7THFUhwri4/muDRHjXhg==} peerDependencies: '@mcp-ui/client': ^7 - '@tanstack/ai': ^0.65.1 + '@tanstack/ai': ^0.71.0 '@types/react': '>=18.0.0' react: '>=18.0.0' react-dom: '>=18.0.0' @@ -2561,11 +2605,11 @@ packages: react-dom: optional: true - '@tanstack/ai-utils@0.4.1': - resolution: {integrity: sha512-B3PGn2WYiRtivZCt7MUN2iXeoK9fwZhgdbrPIz5hPqVR8r8sNDZMmMqtiOkp7sxzPvVlCBItFVHw7QpZ9g6e9w==} + '@tanstack/ai-utils@0.5.0': + resolution: {integrity: sha512-7RQHPWoon+EPDx6RXb1EAuRWPLijewROF8C56yfVANPeIrIeEBeYVdE8c//cMPDNd+3XS1bgehEg754Aw7htjg==} - '@tanstack/ai@0.65.1': - resolution: {integrity: sha512-odtyX1+LiLG8DHXpgWh4DVYNJD6G6l/ii3WKTu6JXJDCKf2LQ8ieQOANzoEiE7lciJXPsr1G0PvnFFVK3QJDnQ==} + '@tanstack/ai@0.71.0': + resolution: {integrity: sha512-YqbrydU7Yn+Z65CYC1eCvDxwoDfSp77t9xi3jm9mpBRTi2KXZuvtba3TrD+DucszuvLpiUeVLl8IEQIgkyn0Gw==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': '>=1.9.0' @@ -2589,10 +2633,13 @@ packages: react: optional: true - '@tanstack/openai-base@0.12.4': - resolution: {integrity: sha512-Z82PgFWyTmcsVHPuAcFTnbwfXtlh4/0PK8NDFACUBZm+ekSsQTzInzOLL7enW49vgEmbUrvH/V/jtWeKaE6pcw==} + '@tanstack/openai-base@0.16.0': + resolution: {integrity: sha512-j2mRfd1S9Gzy7YNW+YwN3IlnhZFeaBYawWZIg5301FNjDFcRwx+0KyXdDxrFdQn3DuCr7fUETD8XqdDKf4/AKA==} peerDependencies: - '@tanstack/ai': ^0.65.0 + '@tanstack/ai': ^0.71.0 + + '@tanstack/store@0.11.2': + resolution: {integrity: sha512-sJ4mjol8uQsHV0gOJzzjwXfh2Fwm+Sz0+8deqiTm4jGbMdjzNSW+xZCFm0kUa870uhd8yi+DpKnZb5Kc4apa0Q==} '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -3080,14 +3127,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ai@7.0.107: - resolution: {integrity: sha512-PVYQ3W9kR8oYiGQxbg4aFIlhQzKskZm8UV+4E0zB2uKOzFr8ju3bXQncOOZtLsOgJY8vdpgyu3cXtomsfcdQYg==} - engines: {node: '>=22'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - ai@7.0.133: - resolution: {integrity: sha512-OjyVMdsDp4ORPSrRB9hiYGic4bzeiOtaOzBPxOM7jiavz6tSXuMrqLwd1eILGhN669VD0G/+jxaiweRqfVulYg==} + ai@7.0.150: + resolution: {integrity: sha512-ZTgHXBTJf2ad0elG2HWhbNTUGPaYy8e5pzK4A8LP/dDa48bvIRi8Iv1/bQhklFmFssosajAjCsAZrieBUa+hYA==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -3581,15 +3622,15 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - eve@0.65.0: - resolution: {integrity: sha512-16dcyvpucnMp6f1TKZROvRrDAYWIlV7ulZfEMK+IuK1AVXMQPoLLOrGuLT/qI1TjIkxZt9g1JcXXOv/uu3yjdQ==} + eve@0.82.0: + resolution: {integrity: sha512-HQqjGebljxuO0EYX0XkQaY3/lHmn/oaFe8ggPAkcNIgVW9elyH7x+NjhABAqCO+Tz4azhurq87KeZzbRphJosA==} engines: {node: '>=24'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.0.0 - ai: ^7.0.105 + ai: ^7.0.137 braintrust: ^3.0.0 - chat: ^4.41.0 + chat: ^4.42.0 dd-trace: ^6.13.0 just-bash: ^3.1.0 microsandbox: ^0.5.0 @@ -3607,18 +3648,17 @@ packages: microsandbox: optional: true - eve@0.74.0: - resolution: {integrity: sha512-pXIvp8wGorrNXqO1/aQa1QJR85qI31ShrVGcRmdcfdugoEbhHN/vVWuvWQeGDPvEWkA1gqeAzCJ0ZO+Q0W7InA==} + eve@0.83.0: + resolution: {integrity: sha512-qxw8Ck/vBrfIAqgodalXKkpE86eDcydNaJ2ww2AiHVs7CgGCu5qSipr5vOSc4GXkDssbJ9DaV4iVtol2kwV8Hg==} engines: {node: '>=24'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.0.0 - ai: ^7.0.128 + ai: ^7.0.137 braintrust: ^3.0.0 - chat: ^4.41.0 + chat: ^4.42.0 dd-trace: ^6.13.0 just-bash: ^3.1.0 - microsandbox: ^0.5.0 peerDependenciesMeta: '@opentelemetry/api': optional: true @@ -3630,8 +3670,6 @@ packages: optional: true just-bash: optional: true - microsandbox: - optional: true eventsource-parser@3.1.1: resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} @@ -4041,24 +4079,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -4462,13 +4504,16 @@ packages: oniguruma-to-es@4.3.6: resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} - openai@6.49.0: - resolution: {integrity: sha512-aYCc0C6L864eR6WSYIwQGyXriw/nIyZx0ObvhzOEVuk0zoBDpynjSbrionWI7q65B5H8jJX0DXR9snEzM6bfPg==} + openai@7.42.0: + resolution: {integrity: sha512-RziM2bxp1k24mTLtunije+OOCGRC+qtK0YNYPWkrTdKJLJ65WYW+rPYxlLbnBzU4WwINFCFa0OjCgbsX+fif/w==} + engines: {node: '>=22.0.0'} peerDependencies: '@aws-sdk/credential-provider-node': '>=3.972.0 <4' '@smithy/hash-node': '>=4.3.0 <5' '@smithy/signature-v4': '>=5.4.0 <6' - ws: ^8.18.0 + google-auth-library: '>=9.15.1 <11' + undici: '>=5 <9' + ws: ^8.21.0 zod: ^3.25 || ^4.0 peerDependenciesMeta: '@aws-sdk/credential-provider-node': @@ -4477,6 +4522,10 @@ packages: optional: true '@smithy/signature-v4': optional: true + google-auth-library: + optional: true + undici: + optional: true ws: optional: true zod: @@ -5089,10 +5138,6 @@ packages: resolution: {integrity: sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==} engines: {node: '>=22.19.0'} - undici@8.9.0: - resolution: {integrity: sha512-aWZpUj7XoGonMClx4gdDRfgBjqeA+F473aDmROQQbM9n6PRfK/u1q/a0X4wMTgcHfT8H6fpbt98PFuDUwFg2YA==} - engines: {node: '>=22.19.0'} - unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} @@ -5298,24 +5343,17 @@ snapshots: optionalDependencies: zod: 4.4.3 - '@ai-sdk/gateway@4.0.108(zod@4.4.3)': + '@ai-sdk/gateway@4.0.123(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 4.0.25 - '@ai-sdk/provider-utils': 5.0.57(zod@4.4.3) + '@ai-sdk/provider': 4.0.33 + '@ai-sdk/provider-utils': 5.0.67(zod@4.4.3) '@vercel/oidc': 3.2.0 zod: 4.4.3 - '@ai-sdk/gateway@4.0.87(zod@4.4.3)': + '@ai-sdk/mcp@2.0.83(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 4.0.17 - '@ai-sdk/provider-utils': 5.0.45(zod@4.4.3) - '@vercel/oidc': 3.2.0 - zod: 4.4.3 - - '@ai-sdk/mcp@2.0.54(zod@4.4.3)': - dependencies: - '@ai-sdk/provider': 4.0.17 - '@ai-sdk/provider-utils': 5.0.45(zod@4.4.3) + '@ai-sdk/provider': 4.0.33 + '@ai-sdk/provider-utils': 5.0.67(zod@4.4.3) cross-spawn: 7.0.6 pkce-challenge: 5.0.1 zod: 4.4.3 @@ -5335,9 +5373,9 @@ snapshots: undici: 7.29.1 zod: 4.4.3 - '@ai-sdk/provider-utils@5.0.57(zod@4.4.3)': + '@ai-sdk/provider-utils@5.0.67(zod@4.4.3)': dependencies: - '@ai-sdk/provider': 4.0.25 + '@ai-sdk/provider': 4.0.33 '@standard-schema/spec': 1.1.0 '@workflow/serde': 4.1.0 eventsource-parser: 3.1.1 @@ -5348,16 +5386,16 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@4.0.25': + '@ai-sdk/provider@4.0.33': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@4.0.110(react@19.2.6)(zod@4.4.3)': + '@ai-sdk/react@4.0.154(react@19.2.6)(zod@4.4.3)': dependencies: - '@ai-sdk/mcp': 2.0.54(zod@4.4.3) - '@ai-sdk/provider': 4.0.17 - '@ai-sdk/provider-utils': 5.0.45(zod@4.4.3) - ai: 7.0.107(zod@4.4.3) + '@ai-sdk/mcp': 2.0.83(zod@4.4.3) + '@ai-sdk/provider': 4.0.33 + '@ai-sdk/provider-utils': 5.0.67(zod@4.4.3) + ai: 7.0.150(zod@4.4.3) react: 19.2.6 swr: 2.4.1(react@19.2.6) throttleit: 2.1.0 @@ -5375,6 +5413,8 @@ snapshots: '@braintree/sanitize-url@7.1.2': {} + '@cfworker/json-schema@4.1.1': {} + '@changesets/apply-release-plan@7.1.1': dependencies: '@changesets/config': 3.1.4 @@ -7152,11 +7192,12 @@ snapshots: postcss: 8.5.15 tailwindcss: 4.3.0 - '@tanstack/ai-client@0.38.0(@opentelemetry/api@1.9.1)(zod@4.4.3)': + '@tanstack/ai-client@0.40.1(@opentelemetry/api@1.9.1)(zod@4.4.3)': dependencies: - '@tanstack/ai': 0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3) + '@tanstack/ai': 0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3) '@tanstack/ai-event-client': 0.13.1 - '@tanstack/ai-utils': 0.4.1 + '@tanstack/ai-utils': 0.5.0 + '@tanstack/store': 0.11.2 transitivePeerDependencies: - '@opentelemetry/api' - zod @@ -7165,37 +7206,39 @@ snapshots: dependencies: '@tanstack/devtools-event-client': 0.4.4 - '@tanstack/ai-memory@0.2.10(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0))': + '@tanstack/ai-memory@0.2.16(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0))': dependencies: - '@tanstack/ai': 0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3) + '@tanstack/ai': 0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3) '@tanstack/ai-event-client': 0.13.1 optionalDependencies: vitest: 2.1.9(@types/node@20.19.43)(lightningcss@1.32.0) - '@tanstack/ai-openai@0.27.0(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)': + '@tanstack/ai-openai@0.31.0(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(undici@8.10.2)(ws@8.21.3)(zod@4.4.3)': dependencies: - '@tanstack/ai': 0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3) - '@tanstack/ai-utils': 0.4.1 - '@tanstack/openai-base': 0.12.4(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(ws@8.21.3)(zod@4.4.3) - openai: 6.49.0(ws@8.21.3)(zod@4.4.3) + '@tanstack/ai': 0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3) + '@tanstack/ai-utils': 0.5.0 + '@tanstack/openai-base': 0.16.0(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(undici@8.10.2)(ws@8.21.3)(zod@4.4.3) + openai: 7.42.0(undici@8.10.2)(ws@8.21.3)(zod@4.4.3) transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - '@smithy/hash-node' - '@smithy/signature-v4' + - google-auth-library + - undici - ws - zod - '@tanstack/ai-persistence@0.7.2(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0))': + '@tanstack/ai-persistence@0.10.1(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(vitest@2.1.9(@types/node@20.19.43)(lightningcss@1.32.0))': dependencies: - '@tanstack/ai': 0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3) - '@tanstack/ai-utils': 0.4.1 + '@tanstack/ai': 0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3) + '@tanstack/ai-utils': 0.5.0 optionalDependencies: vitest: 2.1.9(@types/node@20.19.43)(lightningcss@1.32.0) - '@tanstack/ai-react@0.30.0(@opentelemetry/api@1.9.1)(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3)': + '@tanstack/ai-react@0.31.1(@opentelemetry/api@1.9.1)(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3)': dependencies: - '@tanstack/ai': 0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3) - '@tanstack/ai-client': 0.38.0(@opentelemetry/api@1.9.1)(zod@4.4.3) + '@tanstack/ai': 0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3) + '@tanstack/ai-client': 0.40.1(@opentelemetry/api@1.9.1)(zod@4.4.3) '@tanstack/markdown': 0.0.13(react@19.2.6) '@types/react': 19.2.15 react: 19.2.6 @@ -7206,14 +7249,15 @@ snapshots: - octane - zod - '@tanstack/ai-utils@0.4.1': {} + '@tanstack/ai-utils@0.5.0': {} - '@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3)': + '@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3)': dependencies: '@ag-ui/core': 1.0.0(zod@4.4.3) + '@cfworker/json-schema': 4.1.1 '@standard-schema/spec': 1.1.0 '@tanstack/ai-event-client': 0.13.1 - '@tanstack/ai-utils': 0.4.1 + '@tanstack/ai-utils': 0.5.0 fast-json-patch: 3.1.1 partial-json: 0.1.7 optionalDependencies: @@ -7227,18 +7271,22 @@ snapshots: optionalDependencies: react: 19.2.6 - '@tanstack/openai-base@0.12.4(@tanstack/ai@0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)': + '@tanstack/openai-base@0.16.0(@tanstack/ai@0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3))(undici@8.10.2)(ws@8.21.3)(zod@4.4.3)': dependencies: - '@tanstack/ai': 0.65.1(@opentelemetry/api@1.9.1)(zod@4.4.3) - '@tanstack/ai-utils': 0.4.1 - openai: 6.49.0(ws@8.21.3)(zod@4.4.3) + '@tanstack/ai': 0.71.0(@opentelemetry/api@1.9.1)(zod@4.4.3) + '@tanstack/ai-utils': 0.5.0 + openai: 7.42.0(undici@8.10.2)(ws@8.21.3)(zod@4.4.3) transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - '@smithy/hash-node' - '@smithy/signature-v4' + - google-auth-library + - undici - ws - zod + '@tanstack/store@0.11.2': {} + '@types/d3-array@3.2.2': {} '@types/d3-axis@3.0.6': @@ -7630,21 +7678,21 @@ snapshots: dependencies: execa: 5.1.1 - '@vercel/connect@0.2.2(@ai-sdk/mcp@2.0.54(zod@4.4.3))(ai@7.0.133(zod@4.4.3))(eve@0.65.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3)))': + '@vercel/connect@0.2.2(@ai-sdk/mcp@2.0.83(zod@4.4.3))(ai@7.0.150(zod@4.4.3))(eve@0.82.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3)))': dependencies: '@vercel/oidc': 3.6.1 optionalDependencies: - '@ai-sdk/mcp': 2.0.54(zod@4.4.3) - ai: 7.0.133(zod@4.4.3) - eve: 0.65.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3)) + '@ai-sdk/mcp': 2.0.83(zod@4.4.3) + ai: 7.0.150(zod@4.4.3) + eve: 0.82.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3)) - '@vercel/connect@0.2.2(@ai-sdk/mcp@2.0.54(zod@4.4.3))(ai@7.0.133(zod@4.4.3))(eve@0.74.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3)))': + '@vercel/connect@0.2.2(@ai-sdk/mcp@2.0.83(zod@4.4.3))(ai@7.0.150(zod@4.4.3))(eve@0.83.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3)))': dependencies: '@vercel/oidc': 3.6.1 optionalDependencies: - '@ai-sdk/mcp': 2.0.54(zod@4.4.3) - ai: 7.0.133(zod@4.4.3) - eve: 0.74.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3)) + '@ai-sdk/mcp': 2.0.83(zod@4.4.3) + ai: 7.0.150(zod@4.4.3) + eve: 0.83.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3)) '@vercel/oidc@3.2.0': {} @@ -7702,18 +7750,11 @@ snapshots: acorn@8.17.0: {} - ai@7.0.107(zod@4.4.3): + ai@7.0.150(zod@4.4.3): dependencies: - '@ai-sdk/gateway': 4.0.87(zod@4.4.3) - '@ai-sdk/provider': 4.0.17 - '@ai-sdk/provider-utils': 5.0.45(zod@4.4.3) - zod: 4.4.3 - - ai@7.0.133(zod@4.4.3): - dependencies: - '@ai-sdk/gateway': 4.0.108(zod@4.4.3) - '@ai-sdk/provider': 4.0.25 - '@ai-sdk/provider-utils': 5.0.57(zod@4.4.3) + '@ai-sdk/gateway': 4.0.123(zod@4.4.3) + '@ai-sdk/provider': 4.0.33 + '@ai-sdk/provider-utils': 5.0.67(zod@4.4.3) zod: 4.4.3 ajv@6.15.0: @@ -8264,17 +8305,17 @@ snapshots: esutils@2.0.3: {} - eve@0.65.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3)): + eve@0.82.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3)): dependencies: - ai: 7.0.133(zod@4.4.3) + ai: 7.0.150(zod@4.4.3) nitro: 3.0.260903-beta - undici: 8.9.0 + undici: 8.10.2 optionalDependencies: '@opentelemetry/api': 1.9.1 - eve@0.74.0(@opentelemetry/api@1.9.1)(ai@7.0.133(zod@4.4.3)): + eve@0.83.0(@opentelemetry/api@1.9.1)(ai@7.0.150(zod@4.4.3)): dependencies: - ai: 7.0.133(zod@4.4.3) + ai: 7.0.150(zod@4.4.3) nitro: 3.0.260903-beta undici: 8.10.2 optionalDependencies: @@ -9372,8 +9413,9 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 - openai@6.49.0(ws@8.21.3)(zod@4.4.3): + openai@7.42.0(undici@8.10.2)(ws@8.21.3)(zod@4.4.3): optionalDependencies: + undici: 8.10.2 ws: 8.21.3 zod: 4.4.3 @@ -10096,8 +10138,6 @@ snapshots: undici@8.10.2: {} - undici@8.9.0: {} - unenv@2.0.0-rc.24: dependencies: pathe: 2.0.3