TanStack
OSS
ai
Sign in / Sign up
Open main menu
ai
GitHub
Overview
Runs
Analytics
Loading workspace stats
Loading workspace insights...
Statistics interval
7 days
30 days
Latest CI Pipeline Executions
Status
Fix filter
Filter
Fuzzy
Filter range
Sort by
Sort by
Start time
Sort ascending
Sort descending
Succeeded
worktree-serialized-exploring-wall
f99fc81a ci: apply automated fixes
by autofix-ci...
a
Succeeded
worktree-serialized-exploring-wall
f99fc81a Merge 1317dd6d1e212d572a8a49310deff2c9f98cade3 into 8aabeec5fa4e75575dad7c26e6900d0e66165f91
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
ac9ed5c2 docs(chat): document the `fetcher` chat transport for server functions (#681) * docs(chat): document the `fetcher` chat transport for server functions PR #512 added a first-class `fetcher` option to `useChat`/`ChatClient` for wiring a TanStack Start server function (that returns an SSE `Response`) into chat, but the connection-adapters page only covered the `stream()` path. Add a "Server Functions via `fetcher`" section, a "Pick a Transport" row, and a keyword so the new capability is discoverable. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(chat): correct fetcher/stream comparison Drop the "retries" claim (no such feature — the only `retry` in the client is SSE `retry:` control-line parsing) and fix the `stream()` factory description (it returns an `AsyncIterable<StreamChunk>`; it isn't a zero-arg factory). State the verifiable structural fact instead: `fetcher` normalizes to the same request-scoped adapter as `stream()`. Verified the server snippet typechecks without an `as any` cast. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(chat): clarify fetcher vs stream is async-vs-sync, not Response-vs-iterable A `fetcher` can also return an `AsyncIterable<StreamChunk>` (sync or `Promise`-wrapped), not just a `Response` — the previous tip implied a clean Response/iterable split. The real distinction is that `stream()`'s factory must return the iterable *synchronously*, so an async server-function call (always a `Promise`) needs `fetcher` regardless of what it resolves to. Also corrects the pre-existing `stream()` section, which listed "TanStack Start server functions" as a `stream()` use case — those are async and hit the #509 type error; redirect them to `fetcher` and reframe `stream()` as the synchronous in-process / RSC / test path. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
by Tom Beckenham
T
Succeeded
worktree-serialized-exploring-wall
ac9ed5c2 Merge 5f47380e72bde9536af47c363b9f6f00ce3513f6 into 8aabeec5fa4e75575dad7c26e6900d0e66165f91
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
9e1c956e chore(ai): fix lint errors in @tanstack/ai CI's \`@tanstack/ai:test:eslint\` job failed on this branch. Three categories of fix: - Rename the drift-guard type parameters from \`TanStack\`/\`AGUIShape\` to \`TTanStack\`/\`TAGUIShape\` to match the project's type-parameter naming convention (\`^T(|[A-Z][A-Za-z]+)$\`). - Drop unnecessary type assertions that \`eslint --fix\` flagged after recent type-shape changes made the casts redundant (\`activities/chat/index.ts\`, \`activities/chat/tools/tool-calls.ts\`, \`activities/generateVideo/index.ts\`). - Annotate the three intentional \`as unknown as <Type>\` casts with single-line \`eslint-disable-next-line no-restricted-syntax\` directives plus a one-line reason — multi-line comments don't attach the directive to the following statement.
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
9e1c956e Merge 57c46ff773f5003d13e7414a50f199ddfb218ca1 into 0de0cba24ca2dabc0a6f017ff46852aa05d496c1
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
345b2e7c ci: apply automated fixes
by autofix-ci...
a
Failed
worktree-serialized-exploring-wall
345b2e7c ci: apply automated fixes
by autofix-ci...
a
Succeeded
worktree-serialized-exploring-wall
187f2cf8 feat(ai): expose typed tool output on TOOL_CALL_END events The engine already parses tool results and validates them against the tool's \`outputSchema\` before JSON-stringifying into \`result\` for the wire. Surface the parsed value as a new \`output\` field on \`TOOL_CALL_END\` so consumers can read the typed object directly. Threading: - \`ToolCallEndEvent\` gains a \`TOutput\` generic with default \`unknown\` and an optional \`output?: TOutput\` field. \`result?: string\` stays as the wire-level shape (AG-UI spec compat). - \`SafeToolOutput<T>\` mirrors the existing \`SafeToolInput<T>\` helper, picking \`outputSchema\` instead and guarding against \`any\` leaks. - \`DistributedToolCallEnd<TTools>\` threads \`SafeToolOutput<T>\` into each per-tool variant, so \`chunk.toolCallName === 'getGuitars'\` narrows \`chunk.output\` to that tool's output type. - The runtime tool-call emitter holds the validated result in a \`toolOutput\` local and spreads it onto the emitted \`TOOL_CALL_END\` event when defined (omitted on execution failure or pure client tools, where no server-side output exists). Consumer pattern: for await (const chunk of stream) { if (chunk.type === 'TOOL_CALL_END') { if (chunk.toolCallName === 'getGuitars') { chunk.output?.forEach((g) => g.id) // typed from outputSchema } } } Tools without an \`outputSchema\` get \`output\` typed as \`unknown\`; pure client tools (no \`.server(...)\`) leave \`output\` undefined and the chat client's tool-approval path remains the way to surface client-executed results.
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
187f2cf8 Merge c0b0feb1c248146a97e7339d939b5fa692b89527 into 65c917eb0c935659541d77f904de8903e9c4278b
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
fe9e8357 ci: apply automated fixes
by autofix-ci...
a
Failed
worktree-serialized-exploring-wall
fe9e8357 Merge 821a3d0c9810f89f2bb775efee768ce8926f13bc into 65c917eb0c935659541d77f904de8903e9c4278b
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
f719b246 docs+feat: update model refs to gpt-5.2 and preserve tool name literals in mergeAgentTools Two unrelated changes batched: 1. **Docs/JSDoc: gpt-4o → gpt-5.2** Replace plain \`gpt-4o\` mentions across documentation pages and source JSDoc examples with \`gpt-5.2\`. The specialized variants (\`gpt-4o-mini\`, \`gpt-4o-audio-preview\`, \`gpt-4o-realtime-preview\`, \`gpt-4o-transcribe\`, etc.) are real models with no gpt-5.2 counterpart, so they are intentionally left as-is. Updating the JSDoc lets \`pnpm generate-docs\` regenerate consistent reference pages. 2. **\`mergeAgentTools\` preserves typed tool name literals** The signature widened to \`Array<Tool>\`, which made \`HasTypedTools\` resolve to \`false\` and collapsed \`TypedStreamChunk\`'s \`DistributedToolCall*\` discriminated union — \`chunk.toolCallName\` stayed \`string\` with no per-tool narrowing on the consumer side. Make the function generic over the server tools tuple (\`const TServerTools extends ReadonlyArray<Tool<any, any, any>>\`) and return that tuple. The runtime array still carries both server and client tools — the return type narrows to just the typed server tuple so that downstream \`chat({ tools })\` can discriminate \`chunk.toolCallName === 'getGuitars'\` against the registered names. Client tool calls still flow at runtime through the existing \`ClientToolRequest\` path; they just appear as the bare \`ToolCallStartEvent<string>\` shape after narrowing rather than as typed literals. In \`examples/ts-react-chat/src/routes/api.tanchat.ts\`, drop the \`Object.values(mergedTools)\` wrapper that was discarding the tuple typing and pass \`mergedTools\` straight through to \`chat()\`.
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
f719b246 Merge de5f152c744729b0fdfe58037383e811e2809585 into 65c917eb0c935659541d77f904de8903e9c4278b
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
19159e76 feat(ai): narrow CustomEvent to TaggedCustomEvent even without typed tools Previously the no-typed-tools fallback branch of \`TypedStreamChunk\` collapsed to plain \`StreamChunk\`, so \`chunk.type === 'CUSTOM'\` left \`chunk.name\` typed as \`string\` and \`chunk.value\` as \`any\` — the engine-emitted tagged variants (structured-output.start/complete, approval-requested, tool-input-available) were not narrowed. The tagged shapes don't depend on the tools array, so they belong in both branches. The fallback now returns \`Exclude<StreamChunk, { type: 'CUSTOM' }> | TaggedCustomEvent\` so \`chunk.name === 'structured-output.complete'\` autocompletes and narrows \`chunk.value\` to the typed payload regardless of whether the caller passes typed tools to \`chat()\`. Free-form \`emitCustomEvent\` events still flow at runtime but are intentionally absent from the type — including bare CustomEvent (\`value: any\`) would collapse the tagged variants' \`value\` back to \`any\`. Cast to \`StreamChunk\` if you need to read those.
by Alem Tuzlak
A
Failed
worktree-serialized-exploring-wall
19159e76 Merge cff54ce719ea4775ae819ac32abd5f90cc95c367 into b50d63e3472b56f6444d0d14ad8b6ed99d856670
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
5ddf6174 ci: apply automated fixes
by autofix-ci...
a
Failed
worktree-serialized-exploring-wall
5ddf6174 Merge 573e413c2da8eea534ebb9b73f708d7296999330 into b50d63e3472b56f6444d0d14ad8b6ed99d856670
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
1b6732a8 fix(ai): switch chunk.type from EventType enum literal to plain string literal The previous commit declared each event's \`type\` field using the \`EventType\` enum literal (e.g. \`EventType.RUN_STARTED\`). That gave correct narrowing for \`chunk.type === EventType.X\`, but VS Code does NOT offer string suggestions after \`chunk.type === "\` when the LHS is an enum literal — IntelliSense only proposes \`EventType.*\` enum members. The whole point of this refactor is the bare-string form autocompleting, so flip each event's \`type\` to the plain string literal (e.g. \`'RUN_STARTED'\`). Both forms still narrow because each \`EventType\` member's runtime value IS the matching string, so \`EventType.RUN_STARTED\` remains assignable to \`type: 'RUN_STARTED'\` slots. Test-helper updates required: - \`stream-processor.test.ts\` \`chunk()\` factory now coerces its type param through a template-literal wrapper (\`type: \`${T}\`\`) so callers passing \`EventType.X\` still produce a usable \`Extract<StreamChunk, ...>\` (without the coercion, Extract returned \`never\` because the string-literal variant does not extend the strict enum literal). - Five \`Extract<StreamChunk, { type: typeof EventType.RUN_ERROR }>\` predicates in the OpenRouter test suite are now \`Extract<StreamChunk, { type: 'RUN_ERROR' }>\` — same reason.
by Alem Tuzlak
A
Succeeded
worktree-serialized-exploring-wall
1b6732a8 Merge 0a9c07e4c17d8826bdbcddab6eb8a25f0919070b into b50d63e3472b56f6444d0d14ad8b6ed99d856670
by Alem Tuzlak
A
Previous page
Previous
Next
Next page