Skip to content

feat(ai-harness, ai-dashboard): a self-hosted dashboard for harness sessions - #1766

Closed
AlemTuzlak wants to merge 27 commits into
feat/harness-corefrom
feat/harness-dashboard
Closed

AlemTuzlak wants to merge 27 commits into
feat/harness-corefrom
feat/harness-dashboard

Conversation

@AlemTuzlak

@AlemTuzlak AlemTuzlak commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

With this PR, you can watch and steer harness sessions from a browser or a phone. npx @tanstack/ai-dashboard starts a self-hosted dashboard. A harness host calls connectDashboard() from @tanstack/ai-dashboard/connect, dials out to it, and pairs with a one-time code. Then you approve tools, answer questions, and send prompts from the dashboard.

This PR targets the transport PR #1757 (feat/harness-transport), which stacks on the core harness PR #1755 (feat/harness-core). It is split out of #1555.

🎯 Changes

New package packages/ai-dashboard, ported from #1555:

  • src/server.ts: startDashboard(). The HTTP server for pairing, host tokens, the host relay (hello, frames, an input stream), the owner API, and the SSE feed of each session. Inputs for an offline host wait for 10 minutes.
  • src/ui.ts: the web app as one HTML string, with a manifest and a service worker, so a phone can install it.
  • src/connect.ts (./connect export): connectDashboard(). It pairs, sends session events in batches, and applies the inputs from the dashboard with parseHarnessInput and applyInput. It pairs again after a dashboard restart when onPairingCode is set. With allowRemoteStart, the dashboard can open threads.
  • bin/dashboard.mjs: the tanstack-ai-dashboard bin (--port, --host, DASHBOARD_OWNER_TOKEN).
  • package.json, tsconfig.json, vite.config.ts, and a README with the TanStack AI banner. @tanstack/ai and @tanstack/ai-harness are peer dependencies.

Fixes from the code review:

  1. connectDashboard sends the event batches of a thread one at a time. Before, two batches could arrive out of order, and the text deltas of an answer joined in the wrong order.
  2. A failed session feed now goes to onError. Before, it was an unhandled rejection, which can stop the host process.

Not changed (decisions, known limits). These are the same as in #1555. Each one is a separate follow-up.

  • A failed frame send is dropped. It is not sent again.
  • After a dashboard restart and a new pairing, the host does not send the history again.
  • /api/pair/start has no rate limit. Run the dashboard behind TLS, on a network you trust.
  • The Approve and Reject buttons answer every open interrupt as an approval. Client-tool and generic interrupts need another client.
  • draw() rebuilds the page on each event, so text in an input box is lost while an answer streams.

E2E. testing/e2e/tests/dashboard.spec.ts: it starts a dashboard and pairs a host in the test process, then drives the web app in the browser. @tanstack/ai-dashboard is added to the e2e package.json.

Unit tests. tests/relay.test.ts (pairing, the relay, re-pairing, remote start, and the UI script in a VM) and tests/child-agents.test.ts.

Docs. New docs/harness/dashboard.md (addedAt 2026-10-13) with a docs/config.json entry. Readers: agent builders who want to approve and steer sessions away from the terminal. Tone: matches the existing pages. The CLI flag --dashboard and HARNESS_DASHBOARD_TOKEN come with the CLI PR, so this page and the README show only connectDashboard.

Update: merged transport with #1779. The merge had no conflicts and needed no code change. The dashboard speaks only the wire inputs ({ op: 'answer', questionId, value } and the others). It does not call the session, client, or store methods that #1779 changed to one object.

Changeset. @tanstack/ai-dashboard minor (new package).

✅ Checklist

  • I have followed the steps in the Contributing guide.
  • I have tested code changes locally with pnpm run test:pr, or these tests do not apply to this pull request.
  • I fully understand the code in this pull request, including any code generated with AI assistance.
  • Docs: I updated docs/ for this change, or this change is not user-facing.
  • Changeset: I added a changeset (pnpm changeset), or this PR does not change a published package.

🚀 Release Impact

  • This change affects published code, and I have generated a changeset.
  • This change is docs/CI/dev-only (no release).

Testing

Commands run (after the merge, Node 24.8.0):

  • nx run-many -t test:types test:oxlint test:lib -p @tanstack/ai-dashboard: pass (2 files, 12 tests).
  • nx run-many -t test:types -p "examples/**" "testing/**": pass (27 projects).
  • pnpm test:docs, kiira check docs/harness, pnpm test:knip, pnpm test:sherif: pass.
  • A code review of the merge found no issues.
  • Not run locally: E2E and the full pnpm test:pr.

Manual test.

  1. Run pnpm --filter @tanstack/ai-dashboard build, then node packages/ai-dashboard/bin/dashboard.mjs.
  2. Open the printed sign-in link.
  3. In a script, call connectDashboard({ host, harness, url: 'http://127.0.0.1:8790', threads: ['main'], onPairingCode: console.log }).
  4. Approve the code under "Pairing requests". Send a prompt to main from the page.

How this PR makes testing easy. Unit tests in packages/ai-dashboard/tests, and the E2E spec dashboard.spec.ts.

Risk / rollback

Low. It is a new package. The only other changes are a docs page, a docs nav entry, and an e2e dependency. Revert the PR to undo.

Public API change

Before

// No dashboard package.

After

import { startDashboard } from '@tanstack/ai-dashboard'
import { connectDashboard } from '@tanstack/ai-dashboard/connect'

const dashboard = await startDashboard({ port: 8790 })
const connection = await connectDashboard({
  host,
  harness,
  url: dashboard.url,
  threads: ['main'],
  onPairingCode: (code) => console.log(`Approve ${code} in the dashboard`),
})

…essions

New package @tanstack/ai-dashboard: startDashboard and the
tanstack-ai-dashboard bin serve a web app for hosts and sessions;
connectDashboard (./connect) dials out from a harness host, pairs with a
one-time code, and relays events and inputs. Split out of #1555.
@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: TanStack/ai/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e6dbc437-bf7a-4867-adb5-3300faf21653

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@changeset-bot

changeset-bot Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9960c0c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@tanstack/ai-dashboard Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@nx-cloud

nx-cloud Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

View your CI Pipeline Execution ↗ for commit 9960c0c

Command Status Duration Result
nx affected --targets=test:sherif,test:knip,tes... ✅ Succeeded 1m 25s View ↗
nx run-many --targets=build --exclude=examples/... ✅ Succeeded 6s View ↗
nx run-many --targets=test:coverage --projects=... ✅ Succeeded <1s View ↗
nx run-many --targets=test:coverage --projects=... ✅ Succeeded 11s View ↗

☁️ Nx Cloud last updated this comment at 2026-10-15 12:40:13 UTC

@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Coverage

✅ Coverage held across 69 compared package(s).

Each package is measured twice in this job — on this PR and on its merge-base with main — and compared. A metric fails only when it is at or above 60% on the merge-base and under 60% on this PR. Other drops are listed but do not fail. Packages your PR doesn't affect are not measured and not listed.

package statements branches functions lines
ai 91.50% (0.00) 85.17% (0.00) 92.19% (0.00) 93.07% (0.00) ok
ai-acp 82.32% (0.00) 71.27% (0.00) 77.08% (0.00) 83.97% (0.00) ok
ai-angular 73.37% (0.00) 60.66% (0.00) 62.14% (0.00) 75.13% (0.00) ok
ai-anthropic 91.60% (0.00) 86.24% (0.00) 95.57% (0.00) 91.99% (0.00) ok
ai-bedrock 90.10% (0.00) 82.82% (0.00) 94.20% (0.00) 91.32% (0.00) ok
ai-byteplus 97.06% (0.00) 91.66% (0.00) 98.27% (0.00) 98.49% (0.00) ok
ai-claude-code 88.93% (0.00) 76.88% (0.00) 86.88% (0.00) 90.40% (0.00) ok
ai-client 86.47% (0.00) 79.23% (0.00) 84.62% (0.00) 88.41% (0.00) ok
ai-cloudflare 85.55% (0.00) 76.44% (0.00) 85.48% (0.00) 86.79% (0.00) ok
ai-code-mode 92.71% (0.00) 85.66% (0.00) 89.06% (0.00) 93.51% (0.00) ok
ai-code-mode-snippets 87.13% (0.00) 75.67% (0.00) 91.11% (0.00) 88.39% (0.00) ok
ai-codex 94.55% (0.00) 85.10% (0.00) 89.28% (0.00) 95.56% (0.00) ok
ai-cohere 88.97% (0.00) 88.37% (0.00) 85.71% (0.00) 91.80% (0.00) ok
ai-compaction 97.38% (0.00) 92.75% (0.00) 100.00% (0.00) 98.88% (0.00) ok
ai-dashboard 87.73% 77.97% 81.96% 91.23% new
ai-devtools 83.13% (0.00) 72.77% (0.00) 87.07% (0.00) 85.22% (0.00) ok
ai-durable-stream 86.70% (0.00) 82.25% (0.00) 92.30% (0.00) 88.72% (0.00) ok
ai-elevenlabs 74.68% (0.00) 69.59% (0.00) 59.13% (0.00) 75.46% (0.00) ok
ai-event-client 56.83% (0.00) 46.87% (0.00) 68.96% (0.00) 57.89% (0.00) ok
ai-fal 91.10% (0.00) 82.63% (0.00) 92.40% (0.00) 91.60% (0.00) ok
ai-gemini 68.09% (0.00) 67.44% (0.00) 64.36% (0.00) 68.79% (0.00) ok
ai-grok 48.85% (0.00) 53.49% (0.00) 56.46% (0.00) 49.67% (0.00) ok
ai-grok-build 79.19% (0.00) 63.56% (0.00) 77.39% (0.00) 81.02% (0.00) ok
ai-groq 51.31% (0.00) 47.17% (0.00) 65.11% (0.00) 53.42% (0.00) ok
ai-harness 92.86% (0.00) 87.40% (0.00) 93.30% (0.00) 94.42% (0.00) ok
ai-isolate-cloudflare 94.11% (0.00) 70.66% (0.00) 100.00% (0.00) 93.96% (0.00) ok
ai-isolate-daytona 90.25% (0.00) 80.59% (0.00) 100.00% (0.00) 90.15% (0.00) ok
ai-isolate-e2b 92.11% (0.00) 81.48% (0.00) 97.36% (0.00) 95.05% (0.00) ok
ai-isolate-node 84.00% (0.00) 43.39% (0.00) 100.00% (0.00) 83.78% (0.00) ok
ai-isolate-quickjs 89.07% (0.00) 76.41% (0.00) 90.90% (0.00) 90.30% (0.00) ok
ai-isolate-quickjs-bun 7.76% (0.00) 8.08% (0.00) 5.00% (0.00) 8.33% (0.00) ok
ai-llmgateway 97.67% (0.00) 100.00% (0.00) 88.88% (0.00) 97.67% (0.00) ok
ai-lovable 73.21% (0.00) 55.63% (0.00) 85.07% (0.00) 73.96% (0.00) ok
ai-mcp 96.71% (0.00) 91.77% (0.00) 96.86% (0.00) 98.66% (0.00) ok
ai-memory 73.87% (0.00) 52.70% (0.00) 79.74% (0.00) 76.04% (0.00) ok
ai-mistral 84.99% (0.00) 79.97% (0.00) 92.59% (0.00) 85.64% (0.00) ok
ai-octane 90.58% (0.00) 71.48% (0.00) 87.29% (0.00) 91.24% (0.00) ok
ai-ollama 91.76% (0.00) 76.47% (0.00) 90.62% (0.00) 91.71% (0.00) ok
ai-ollaya 86.84% (0.00) 89.28% (0.00) 85.71% (0.00) 91.66% (0.00) ok
ai-openai 65.34% (0.00) 65.72% (0.00) 66.66% (0.00) 65.63% (0.00) ok
ai-opencode 68.77% (0.00) 60.82% (0.00) 64.04% (0.00) 70.78% (0.00) ok
ai-openrouter 86.71% (0.00) 71.88% (0.00) 90.52% (0.00) 88.65% (0.00) ok
ai-perplexity 91.34% (0.00) 90.43% (0.00) 100.00% (0.00) 93.87% (0.00) ok
ai-persistence 91.92% (0.00) 80.94% (0.00) 98.00% (0.00) 95.71% (0.00) ok
ai-preact 87.80% (0.00) 75.87% (0.00) 88.73% (0.00) 89.66% (0.00) ok
ai-react 73.13% (0.00) 52.16% (0.00) 75.54% (0.00) 73.08% (0.00) ok
ai-reactor 94.91% (0.00) 83.33% (0.00) 93.33% (0.00) 96.55% (0.00) ok
ai-remix 39.39% (0.00) 23.35% (0.00) 35.51% (0.00) 41.58% (0.00) ok
ai-sandbox 77.45% (0.00) 82.80% (0.00) 74.47% (0.00) 77.97% (0.00) ok
ai-sandbox-blaxel 87.64% (0.00) 77.18% (0.00) 82.26% (0.00) 89.71% (0.00) ok
ai-sandbox-boxd 95.86% (0.00) 87.12% (0.00) 95.31% (0.00) 98.17% (0.00) ok
ai-sandbox-cloudflare 67.91% (0.00) 57.47% (0.00) 71.79% (0.00) 69.62% (0.00) ok
ai-sandbox-daytona 82.70% (0.00) 81.89% (0.00) 67.14% (0.00) 85.18% (0.00) ok
ai-sandbox-docker 80.15% (0.00) 71.49% (0.00) 77.38% (0.00) 82.13% (0.00) ok
ai-sandbox-e2b 94.42% (0.00) 88.97% (0.00) 93.24% (0.00) 98.63% (0.00) ok
ai-sandbox-local-process 68.00% (0.00) 53.59% (0.00) 75.86% (0.00) 68.88% (0.00) ok
ai-sandbox-railway 94.75% (0.00) 92.68% (0.00) 90.90% (0.00) 97.59% (0.00) ok
ai-sandbox-sprites 73.23% (0.00) 59.70% (0.00) 73.83% (0.00) 76.17% (0.00) ok
ai-sandbox-upstash-box 94.82% (0.00) 91.52% (0.00) 91.04% (0.00) 97.76% (0.00) ok
ai-sandbox-vercel 44.67% (0.00) 38.18% (0.00) 35.18% (0.00) 45.76% (0.00) ok
ai-skills 83.39% (0.00) 68.53% (0.00) 87.36% (0.00) 85.48% (0.00) ok
ai-solid 53.73% (0.00) 40.45% (0.00) 51.94% (0.00) 57.78% (0.00) ok
ai-svelte 70.44% (0.00) 54.50% (0.00) 69.86% (0.00) 75.99% (0.00) ok
ai-typesafe 78.04% (0.00) 84.61% (0.00) 66.66% (0.00) 82.05% (0.00) ok
ai-utils 76.38% (0.00) 74.00% (0.00) 92.30% (0.00) 76.56% (0.00) ok
ai-vercel-gateway 75.97% (0.00) 55.63% (0.00) 85.41% (0.00) 79.38% (0.00) ok
ai-vertex 96.77% (0.00) 97.22% (0.00) 100.00% (0.00) 96.77% (0.00) ok
ai-vue 60.70% (0.00) 36.17% (0.00) 62.00% (0.00) 62.95% (0.00) ok
ai-worldlabs 79.62% (0.00) 71.50% (0.00) 91.42% (0.00) 82.66% (0.00) ok
openai-base 89.12% (0.00) 77.14% (0.00) 97.57% (0.00) 91.15% (0.00) ok

No coverage on the base commit, so nothing to compare against: ai-dashboard.

@pkg-pr-new

pkg-pr-new Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Open in StackBlitz

@tanstack/ai

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai@1766

@tanstack/ai-acp

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-acp@1766

@tanstack/ai-angular

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-angular@1766

@tanstack/ai-anthropic

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-anthropic@1766

@tanstack/ai-bedrock

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-bedrock@1766

@tanstack/ai-byteplus

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-byteplus@1766

@tanstack/ai-claude-code

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-claude-code@1766

@tanstack/ai-client

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-client@1766

@tanstack/ai-cloudflare

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-cloudflare@1766

@tanstack/ai-code-mode

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-code-mode@1766

@tanstack/ai-code-mode-snippets

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-code-mode-snippets@1766

@tanstack/ai-codex

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-codex@1766

@tanstack/ai-cohere

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-cohere@1766

@tanstack/ai-compaction

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-compaction@1766

@tanstack/ai-dashboard

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-dashboard@1766

@tanstack/ai-devtools-core

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-devtools-core@1766

@tanstack/ai-durable-stream

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-durable-stream@1766

@tanstack/ai-elevenlabs

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-elevenlabs@1766

@tanstack/ai-event-client

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-event-client@1766

@tanstack/ai-fal

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-fal@1766

@tanstack/ai-gemini

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-gemini@1766

@tanstack/ai-grok

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-grok@1766

@tanstack/ai-grok-build

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-grok-build@1766

@tanstack/ai-groq

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-groq@1766

@tanstack/ai-harness

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-harness@1766

@tanstack/ai-isolate-cloudflare

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-isolate-cloudflare@1766

@tanstack/ai-isolate-daytona

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-isolate-daytona@1766

@tanstack/ai-isolate-e2b

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-isolate-e2b@1766

@tanstack/ai-isolate-node

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-isolate-node@1766

@tanstack/ai-isolate-quickjs

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-isolate-quickjs@1766

@tanstack/ai-isolate-quickjs-bun

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-isolate-quickjs-bun@1766

@tanstack/ai-llmgateway

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-llmgateway@1766

@tanstack/ai-lovable

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-lovable@1766

@tanstack/ai-mcp

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-mcp@1766

@tanstack/ai-memory

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-memory@1766

@tanstack/ai-mistral

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-mistral@1766

@tanstack/ai-octane

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-octane@1766

@tanstack/ai-ollama

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-ollama@1766

@tanstack/ai-ollaya

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-ollaya@1766

@tanstack/ai-openai

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-openai@1766

@tanstack/ai-opencode

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-opencode@1766

@tanstack/ai-openrouter

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-openrouter@1766

@tanstack/ai-perplexity

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-perplexity@1766

@tanstack/ai-persistence

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-persistence@1766

@tanstack/ai-preact

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-preact@1766

@tanstack/ai-react

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-react@1766

@tanstack/ai-react-ui

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-react-ui@1766

@tanstack/ai-reactor

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-reactor@1766

@tanstack/ai-remix

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-remix@1766

@tanstack/ai-sandbox

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox@1766

@tanstack/ai-sandbox-blaxel

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-blaxel@1766

@tanstack/ai-sandbox-boxd

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-boxd@1766

@tanstack/ai-sandbox-cloudflare

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-cloudflare@1766

@tanstack/ai-sandbox-daytona

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-daytona@1766

@tanstack/ai-sandbox-docker

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-docker@1766

@tanstack/ai-sandbox-e2b

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-e2b@1766

@tanstack/ai-sandbox-local-process

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-local-process@1766

@tanstack/ai-sandbox-railway

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-railway@1766

@tanstack/ai-sandbox-sprites

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-sprites@1766

@tanstack/ai-sandbox-upstash-box

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-upstash-box@1766

@tanstack/ai-sandbox-vercel

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-sandbox-vercel@1766

@tanstack/ai-skills

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-skills@1766

@tanstack/ai-solid

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-solid@1766

@tanstack/ai-solid-ui

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-solid-ui@1766

@tanstack/ai-svelte

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-svelte@1766

@tanstack/ai-typesafe

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-typesafe@1766

@tanstack/ai-utils

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-utils@1766

@tanstack/ai-vercel-gateway

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-vercel-gateway@1766

@tanstack/ai-vertex

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-vertex@1766

@tanstack/ai-vue

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-vue@1766

@tanstack/ai-vue-ui

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-vue-ui@1766

@tanstack/ai-worldlabs

npm i https://pkg.pr.new/TanStack/ai/@tanstack/ai-worldlabs@1766

@tanstack/openai-base

npm i https://pkg.pr.new/TanStack/ai/@tanstack/openai-base@1766

@tanstack/preact-ai-devtools

npm i https://pkg.pr.new/TanStack/ai/@tanstack/preact-ai-devtools@1766

@tanstack/react-ai-devtools

npm i https://pkg.pr.new/TanStack/ai/@tanstack/react-ai-devtools@1766

@tanstack/solid-ai-devtools

npm i https://pkg.pr.new/TanStack/ai/@tanstack/solid-ai-devtools@1766

@tanstack/svelte-ai-devtools

npm i https://pkg.pr.new/TanStack/ai/@tanstack/svelte-ai-devtools@1766

commit: 9960c0c

@github-actions
github-actions Bot requested a review from tombeckenham October 14, 2026 00:22
@github-actions github-actions Bot added the waiting-on: maintainer The ball is in the maintainers’ court label Oct 14, 2026
AlemTuzlak and others added 2 commits October 14, 2026 16:19
…an MCP server (#1763)

* feat(ai-harness, ai-mcp): MCP servers in a harness, and a harness as an MCP server

Adds @tanstack/ai-mcp/harness (createHarnessMcpServer and the mcp() plugin)
and @tanstack/ai-mcp/connector (mcpConnector with OAuth sign-in and RFC 9207
iss). mcp() and mcpConnector ask spec 2025 elicitation/create requests and
spec 2026 input rounds as session questions. Split out of #1555.

* docs(ai-harness, ai-mcp): import definePlugin in the discoverTools sample
@github-actions github-actions Bot added merge-conflicts Conflicts with the base branch — needs a rebase waiting-on: author Waiting for the author to respond or update and removed waiting-on: maintainer The ball is in the maintainers’ court labels Oct 14, 2026
AlemTuzlak and others added 3 commits October 14, 2026 17:51
…any UI (#1761)

* feat(ai-harness): createSessionView, one live store for a session in any UI

* fix(ai-harness): import ../session/index in the view

* feat(ai-harness): close the gaps between createSessionView and the harness

- Actions: followUp, continue, upload, configure, cancel(operationId),
  cancelInput, setDelivery, reset, revert, unrevert, and ViewAgent.cancel.
- Interrupts: generic interrupts get their own list with resolve and cancel.
  Approvals can send edited arguments or a payload, and find their tool in a
  child agent.
- Subagents: AgentPart.result, and after a reload each child shows its saved
  messages and how it ended.
- A view that opens while a turn runs shows the turn from its start without
  what the transcript has. The snapshot is read before the transcript.
- A retry drops the failed attempt, turnEnd skips a turn that stops for an
  interrupt, usage, models, and settings are in the state, and media that no
  message shows stops getting new URLs.

* docs(ai-harness): every view action, other interrupts, and subagents after a reload
@AlemTuzlak AlemTuzlak mentioned this pull request Oct 14, 2026
5 of 7 tasks
…ness-transport

# Conflicts:
#	docs/config.json
#	packages/ai-harness/tests/auth.test.ts
The client, the session view, and its source take one object for
setConfig, answer, setDelivery, sendToAgent, renameSession,
updateSession, and forkSession, as the session does. A view agent's
send takes { mode }, as AgentRun.send does. The protocol, the HTTP
handler, the connectors, and the MCP connector call the new store and
session shapes.
@github-actions github-actions Bot added waiting-on: maintainer The ball is in the maintainers’ court and removed waiting-on: author Waiting for the author to respond or update merge-conflicts Conflicts with the base branch — needs a rebase labels Oct 14, 2026
Base automatically changed from feat/harness-transport to feat/harness-core October 15, 2026 11:01
@github-actions github-actions Bot added merge-conflicts Conflicts with the base branch — needs a rebase waiting-on: author Waiting for the author to respond or update and removed waiting-on: maintainer The ball is in the maintainers’ court labels Oct 15, 2026
@github-actions github-actions Bot added waiting-on: maintainer The ball is in the maintainers’ court and removed waiting-on: author Waiting for the author to respond or update merge-conflicts Conflicts with the base branch — needs a rebase labels Oct 15, 2026
@AlemTuzlak

Copy link
Copy Markdown
Contributor Author

@jherr i'm closing this PR as discussed, will keep the original open until we get back to it

@AlemTuzlak AlemTuzlak closed this Oct 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

waiting-on: maintainer The ball is in the maintainers’ court

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants