[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-tanstack-ai-skills":3,"mdc--wc2xo4-key":52,"related-org-tanstack-ai-skills":1774,"related-repo-tanstack-ai-skills":1919},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":47,"sourceUrl":50,"mdContent":51},"ai-skills","load TanStack AI skills on demand","Portable Agent Skills (SKILL.md) for TanStack AI with @tanstack\u002Fai-skills. Renders a skill catalog and a load_skill tool via the withSkills middleware so any tool-calling model loads skills on demand, on any provider. Covers the SkillSource interface, inlineSkill\u002FskillDirectory\u002FstaticSkills, the aggregate\u002F dedupe\u002Ffilter\u002Fcache combinators, read_skill_resource, and the conformance suite. Use for provider-agnostic runtime skills — NOT hosted provider skills (codeExecutionTool\u002FshellTool), which run in a provider sandbox.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"tanstack","TanStack","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Ftanstack.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"AI","ai","tag",{"name":17,"slug":18,"type":15},"Agents","agents",{"name":20,"slug":21,"type":15},"Middleware","middleware",{"name":9,"slug":8,"type":15},2884,"https:\u002F\u002Fgithub.com\u002FTanStack\u002Fai","2026-08-28T15:08:39.281317",null,269,[14,29,30,31,32,33,34,35,36,37,38,39,40,41,42,8,43,44,45,46],"ai-agents","ai-sdk","anthropic","chatbot","function-calling","gemini","generative-ai","llm","multimodal","openai","react","solidjs","streaming","svelte","tool-calling","typescript","typescript-sdk","vue",{"repoUrl":24,"stars":23,"forks":27,"topics":48,"description":49},[14,29,30,31,32,33,34,35,36,37,38,39,40,41,42,8,43,44,45,46],"🤖 Type-safe, provider-agnostic TypeScript AI SDK for streaming chat, tool calling, agents, and multimodal apps across OpenAI, Anthropic, Gemini, React, Vue, Svelte, and Solid.","https:\u002F\u002Fgithub.com\u002FTanStack\u002Fai\u002Ftree\u002FHEAD\u002Fpackages\u002Fai-skills\u002Fskills\u002Fai-skills","---\nname: ai-skills\ndescription: >\n  Portable Agent Skills (SKILL.md) for TanStack AI with @tanstack\u002Fai-skills.\n  Renders a skill catalog and a load_skill tool via the withSkills middleware so\n  any tool-calling model loads skills on demand, on any provider. Covers the\n  SkillSource interface, inlineSkill\u002FskillDirectory\u002FstaticSkills, the aggregate\u002F\n  dedupe\u002Ffilter\u002Fcache combinators, read_skill_resource, and the conformance\n  suite. Use for provider-agnostic runtime skills — NOT hosted provider skills\n  (codeExecutionTool\u002FshellTool), which run in a provider sandbox.\ntype: core\nlibrary: tanstack-ai\nlibrary_version: '0.0.0'\nsources:\n  - 'TanStack\u002Fai:docs\u002Fskills\u002Fagent-skills.md'\n  - 'TanStack\u002Fai:docs\u002Fskills\u002Fskill-sources.md'\n  - 'TanStack\u002Fai:docs\u002Fskills\u002Fwriting-adapters.md'\n  - 'TanStack\u002Fai:docs\u002Ftools\u002Fprovider-skills.md'\n---\n\n# TanStack AI Skills\n\n> Builds on the `ai-core` skill in `@tanstack\u002Fai`. Package: `@tanstack\u002Fai-skills`.\n\nPortable Agent Skills give a tool-calling model a library of `SKILL.md` skills it\ncan load on demand, on any provider, with no server sandbox. This is separate\nfrom hosted **Provider Skills** (`codeExecutionTool` \u002F `shellTool`), which run in\nthe provider's sandbox and are referenced by ID.\n\n## Two skill features, do not confuse them\n\n| Need                                            | Use                                   |\n| ----------------------------------------------- | ------------------------------------- |\n| Model loads SKILL.md at runtime, any provider   | `withSkills` (this package)           |\n| Hosted skill runs in a provider sandbox by ID   | `codeExecutionTool` \u002F `shellTool`     |\n| Teach a coding assistant how to use TanStack AI | Ship a `SKILL.md`, install via Intent |\n\nThe portable and hosted paths do not mix in one `chat()` call: `withSkills`\nthrows if a `code_execution`\u002F`shell` tool in the same call carries skills.\n\n## Add skills to a chat\n\n```typescript\nimport { chat, toServerSentEventsResponse } from '@tanstack\u002Fai'\nimport { anthropicText } from '@tanstack\u002Fai-anthropic'\nimport { inlineSkill, withSkills } from '@tanstack\u002Fai-skills'\n\nconst pptx = inlineSkill({\n  name: 'pptx-builder',\n  description: 'Build and edit PowerPoint decks with python-pptx.',\n  instructions: '# Building a deck\\nUse python-pptx. Edit slides, then save.',\n})\n\nconst stream = chat({\n  adapter: anthropicText('claude-sonnet-4-5'),\n  messages,\n  middleware: [withSkills(pptx)],\n})\n```\n\n`withSkills` adds a catalog to the system prompt and a `load_skill` tool whose\n`name` is constrained to your skill names. It renders `\u003Cavailable_skills>` XML\nfor Anthropic models and markdown for the rest. Re-loading a skill in the same\nconversation returns a short \"already loaded\" marker.\n\n## Sources\n\nA `SkillSource` is bytes only (no filesystem assumption), so the middleware runs\non the edge too.\n\n- `inlineSkill({ name, description, instructions, resources? })` — one skill in\n  code or a DB row. Edge-safe.\n- `skillDirectory(root, { strict? })` — walk a folder for `SKILL.md`. Import from\n  `@tanstack\u002Fai-skills\u002Fnode` (uses `node:fs`). Strict by default.\n- `staticSkills(catalog)` — build-time bundle via `skillsCatalogPlugin` (Vite).\n  Edge-safe, and `.names` is a typed union.\n\nCombine with `aggregate`, `dedupe`, `filter`, `cache`. `withSkills([a, b])` is\nsugar for `dedupe(aggregate([a, b]))`. A single source is never auto-wrapped, so\na tenant-scoped source is never cached into a shared bucket.\n\n## Resources\n\nTo let the model read a skill's bundled files, pass `createResourceTool(source)`\nin `tools`. `withSkills` detects it and advertises `read_skill_resource`. Paths\nthat escape the skill root are rejected.\n\n## Skills that carry code\n\n`withSkills` inventories a skill's `scripts\u002F` in the `load_skill` result but does\nNOT run them (script execution is a later phase). To let a skill run code, pass\nyour own execution tool to `chat({ tools })` alongside `withSkills` and write the\nskill so it tells the model to call that tool. `withSkills` composes with any\ntools you provide.\n\n```ts ignore\nimport { toolDefinition } from '@tanstack\u002Fai'\nimport { z } from 'zod'\n\nconst executeShell = toolDefinition({\n  name: 'execute_shell',\n  description: 'Run a shell command and return its stdout.',\n  inputSchema: z.object({ command: z.string() }),\n  outputSchema: z.object({ stdout: z.string() }),\n}).server(async ({ command }) => ({ stdout: await runSomewhere(command) }))\n\n\u002F\u002F chat({ tools: [executeShell], middleware: [withSkills(source)] })\n```\n\nThe skill supplies the command; your tool supplies the ability to run it. Swap in\na provider sandbox, a Code Mode isolate, or a remote worker without changing the\nskill. For hosted skills that run in the provider's own sandbox, use\n`codeExecutionTool` \u002F `shellTool` instead (see provider-skills).\n\n## Write a custom source\n\nImplement `SkillSource` (`list` + `load`, optional `revision`\u002F`listResources`\u002F\n`readResource`), then validate it with the shipped conformance suite:\n\n```typescript\nimport { runSkillSourceConformance } from '@tanstack\u002Fai-skills\u002Ftesting'\n\nrunSkillSourceConformance(() => myS3Source(fixtures), 's3')\n```\n\n## Entry points\n\n- `@tanstack\u002Fai-skills` — types, `inlineSkill`, combinators, `withSkills`,\n  `createResourceTool`, `validateSkill`, `staticSkills`, `SkillLimitError`.\n- `@tanstack\u002Fai-skills\u002Fnode` — `skillDirectory`, `skillsCatalogPlugin` (`node:fs`).\n- `@tanstack\u002Fai-skills\u002Ftesting` — `runSkillSourceConformance`.\n\n## Docs\n\n- Portable Agent Skills: `docs\u002Fskills\u002Fagent-skills.md`\n- Skill sources: `docs\u002Fskills\u002Fskill-sources.md`\n- Write a skill source: `docs\u002Fskills\u002Fwriting-adapters.md`\n- Provider (hosted) skills: `docs\u002Ftools\u002Fprovider-skills.md`\n",{"data":53,"body":62},{"name":4,"description":6,"type":54,"library":55,"library_version":56,"sources":57},"core","tanstack-ai","0.0.0",[58,59,60,61],"TanStack\u002Fai:docs\u002Fskills\u002Fagent-skills.md","TanStack\u002Fai:docs\u002Fskills\u002Fskill-sources.md","TanStack\u002Fai:docs\u002Fskills\u002Fwriting-adapters.md","TanStack\u002Fai:docs\u002Ftools\u002Fprovider-skills.md",{"type":63,"children":64},"root",[65,74,109,146,153,242,278,284,736,770,776,789,866,917,923,958,964,1011,1432,1450,1456,1506,1609,1615,1715,1721,1768],{"type":66,"tag":67,"props":68,"children":70},"element","h1",{"id":69},"tanstack-ai-skills",[71],{"type":72,"value":73},"text","TanStack AI Skills",{"type":66,"tag":75,"props":76,"children":77},"blockquote",{},[78],{"type":66,"tag":79,"props":80,"children":81},"p",{},[82,84,91,93,99,101,107],{"type":72,"value":83},"Builds on the ",{"type":66,"tag":85,"props":86,"children":88},"code",{"className":87},[],[89],{"type":72,"value":90},"ai-core",{"type":72,"value":92}," skill in ",{"type":66,"tag":85,"props":94,"children":96},{"className":95},[],[97],{"type":72,"value":98},"@tanstack\u002Fai",{"type":72,"value":100},". Package: ",{"type":66,"tag":85,"props":102,"children":104},{"className":103},[],[105],{"type":72,"value":106},"@tanstack\u002Fai-skills",{"type":72,"value":108},".",{"type":66,"tag":79,"props":110,"children":111},{},[112,114,120,122,128,130,136,138,144],{"type":72,"value":113},"Portable Agent Skills give a tool-calling model a library of ",{"type":66,"tag":85,"props":115,"children":117},{"className":116},[],[118],{"type":72,"value":119},"SKILL.md",{"type":72,"value":121}," skills it\ncan load on demand, on any provider, with no server sandbox. This is separate\nfrom hosted ",{"type":66,"tag":123,"props":124,"children":125},"strong",{},[126],{"type":72,"value":127},"Provider Skills",{"type":72,"value":129}," (",{"type":66,"tag":85,"props":131,"children":133},{"className":132},[],[134],{"type":72,"value":135},"codeExecutionTool",{"type":72,"value":137}," \u002F ",{"type":66,"tag":85,"props":139,"children":141},{"className":140},[],[142],{"type":72,"value":143},"shellTool",{"type":72,"value":145},"), which run in\nthe provider's sandbox and are referenced by ID.",{"type":66,"tag":147,"props":148,"children":150},"h2",{"id":149},"two-skill-features-do-not-confuse-them",[151],{"type":72,"value":152},"Two skill features, do not confuse them",{"type":66,"tag":154,"props":155,"children":156},"table",{},[157,176],{"type":66,"tag":158,"props":159,"children":160},"thead",{},[161],{"type":66,"tag":162,"props":163,"children":164},"tr",{},[165,171],{"type":66,"tag":166,"props":167,"children":168},"th",{},[169],{"type":72,"value":170},"Need",{"type":66,"tag":166,"props":172,"children":173},{},[174],{"type":72,"value":175},"Use",{"type":66,"tag":177,"props":178,"children":179},"tbody",{},[180,200,222],{"type":66,"tag":162,"props":181,"children":182},{},[183,189],{"type":66,"tag":184,"props":185,"children":186},"td",{},[187],{"type":72,"value":188},"Model loads SKILL.md at runtime, any provider",{"type":66,"tag":184,"props":190,"children":191},{},[192,198],{"type":66,"tag":85,"props":193,"children":195},{"className":194},[],[196],{"type":72,"value":197},"withSkills",{"type":72,"value":199}," (this package)",{"type":66,"tag":162,"props":201,"children":202},{},[203,208],{"type":66,"tag":184,"props":204,"children":205},{},[206],{"type":72,"value":207},"Hosted skill runs in a provider sandbox by ID",{"type":66,"tag":184,"props":209,"children":210},{},[211,216,217],{"type":66,"tag":85,"props":212,"children":214},{"className":213},[],[215],{"type":72,"value":135},{"type":72,"value":137},{"type":66,"tag":85,"props":218,"children":220},{"className":219},[],[221],{"type":72,"value":143},{"type":66,"tag":162,"props":223,"children":224},{},[225,230],{"type":66,"tag":184,"props":226,"children":227},{},[228],{"type":72,"value":229},"Teach a coding assistant how to use TanStack AI",{"type":66,"tag":184,"props":231,"children":232},{},[233,235,240],{"type":72,"value":234},"Ship a ",{"type":66,"tag":85,"props":236,"children":238},{"className":237},[],[239],{"type":72,"value":119},{"type":72,"value":241},", install via Intent",{"type":66,"tag":79,"props":243,"children":244},{},[245,247,253,255,260,262,268,270,276],{"type":72,"value":246},"The portable and hosted paths do not mix in one ",{"type":66,"tag":85,"props":248,"children":250},{"className":249},[],[251],{"type":72,"value":252},"chat()",{"type":72,"value":254}," call: ",{"type":66,"tag":85,"props":256,"children":258},{"className":257},[],[259],{"type":72,"value":197},{"type":72,"value":261},"\nthrows if a ",{"type":66,"tag":85,"props":263,"children":265},{"className":264},[],[266],{"type":72,"value":267},"code_execution",{"type":72,"value":269},"\u002F",{"type":66,"tag":85,"props":271,"children":273},{"className":272},[],[274],{"type":72,"value":275},"shell",{"type":72,"value":277}," tool in the same call carries skills.",{"type":66,"tag":147,"props":279,"children":281},{"id":280},"add-skills-to-a-chat",[282],{"type":72,"value":283},"Add skills to a chat",{"type":66,"tag":285,"props":286,"children":290},"pre",{"className":287,"code":288,"language":44,"meta":289,"style":289},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { chat, toServerSentEventsResponse } from '@tanstack\u002Fai'\nimport { anthropicText } from '@tanstack\u002Fai-anthropic'\nimport { inlineSkill, withSkills } from '@tanstack\u002Fai-skills'\n\nconst pptx = inlineSkill({\n  name: 'pptx-builder',\n  description: 'Build and edit PowerPoint decks with python-pptx.',\n  instructions: '# Building a deck\\nUse python-pptx. Edit slides, then save.',\n})\n\nconst stream = chat({\n  adapter: anthropicText('claude-sonnet-4-5'),\n  messages,\n  middleware: [withSkills(pptx)],\n})\n","",[291],{"type":66,"tag":85,"props":292,"children":293},{"__ignoreMap":289},[294,353,391,437,447,482,516,546,586,600,608,637,680,693,724],{"type":66,"tag":295,"props":296,"children":299},"span",{"class":297,"line":298},"line",1,[300,306,312,318,323,328,333,338,343,348],{"type":66,"tag":295,"props":301,"children":303},{"style":302},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[304],{"type":72,"value":305},"import",{"type":66,"tag":295,"props":307,"children":309},{"style":308},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[310],{"type":72,"value":311}," {",{"type":66,"tag":295,"props":313,"children":315},{"style":314},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[316],{"type":72,"value":317}," chat",{"type":66,"tag":295,"props":319,"children":320},{"style":308},[321],{"type":72,"value":322},",",{"type":66,"tag":295,"props":324,"children":325},{"style":314},[326],{"type":72,"value":327}," toServerSentEventsResponse",{"type":66,"tag":295,"props":329,"children":330},{"style":308},[331],{"type":72,"value":332}," }",{"type":66,"tag":295,"props":334,"children":335},{"style":302},[336],{"type":72,"value":337}," from",{"type":66,"tag":295,"props":339,"children":340},{"style":308},[341],{"type":72,"value":342}," '",{"type":66,"tag":295,"props":344,"children":346},{"style":345},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[347],{"type":72,"value":98},{"type":66,"tag":295,"props":349,"children":350},{"style":308},[351],{"type":72,"value":352},"'\n",{"type":66,"tag":295,"props":354,"children":356},{"class":297,"line":355},2,[357,361,365,370,374,378,382,387],{"type":66,"tag":295,"props":358,"children":359},{"style":302},[360],{"type":72,"value":305},{"type":66,"tag":295,"props":362,"children":363},{"style":308},[364],{"type":72,"value":311},{"type":66,"tag":295,"props":366,"children":367},{"style":314},[368],{"type":72,"value":369}," anthropicText",{"type":66,"tag":295,"props":371,"children":372},{"style":308},[373],{"type":72,"value":332},{"type":66,"tag":295,"props":375,"children":376},{"style":302},[377],{"type":72,"value":337},{"type":66,"tag":295,"props":379,"children":380},{"style":308},[381],{"type":72,"value":342},{"type":66,"tag":295,"props":383,"children":384},{"style":345},[385],{"type":72,"value":386},"@tanstack\u002Fai-anthropic",{"type":66,"tag":295,"props":388,"children":389},{"style":308},[390],{"type":72,"value":352},{"type":66,"tag":295,"props":392,"children":394},{"class":297,"line":393},3,[395,399,403,408,412,417,421,425,429,433],{"type":66,"tag":295,"props":396,"children":397},{"style":302},[398],{"type":72,"value":305},{"type":66,"tag":295,"props":400,"children":401},{"style":308},[402],{"type":72,"value":311},{"type":66,"tag":295,"props":404,"children":405},{"style":314},[406],{"type":72,"value":407}," inlineSkill",{"type":66,"tag":295,"props":409,"children":410},{"style":308},[411],{"type":72,"value":322},{"type":66,"tag":295,"props":413,"children":414},{"style":314},[415],{"type":72,"value":416}," withSkills",{"type":66,"tag":295,"props":418,"children":419},{"style":308},[420],{"type":72,"value":332},{"type":66,"tag":295,"props":422,"children":423},{"style":302},[424],{"type":72,"value":337},{"type":66,"tag":295,"props":426,"children":427},{"style":308},[428],{"type":72,"value":342},{"type":66,"tag":295,"props":430,"children":431},{"style":345},[432],{"type":72,"value":106},{"type":66,"tag":295,"props":434,"children":435},{"style":308},[436],{"type":72,"value":352},{"type":66,"tag":295,"props":438,"children":440},{"class":297,"line":439},4,[441],{"type":66,"tag":295,"props":442,"children":444},{"emptyLinePlaceholder":443},true,[445],{"type":72,"value":446},"\n",{"type":66,"tag":295,"props":448,"children":450},{"class":297,"line":449},5,[451,457,462,467,472,477],{"type":66,"tag":295,"props":452,"children":454},{"style":453},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[455],{"type":72,"value":456},"const",{"type":66,"tag":295,"props":458,"children":459},{"style":314},[460],{"type":72,"value":461}," pptx ",{"type":66,"tag":295,"props":463,"children":464},{"style":308},[465],{"type":72,"value":466},"=",{"type":66,"tag":295,"props":468,"children":470},{"style":469},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[471],{"type":72,"value":407},{"type":66,"tag":295,"props":473,"children":474},{"style":314},[475],{"type":72,"value":476},"(",{"type":66,"tag":295,"props":478,"children":479},{"style":308},[480],{"type":72,"value":481},"{\n",{"type":66,"tag":295,"props":483,"children":485},{"class":297,"line":484},6,[486,492,497,501,506,511],{"type":66,"tag":295,"props":487,"children":489},{"style":488},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[490],{"type":72,"value":491},"  name",{"type":66,"tag":295,"props":493,"children":494},{"style":308},[495],{"type":72,"value":496},":",{"type":66,"tag":295,"props":498,"children":499},{"style":308},[500],{"type":72,"value":342},{"type":66,"tag":295,"props":502,"children":503},{"style":345},[504],{"type":72,"value":505},"pptx-builder",{"type":66,"tag":295,"props":507,"children":508},{"style":308},[509],{"type":72,"value":510},"'",{"type":66,"tag":295,"props":512,"children":513},{"style":308},[514],{"type":72,"value":515},",\n",{"type":66,"tag":295,"props":517,"children":519},{"class":297,"line":518},7,[520,525,529,533,538,542],{"type":66,"tag":295,"props":521,"children":522},{"style":488},[523],{"type":72,"value":524},"  description",{"type":66,"tag":295,"props":526,"children":527},{"style":308},[528],{"type":72,"value":496},{"type":66,"tag":295,"props":530,"children":531},{"style":308},[532],{"type":72,"value":342},{"type":66,"tag":295,"props":534,"children":535},{"style":345},[536],{"type":72,"value":537},"Build and edit PowerPoint decks with python-pptx.",{"type":66,"tag":295,"props":539,"children":540},{"style":308},[541],{"type":72,"value":510},{"type":66,"tag":295,"props":543,"children":544},{"style":308},[545],{"type":72,"value":515},{"type":66,"tag":295,"props":547,"children":549},{"class":297,"line":548},8,[550,555,559,563,568,573,578,582],{"type":66,"tag":295,"props":551,"children":552},{"style":488},[553],{"type":72,"value":554},"  instructions",{"type":66,"tag":295,"props":556,"children":557},{"style":308},[558],{"type":72,"value":496},{"type":66,"tag":295,"props":560,"children":561},{"style":308},[562],{"type":72,"value":342},{"type":66,"tag":295,"props":564,"children":565},{"style":345},[566],{"type":72,"value":567},"# Building a deck",{"type":66,"tag":295,"props":569,"children":570},{"style":314},[571],{"type":72,"value":572},"\\n",{"type":66,"tag":295,"props":574,"children":575},{"style":345},[576],{"type":72,"value":577},"Use python-pptx. Edit slides, then save.",{"type":66,"tag":295,"props":579,"children":580},{"style":308},[581],{"type":72,"value":510},{"type":66,"tag":295,"props":583,"children":584},{"style":308},[585],{"type":72,"value":515},{"type":66,"tag":295,"props":587,"children":589},{"class":297,"line":588},9,[590,595],{"type":66,"tag":295,"props":591,"children":592},{"style":308},[593],{"type":72,"value":594},"}",{"type":66,"tag":295,"props":596,"children":597},{"style":314},[598],{"type":72,"value":599},")\n",{"type":66,"tag":295,"props":601,"children":603},{"class":297,"line":602},10,[604],{"type":66,"tag":295,"props":605,"children":606},{"emptyLinePlaceholder":443},[607],{"type":72,"value":446},{"type":66,"tag":295,"props":609,"children":611},{"class":297,"line":610},11,[612,616,621,625,629,633],{"type":66,"tag":295,"props":613,"children":614},{"style":453},[615],{"type":72,"value":456},{"type":66,"tag":295,"props":617,"children":618},{"style":314},[619],{"type":72,"value":620}," stream ",{"type":66,"tag":295,"props":622,"children":623},{"style":308},[624],{"type":72,"value":466},{"type":66,"tag":295,"props":626,"children":627},{"style":469},[628],{"type":72,"value":317},{"type":66,"tag":295,"props":630,"children":631},{"style":314},[632],{"type":72,"value":476},{"type":66,"tag":295,"props":634,"children":635},{"style":308},[636],{"type":72,"value":481},{"type":66,"tag":295,"props":638,"children":640},{"class":297,"line":639},12,[641,646,650,654,658,662,667,671,676],{"type":66,"tag":295,"props":642,"children":643},{"style":488},[644],{"type":72,"value":645},"  adapter",{"type":66,"tag":295,"props":647,"children":648},{"style":308},[649],{"type":72,"value":496},{"type":66,"tag":295,"props":651,"children":652},{"style":469},[653],{"type":72,"value":369},{"type":66,"tag":295,"props":655,"children":656},{"style":314},[657],{"type":72,"value":476},{"type":66,"tag":295,"props":659,"children":660},{"style":308},[661],{"type":72,"value":510},{"type":66,"tag":295,"props":663,"children":664},{"style":345},[665],{"type":72,"value":666},"claude-sonnet-4-5",{"type":66,"tag":295,"props":668,"children":669},{"style":308},[670],{"type":72,"value":510},{"type":66,"tag":295,"props":672,"children":673},{"style":314},[674],{"type":72,"value":675},")",{"type":66,"tag":295,"props":677,"children":678},{"style":308},[679],{"type":72,"value":515},{"type":66,"tag":295,"props":681,"children":683},{"class":297,"line":682},13,[684,689],{"type":66,"tag":295,"props":685,"children":686},{"style":314},[687],{"type":72,"value":688},"  messages",{"type":66,"tag":295,"props":690,"children":691},{"style":308},[692],{"type":72,"value":515},{"type":66,"tag":295,"props":694,"children":696},{"class":297,"line":695},14,[697,702,706,711,715,720],{"type":66,"tag":295,"props":698,"children":699},{"style":488},[700],{"type":72,"value":701},"  middleware",{"type":66,"tag":295,"props":703,"children":704},{"style":308},[705],{"type":72,"value":496},{"type":66,"tag":295,"props":707,"children":708},{"style":314},[709],{"type":72,"value":710}," [",{"type":66,"tag":295,"props":712,"children":713},{"style":469},[714],{"type":72,"value":197},{"type":66,"tag":295,"props":716,"children":717},{"style":314},[718],{"type":72,"value":719},"(pptx)]",{"type":66,"tag":295,"props":721,"children":722},{"style":308},[723],{"type":72,"value":515},{"type":66,"tag":295,"props":725,"children":727},{"class":297,"line":726},15,[728,732],{"type":66,"tag":295,"props":729,"children":730},{"style":308},[731],{"type":72,"value":594},{"type":66,"tag":295,"props":733,"children":734},{"style":314},[735],{"type":72,"value":599},{"type":66,"tag":79,"props":737,"children":738},{},[739,744,746,752,754,760,762,768],{"type":66,"tag":85,"props":740,"children":742},{"className":741},[],[743],{"type":72,"value":197},{"type":72,"value":745}," adds a catalog to the system prompt and a ",{"type":66,"tag":85,"props":747,"children":749},{"className":748},[],[750],{"type":72,"value":751},"load_skill",{"type":72,"value":753}," tool whose\n",{"type":66,"tag":85,"props":755,"children":757},{"className":756},[],[758],{"type":72,"value":759},"name",{"type":72,"value":761}," is constrained to your skill names. It renders ",{"type":66,"tag":85,"props":763,"children":765},{"className":764},[],[766],{"type":72,"value":767},"\u003Cavailable_skills>",{"type":72,"value":769}," XML\nfor Anthropic models and markdown for the rest. Re-loading a skill in the same\nconversation returns a short \"already loaded\" marker.",{"type":66,"tag":147,"props":771,"children":773},{"id":772},"sources",[774],{"type":72,"value":775},"Sources",{"type":66,"tag":79,"props":777,"children":778},{},[779,781,787],{"type":72,"value":780},"A ",{"type":66,"tag":85,"props":782,"children":784},{"className":783},[],[785],{"type":72,"value":786},"SkillSource",{"type":72,"value":788}," is bytes only (no filesystem assumption), so the middleware runs\non the edge too.",{"type":66,"tag":790,"props":791,"children":792},"ul",{},[793,805,839],{"type":66,"tag":794,"props":795,"children":796},"li",{},[797,803],{"type":66,"tag":85,"props":798,"children":800},{"className":799},[],[801],{"type":72,"value":802},"inlineSkill({ name, description, instructions, resources? })",{"type":72,"value":804}," — one skill in\ncode or a DB row. Edge-safe.",{"type":66,"tag":794,"props":806,"children":807},{},[808,814,816,821,823,829,831,837],{"type":66,"tag":85,"props":809,"children":811},{"className":810},[],[812],{"type":72,"value":813},"skillDirectory(root, { strict? })",{"type":72,"value":815}," — walk a folder for ",{"type":66,"tag":85,"props":817,"children":819},{"className":818},[],[820],{"type":72,"value":119},{"type":72,"value":822},". Import from\n",{"type":66,"tag":85,"props":824,"children":826},{"className":825},[],[827],{"type":72,"value":828},"@tanstack\u002Fai-skills\u002Fnode",{"type":72,"value":830}," (uses ",{"type":66,"tag":85,"props":832,"children":834},{"className":833},[],[835],{"type":72,"value":836},"node:fs",{"type":72,"value":838},"). Strict by default.",{"type":66,"tag":794,"props":840,"children":841},{},[842,848,850,856,858,864],{"type":66,"tag":85,"props":843,"children":845},{"className":844},[],[846],{"type":72,"value":847},"staticSkills(catalog)",{"type":72,"value":849}," — build-time bundle via ",{"type":66,"tag":85,"props":851,"children":853},{"className":852},[],[854],{"type":72,"value":855},"skillsCatalogPlugin",{"type":72,"value":857}," (Vite).\nEdge-safe, and ",{"type":66,"tag":85,"props":859,"children":861},{"className":860},[],[862],{"type":72,"value":863},".names",{"type":72,"value":865}," is a typed union.",{"type":66,"tag":79,"props":867,"children":868},{},[869,871,877,879,885,886,892,893,899,901,907,909,915],{"type":72,"value":870},"Combine with ",{"type":66,"tag":85,"props":872,"children":874},{"className":873},[],[875],{"type":72,"value":876},"aggregate",{"type":72,"value":878},", ",{"type":66,"tag":85,"props":880,"children":882},{"className":881},[],[883],{"type":72,"value":884},"dedupe",{"type":72,"value":878},{"type":66,"tag":85,"props":887,"children":889},{"className":888},[],[890],{"type":72,"value":891},"filter",{"type":72,"value":878},{"type":66,"tag":85,"props":894,"children":896},{"className":895},[],[897],{"type":72,"value":898},"cache",{"type":72,"value":900},". ",{"type":66,"tag":85,"props":902,"children":904},{"className":903},[],[905],{"type":72,"value":906},"withSkills([a, b])",{"type":72,"value":908}," is\nsugar for ",{"type":66,"tag":85,"props":910,"children":912},{"className":911},[],[913],{"type":72,"value":914},"dedupe(aggregate([a, b]))",{"type":72,"value":916},". A single source is never auto-wrapped, so\na tenant-scoped source is never cached into a shared bucket.",{"type":66,"tag":147,"props":918,"children":920},{"id":919},"resources",[921],{"type":72,"value":922},"Resources",{"type":66,"tag":79,"props":924,"children":925},{},[926,928,934,936,942,943,948,950,956],{"type":72,"value":927},"To let the model read a skill's bundled files, pass ",{"type":66,"tag":85,"props":929,"children":931},{"className":930},[],[932],{"type":72,"value":933},"createResourceTool(source)",{"type":72,"value":935},"\nin ",{"type":66,"tag":85,"props":937,"children":939},{"className":938},[],[940],{"type":72,"value":941},"tools",{"type":72,"value":900},{"type":66,"tag":85,"props":944,"children":946},{"className":945},[],[947],{"type":72,"value":197},{"type":72,"value":949}," detects it and advertises ",{"type":66,"tag":85,"props":951,"children":953},{"className":952},[],[954],{"type":72,"value":955},"read_skill_resource",{"type":72,"value":957},". Paths\nthat escape the skill root are rejected.",{"type":66,"tag":147,"props":959,"children":961},{"id":960},"skills-that-carry-code",[962],{"type":72,"value":963},"Skills that carry code",{"type":66,"tag":79,"props":965,"children":966},{},[967,972,974,980,982,987,989,995,997,1002,1004,1009],{"type":66,"tag":85,"props":968,"children":970},{"className":969},[],[971],{"type":72,"value":197},{"type":72,"value":973}," inventories a skill's ",{"type":66,"tag":85,"props":975,"children":977},{"className":976},[],[978],{"type":72,"value":979},"scripts\u002F",{"type":72,"value":981}," in the ",{"type":66,"tag":85,"props":983,"children":985},{"className":984},[],[986],{"type":72,"value":751},{"type":72,"value":988}," result but does\nNOT run them (script execution is a later phase). To let a skill run code, pass\nyour own execution tool to ",{"type":66,"tag":85,"props":990,"children":992},{"className":991},[],[993],{"type":72,"value":994},"chat({ tools })",{"type":72,"value":996}," alongside ",{"type":66,"tag":85,"props":998,"children":1000},{"className":999},[],[1001],{"type":72,"value":197},{"type":72,"value":1003}," and write the\nskill so it tells the model to call that tool. ",{"type":66,"tag":85,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":72,"value":197},{"type":72,"value":1010}," composes with any\ntools you provide.",{"type":66,"tag":285,"props":1012,"children":1017},{"className":1013,"code":1014,"language":1015,"meta":1016,"style":289},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { toolDefinition } from '@tanstack\u002Fai'\nimport { z } from 'zod'\n\nconst executeShell = toolDefinition({\n  name: 'execute_shell',\n  description: 'Run a shell command and return its stdout.',\n  inputSchema: z.object({ command: z.string() }),\n  outputSchema: z.object({ stdout: z.string() }),\n}).server(async ({ command }) => ({ stdout: await runSomewhere(command) }))\n\n\u002F\u002F chat({ tools: [executeShell], middleware: [withSkills(source)] })\n","ts","ignore",[1018],{"type":66,"tag":85,"props":1019,"children":1020},{"__ignoreMap":289},[1021,1057,1094,1101,1129,1157,1185,1258,1327,1416,1423],{"type":66,"tag":295,"props":1022,"children":1023},{"class":297,"line":298},[1024,1028,1032,1037,1041,1045,1049,1053],{"type":66,"tag":295,"props":1025,"children":1026},{"style":302},[1027],{"type":72,"value":305},{"type":66,"tag":295,"props":1029,"children":1030},{"style":308},[1031],{"type":72,"value":311},{"type":66,"tag":295,"props":1033,"children":1034},{"style":314},[1035],{"type":72,"value":1036}," toolDefinition",{"type":66,"tag":295,"props":1038,"children":1039},{"style":308},[1040],{"type":72,"value":332},{"type":66,"tag":295,"props":1042,"children":1043},{"style":302},[1044],{"type":72,"value":337},{"type":66,"tag":295,"props":1046,"children":1047},{"style":308},[1048],{"type":72,"value":342},{"type":66,"tag":295,"props":1050,"children":1051},{"style":345},[1052],{"type":72,"value":98},{"type":66,"tag":295,"props":1054,"children":1055},{"style":308},[1056],{"type":72,"value":352},{"type":66,"tag":295,"props":1058,"children":1059},{"class":297,"line":355},[1060,1064,1068,1073,1077,1081,1085,1090],{"type":66,"tag":295,"props":1061,"children":1062},{"style":302},[1063],{"type":72,"value":305},{"type":66,"tag":295,"props":1065,"children":1066},{"style":308},[1067],{"type":72,"value":311},{"type":66,"tag":295,"props":1069,"children":1070},{"style":314},[1071],{"type":72,"value":1072}," z",{"type":66,"tag":295,"props":1074,"children":1075},{"style":308},[1076],{"type":72,"value":332},{"type":66,"tag":295,"props":1078,"children":1079},{"style":302},[1080],{"type":72,"value":337},{"type":66,"tag":295,"props":1082,"children":1083},{"style":308},[1084],{"type":72,"value":342},{"type":66,"tag":295,"props":1086,"children":1087},{"style":345},[1088],{"type":72,"value":1089},"zod",{"type":66,"tag":295,"props":1091,"children":1092},{"style":308},[1093],{"type":72,"value":352},{"type":66,"tag":295,"props":1095,"children":1096},{"class":297,"line":393},[1097],{"type":66,"tag":295,"props":1098,"children":1099},{"emptyLinePlaceholder":443},[1100],{"type":72,"value":446},{"type":66,"tag":295,"props":1102,"children":1103},{"class":297,"line":439},[1104,1108,1113,1117,1121,1125],{"type":66,"tag":295,"props":1105,"children":1106},{"style":453},[1107],{"type":72,"value":456},{"type":66,"tag":295,"props":1109,"children":1110},{"style":314},[1111],{"type":72,"value":1112}," executeShell ",{"type":66,"tag":295,"props":1114,"children":1115},{"style":308},[1116],{"type":72,"value":466},{"type":66,"tag":295,"props":1118,"children":1119},{"style":469},[1120],{"type":72,"value":1036},{"type":66,"tag":295,"props":1122,"children":1123},{"style":314},[1124],{"type":72,"value":476},{"type":66,"tag":295,"props":1126,"children":1127},{"style":308},[1128],{"type":72,"value":481},{"type":66,"tag":295,"props":1130,"children":1131},{"class":297,"line":449},[1132,1136,1140,1144,1149,1153],{"type":66,"tag":295,"props":1133,"children":1134},{"style":488},[1135],{"type":72,"value":491},{"type":66,"tag":295,"props":1137,"children":1138},{"style":308},[1139],{"type":72,"value":496},{"type":66,"tag":295,"props":1141,"children":1142},{"style":308},[1143],{"type":72,"value":342},{"type":66,"tag":295,"props":1145,"children":1146},{"style":345},[1147],{"type":72,"value":1148},"execute_shell",{"type":66,"tag":295,"props":1150,"children":1151},{"style":308},[1152],{"type":72,"value":510},{"type":66,"tag":295,"props":1154,"children":1155},{"style":308},[1156],{"type":72,"value":515},{"type":66,"tag":295,"props":1158,"children":1159},{"class":297,"line":484},[1160,1164,1168,1172,1177,1181],{"type":66,"tag":295,"props":1161,"children":1162},{"style":488},[1163],{"type":72,"value":524},{"type":66,"tag":295,"props":1165,"children":1166},{"style":308},[1167],{"type":72,"value":496},{"type":66,"tag":295,"props":1169,"children":1170},{"style":308},[1171],{"type":72,"value":342},{"type":66,"tag":295,"props":1173,"children":1174},{"style":345},[1175],{"type":72,"value":1176},"Run a shell command and return its stdout.",{"type":66,"tag":295,"props":1178,"children":1179},{"style":308},[1180],{"type":72,"value":510},{"type":66,"tag":295,"props":1182,"children":1183},{"style":308},[1184],{"type":72,"value":515},{"type":66,"tag":295,"props":1186,"children":1187},{"class":297,"line":518},[1188,1193,1197,1201,1205,1210,1214,1219,1224,1228,1232,1236,1241,1246,1250,1254],{"type":66,"tag":295,"props":1189,"children":1190},{"style":488},[1191],{"type":72,"value":1192},"  inputSchema",{"type":66,"tag":295,"props":1194,"children":1195},{"style":308},[1196],{"type":72,"value":496},{"type":66,"tag":295,"props":1198,"children":1199},{"style":314},[1200],{"type":72,"value":1072},{"type":66,"tag":295,"props":1202,"children":1203},{"style":308},[1204],{"type":72,"value":108},{"type":66,"tag":295,"props":1206,"children":1207},{"style":469},[1208],{"type":72,"value":1209},"object",{"type":66,"tag":295,"props":1211,"children":1212},{"style":314},[1213],{"type":72,"value":476},{"type":66,"tag":295,"props":1215,"children":1216},{"style":308},[1217],{"type":72,"value":1218},"{",{"type":66,"tag":295,"props":1220,"children":1221},{"style":488},[1222],{"type":72,"value":1223}," command",{"type":66,"tag":295,"props":1225,"children":1226},{"style":308},[1227],{"type":72,"value":496},{"type":66,"tag":295,"props":1229,"children":1230},{"style":314},[1231],{"type":72,"value":1072},{"type":66,"tag":295,"props":1233,"children":1234},{"style":308},[1235],{"type":72,"value":108},{"type":66,"tag":295,"props":1237,"children":1238},{"style":469},[1239],{"type":72,"value":1240},"string",{"type":66,"tag":295,"props":1242,"children":1243},{"style":314},[1244],{"type":72,"value":1245},"() ",{"type":66,"tag":295,"props":1247,"children":1248},{"style":308},[1249],{"type":72,"value":594},{"type":66,"tag":295,"props":1251,"children":1252},{"style":314},[1253],{"type":72,"value":675},{"type":66,"tag":295,"props":1255,"children":1256},{"style":308},[1257],{"type":72,"value":515},{"type":66,"tag":295,"props":1259,"children":1260},{"class":297,"line":548},[1261,1266,1270,1274,1278,1282,1286,1290,1295,1299,1303,1307,1311,1315,1319,1323],{"type":66,"tag":295,"props":1262,"children":1263},{"style":488},[1264],{"type":72,"value":1265},"  outputSchema",{"type":66,"tag":295,"props":1267,"children":1268},{"style":308},[1269],{"type":72,"value":496},{"type":66,"tag":295,"props":1271,"children":1272},{"style":314},[1273],{"type":72,"value":1072},{"type":66,"tag":295,"props":1275,"children":1276},{"style":308},[1277],{"type":72,"value":108},{"type":66,"tag":295,"props":1279,"children":1280},{"style":469},[1281],{"type":72,"value":1209},{"type":66,"tag":295,"props":1283,"children":1284},{"style":314},[1285],{"type":72,"value":476},{"type":66,"tag":295,"props":1287,"children":1288},{"style":308},[1289],{"type":72,"value":1218},{"type":66,"tag":295,"props":1291,"children":1292},{"style":488},[1293],{"type":72,"value":1294}," stdout",{"type":66,"tag":295,"props":1296,"children":1297},{"style":308},[1298],{"type":72,"value":496},{"type":66,"tag":295,"props":1300,"children":1301},{"style":314},[1302],{"type":72,"value":1072},{"type":66,"tag":295,"props":1304,"children":1305},{"style":308},[1306],{"type":72,"value":108},{"type":66,"tag":295,"props":1308,"children":1309},{"style":469},[1310],{"type":72,"value":1240},{"type":66,"tag":295,"props":1312,"children":1313},{"style":314},[1314],{"type":72,"value":1245},{"type":66,"tag":295,"props":1316,"children":1317},{"style":308},[1318],{"type":72,"value":594},{"type":66,"tag":295,"props":1320,"children":1321},{"style":314},[1322],{"type":72,"value":675},{"type":66,"tag":295,"props":1324,"children":1325},{"style":308},[1326],{"type":72,"value":515},{"type":66,"tag":295,"props":1328,"children":1329},{"class":297,"line":588},[1330,1334,1338,1342,1347,1351,1356,1361,1366,1371,1376,1380,1384,1388,1392,1397,1402,1407,1411],{"type":66,"tag":295,"props":1331,"children":1332},{"style":308},[1333],{"type":72,"value":594},{"type":66,"tag":295,"props":1335,"children":1336},{"style":314},[1337],{"type":72,"value":675},{"type":66,"tag":295,"props":1339,"children":1340},{"style":308},[1341],{"type":72,"value":108},{"type":66,"tag":295,"props":1343,"children":1344},{"style":469},[1345],{"type":72,"value":1346},"server",{"type":66,"tag":295,"props":1348,"children":1349},{"style":314},[1350],{"type":72,"value":476},{"type":66,"tag":295,"props":1352,"children":1353},{"style":453},[1354],{"type":72,"value":1355},"async",{"type":66,"tag":295,"props":1357,"children":1358},{"style":308},[1359],{"type":72,"value":1360}," ({",{"type":66,"tag":295,"props":1362,"children":1364},{"style":1363},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[1365],{"type":72,"value":1223},{"type":66,"tag":295,"props":1367,"children":1368},{"style":308},[1369],{"type":72,"value":1370}," })",{"type":66,"tag":295,"props":1372,"children":1373},{"style":453},[1374],{"type":72,"value":1375}," =>",{"type":66,"tag":295,"props":1377,"children":1378},{"style":314},[1379],{"type":72,"value":129},{"type":66,"tag":295,"props":1381,"children":1382},{"style":308},[1383],{"type":72,"value":1218},{"type":66,"tag":295,"props":1385,"children":1386},{"style":488},[1387],{"type":72,"value":1294},{"type":66,"tag":295,"props":1389,"children":1390},{"style":308},[1391],{"type":72,"value":496},{"type":66,"tag":295,"props":1393,"children":1394},{"style":302},[1395],{"type":72,"value":1396}," await",{"type":66,"tag":295,"props":1398,"children":1399},{"style":469},[1400],{"type":72,"value":1401}," runSomewhere",{"type":66,"tag":295,"props":1403,"children":1404},{"style":314},[1405],{"type":72,"value":1406},"(command) ",{"type":66,"tag":295,"props":1408,"children":1409},{"style":308},[1410],{"type":72,"value":594},{"type":66,"tag":295,"props":1412,"children":1413},{"style":314},[1414],{"type":72,"value":1415},"))\n",{"type":66,"tag":295,"props":1417,"children":1418},{"class":297,"line":602},[1419],{"type":66,"tag":295,"props":1420,"children":1421},{"emptyLinePlaceholder":443},[1422],{"type":72,"value":446},{"type":66,"tag":295,"props":1424,"children":1425},{"class":297,"line":610},[1426],{"type":66,"tag":295,"props":1427,"children":1429},{"style":1428},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1430],{"type":72,"value":1431},"\u002F\u002F chat({ tools: [executeShell], middleware: [withSkills(source)] })\n",{"type":66,"tag":79,"props":1433,"children":1434},{},[1435,1437,1442,1443,1448],{"type":72,"value":1436},"The skill supplies the command; your tool supplies the ability to run it. Swap in\na provider sandbox, a Code Mode isolate, or a remote worker without changing the\nskill. For hosted skills that run in the provider's own sandbox, use\n",{"type":66,"tag":85,"props":1438,"children":1440},{"className":1439},[],[1441],{"type":72,"value":135},{"type":72,"value":137},{"type":66,"tag":85,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":72,"value":143},{"type":72,"value":1449}," instead (see provider-skills).",{"type":66,"tag":147,"props":1451,"children":1453},{"id":1452},"write-a-custom-source",[1454],{"type":72,"value":1455},"Write a custom source",{"type":66,"tag":79,"props":1457,"children":1458},{},[1459,1461,1466,1467,1473,1475,1481,1483,1489,1490,1496,1498,1504],{"type":72,"value":1460},"Implement ",{"type":66,"tag":85,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":72,"value":786},{"type":72,"value":129},{"type":66,"tag":85,"props":1468,"children":1470},{"className":1469},[],[1471],{"type":72,"value":1472},"list",{"type":72,"value":1474}," + ",{"type":66,"tag":85,"props":1476,"children":1478},{"className":1477},[],[1479],{"type":72,"value":1480},"load",{"type":72,"value":1482},", optional ",{"type":66,"tag":85,"props":1484,"children":1486},{"className":1485},[],[1487],{"type":72,"value":1488},"revision",{"type":72,"value":269},{"type":66,"tag":85,"props":1491,"children":1493},{"className":1492},[],[1494],{"type":72,"value":1495},"listResources",{"type":72,"value":1497},"\u002F\n",{"type":66,"tag":85,"props":1499,"children":1501},{"className":1500},[],[1502],{"type":72,"value":1503},"readResource",{"type":72,"value":1505},"), then validate it with the shipped conformance suite:",{"type":66,"tag":285,"props":1507,"children":1509},{"className":287,"code":1508,"language":44,"meta":289,"style":289},"import { runSkillSourceConformance } from '@tanstack\u002Fai-skills\u002Ftesting'\n\nrunSkillSourceConformance(() => myS3Source(fixtures), 's3')\n",[1510],{"type":66,"tag":85,"props":1511,"children":1512},{"__ignoreMap":289},[1513,1550,1557],{"type":66,"tag":295,"props":1514,"children":1515},{"class":297,"line":298},[1516,1520,1524,1529,1533,1537,1541,1546],{"type":66,"tag":295,"props":1517,"children":1518},{"style":302},[1519],{"type":72,"value":305},{"type":66,"tag":295,"props":1521,"children":1522},{"style":308},[1523],{"type":72,"value":311},{"type":66,"tag":295,"props":1525,"children":1526},{"style":314},[1527],{"type":72,"value":1528}," runSkillSourceConformance",{"type":66,"tag":295,"props":1530,"children":1531},{"style":308},[1532],{"type":72,"value":332},{"type":66,"tag":295,"props":1534,"children":1535},{"style":302},[1536],{"type":72,"value":337},{"type":66,"tag":295,"props":1538,"children":1539},{"style":308},[1540],{"type":72,"value":342},{"type":66,"tag":295,"props":1542,"children":1543},{"style":345},[1544],{"type":72,"value":1545},"@tanstack\u002Fai-skills\u002Ftesting",{"type":66,"tag":295,"props":1547,"children":1548},{"style":308},[1549],{"type":72,"value":352},{"type":66,"tag":295,"props":1551,"children":1552},{"class":297,"line":355},[1553],{"type":66,"tag":295,"props":1554,"children":1555},{"emptyLinePlaceholder":443},[1556],{"type":72,"value":446},{"type":66,"tag":295,"props":1558,"children":1559},{"class":297,"line":393},[1560,1565,1569,1574,1578,1583,1588,1592,1596,1601,1605],{"type":66,"tag":295,"props":1561,"children":1562},{"style":469},[1563],{"type":72,"value":1564},"runSkillSourceConformance",{"type":66,"tag":295,"props":1566,"children":1567},{"style":314},[1568],{"type":72,"value":476},{"type":66,"tag":295,"props":1570,"children":1571},{"style":308},[1572],{"type":72,"value":1573},"()",{"type":66,"tag":295,"props":1575,"children":1576},{"style":453},[1577],{"type":72,"value":1375},{"type":66,"tag":295,"props":1579,"children":1580},{"style":469},[1581],{"type":72,"value":1582}," myS3Source",{"type":66,"tag":295,"props":1584,"children":1585},{"style":314},[1586],{"type":72,"value":1587},"(fixtures)",{"type":66,"tag":295,"props":1589,"children":1590},{"style":308},[1591],{"type":72,"value":322},{"type":66,"tag":295,"props":1593,"children":1594},{"style":308},[1595],{"type":72,"value":342},{"type":66,"tag":295,"props":1597,"children":1598},{"style":345},[1599],{"type":72,"value":1600},"s3",{"type":66,"tag":295,"props":1602,"children":1603},{"style":308},[1604],{"type":72,"value":510},{"type":66,"tag":295,"props":1606,"children":1607},{"style":314},[1608],{"type":72,"value":599},{"type":66,"tag":147,"props":1610,"children":1612},{"id":1611},"entry-points",[1613],{"type":72,"value":1614},"Entry points",{"type":66,"tag":790,"props":1616,"children":1617},{},[1618,1670,1700],{"type":66,"tag":794,"props":1619,"children":1620},{},[1621,1626,1628,1634,1636,1641,1642,1648,1649,1655,1656,1662,1663,1669],{"type":66,"tag":85,"props":1622,"children":1624},{"className":1623},[],[1625],{"type":72,"value":106},{"type":72,"value":1627}," — types, ",{"type":66,"tag":85,"props":1629,"children":1631},{"className":1630},[],[1632],{"type":72,"value":1633},"inlineSkill",{"type":72,"value":1635},", combinators, ",{"type":66,"tag":85,"props":1637,"children":1639},{"className":1638},[],[1640],{"type":72,"value":197},{"type":72,"value":515},{"type":66,"tag":85,"props":1643,"children":1645},{"className":1644},[],[1646],{"type":72,"value":1647},"createResourceTool",{"type":72,"value":878},{"type":66,"tag":85,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":72,"value":1654},"validateSkill",{"type":72,"value":878},{"type":66,"tag":85,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":72,"value":1661},"staticSkills",{"type":72,"value":878},{"type":66,"tag":85,"props":1664,"children":1666},{"className":1665},[],[1667],{"type":72,"value":1668},"SkillLimitError",{"type":72,"value":108},{"type":66,"tag":794,"props":1671,"children":1672},{},[1673,1678,1680,1686,1687,1692,1693,1698],{"type":66,"tag":85,"props":1674,"children":1676},{"className":1675},[],[1677],{"type":72,"value":828},{"type":72,"value":1679}," — ",{"type":66,"tag":85,"props":1681,"children":1683},{"className":1682},[],[1684],{"type":72,"value":1685},"skillDirectory",{"type":72,"value":878},{"type":66,"tag":85,"props":1688,"children":1690},{"className":1689},[],[1691],{"type":72,"value":855},{"type":72,"value":129},{"type":66,"tag":85,"props":1694,"children":1696},{"className":1695},[],[1697],{"type":72,"value":836},{"type":72,"value":1699},").",{"type":66,"tag":794,"props":1701,"children":1702},{},[1703,1708,1709,1714],{"type":66,"tag":85,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":72,"value":1545},{"type":72,"value":1679},{"type":66,"tag":85,"props":1710,"children":1712},{"className":1711},[],[1713],{"type":72,"value":1564},{"type":72,"value":108},{"type":66,"tag":147,"props":1716,"children":1718},{"id":1717},"docs",[1719],{"type":72,"value":1720},"Docs",{"type":66,"tag":790,"props":1722,"children":1723},{},[1724,1735,1746,1757],{"type":66,"tag":794,"props":1725,"children":1726},{},[1727,1729],{"type":72,"value":1728},"Portable Agent Skills: ",{"type":66,"tag":85,"props":1730,"children":1732},{"className":1731},[],[1733],{"type":72,"value":1734},"docs\u002Fskills\u002Fagent-skills.md",{"type":66,"tag":794,"props":1736,"children":1737},{},[1738,1740],{"type":72,"value":1739},"Skill sources: ",{"type":66,"tag":85,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":72,"value":1745},"docs\u002Fskills\u002Fskill-sources.md",{"type":66,"tag":794,"props":1747,"children":1748},{},[1749,1751],{"type":72,"value":1750},"Write a skill source: ",{"type":66,"tag":85,"props":1752,"children":1754},{"className":1753},[],[1755],{"type":72,"value":1756},"docs\u002Fskills\u002Fwriting-adapters.md",{"type":66,"tag":794,"props":1758,"children":1759},{},[1760,1762],{"type":72,"value":1761},"Provider (hosted) skills: ",{"type":66,"tag":85,"props":1763,"children":1765},{"className":1764},[],[1766],{"type":72,"value":1767},"docs\u002Ftools\u002Fprovider-skills.md",{"type":66,"tag":1769,"props":1770,"children":1771},"style",{},[1772],{"type":72,"value":1773},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1775,"total":1918},[1776,1792,1804,1816,1829,1844,1854,1864,1874,1887,1897,1908],{"slug":1777,"name":1777,"fn":1778,"description":1779,"org":1780,"tags":1781,"stars":1789,"repoUrl":1790,"updatedAt":1791},"aggregation","perform data aggregation in TanStack Table","Aggregate TanStack Table columns independently of grouping, including grand totals, caller-selected row totals, multiple keyed aggregations, custom context-based definitions, grouped merges, manual values, and worker constraints.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1782,1785,1788],{"name":1783,"slug":1784,"type":15},"Data Analysis","data-analysis",{"name":1786,"slug":1787,"type":15},"Frontend","frontend",{"name":9,"slug":8,"type":15},28175,"https:\u002F\u002Fgithub.com\u002FTanStack\u002Ftable","2026-08-28T14:35:03.19796",{"slug":1793,"name":1793,"fn":1794,"description":1795,"org":1796,"tags":1797,"stars":1789,"repoUrl":1790,"updatedAt":1803},"api-not-found","diagnose TanStack Table API errors","Diagnose missing TanStack Table v9 exports, options, state slices, and instance methods. Load before inventing an API when code sees a type error, undefined feature method, absent object key, adapter mismatch, or v8-shaped example.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1798,1801,1802],{"name":1799,"slug":1800,"type":15},"Debugging","debugging",{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},"2026-08-28T14:35:11.614343",{"slug":1805,"name":1805,"fn":1806,"description":1807,"org":1808,"tags":1809,"stars":1789,"repoUrl":1790,"updatedAt":1815},"cell-selection","select rectangular cell ranges in tables","Select, add, and subtract rectangular cell ranges with cellSelectionFeature: ordered include\u002Fexclude operations keyed by row and column id, modifier dragging, final positive bounds, selection edges, render-order resolution under pinning, and autoResetCellSelection. Load for spreadsheet-style selection, “select all except” behavior, unexpected range changes after sorting or reordering, drag performance, or copy-to-clipboard.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1810,1811,1812],{"name":1783,"slug":1784,"type":15},{"name":9,"slug":8,"type":15},{"name":1813,"slug":1814,"type":15},"UI Components","ui-components","2026-08-28T14:34:47.502585",{"slug":1817,"name":1817,"fn":1818,"description":1819,"org":1820,"tags":1821,"stars":1789,"repoUrl":1790,"updatedAt":1828},"cell-spanning","configure cell spanning in TanStack Table","Merge adjacent body cells with cellSpanningFeature: value-based rowSpan opt-in per column via spanRows, per-row colSpan via spanColumns, and the covered-cell convention where a span of 0 means skip the cell. Load for merged data grids, spans that disappear after sorting or paginating, ragged table rows, or a cell that unexpectedly merges down the whole tbody.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1822,1825,1826,1827],{"name":1823,"slug":1824,"type":15},"Data Visualization","data-visualization",{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},{"name":1813,"slug":1814,"type":15},"2026-08-28T14:34:53.319958",{"slug":1830,"name":1830,"fn":1831,"description":1832,"org":1833,"tags":1834,"stars":1789,"repoUrl":1790,"updatedAt":1843},"client-vs-server","manage TanStack Table data pipelines","Choose client or server ownership for filtering, grouping, sorting, expanding, and pagination in TanStack Table v9. Load for manual* flags, mixed pipelines, server counts, or deciding which dataset each row-model stage receives.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1835,1838,1839,1842],{"name":1836,"slug":1837,"type":15},"Data Pipeline","data-pipeline",{"name":1786,"slug":1787,"type":15},{"name":1840,"slug":1841,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-08-28T14:34:45.725709",{"slug":1845,"name":1845,"fn":1846,"description":1847,"org":1848,"tags":1849,"stars":1789,"repoUrl":1790,"updatedAt":1853},"column-faceting","build faceted filter UIs","Build faceted filter UIs with columnFacetingFeature, facetedRowModel, facetedUniqueValues, and facetedMinMaxValues. Load for facet counts, numeric ranges, own-filter exclusion, or server-page facet completeness.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1850,1851,1852],{"name":1823,"slug":1824,"type":15},{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},"2026-08-28T14:34:41.330482",{"slug":1855,"name":1855,"fn":1856,"description":1857,"org":1858,"tags":1859,"stars":1789,"repoUrl":1790,"updatedAt":1863},"column-filtering","implement column filtering in TanStack Table","Filter columns with columnFilteringFeature, filteredRowModel, filterFns, filterMeta, nested-row direction, and manualFiltering. Load for accessor compatibility, controlled filter updaters, fuzzy metadata, or client\u002Fserver ownership.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1860,1861,1862],{"name":1783,"slug":1784,"type":15},{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},"2026-08-28T14:34:56.383377",{"slug":1865,"name":1865,"fn":1866,"description":1867,"org":1868,"tags":1869,"stars":1789,"repoUrl":1790,"updatedAt":1873},"column-ordering","manage TanStack Table column ordering","Control TanStack Table v9 leaf columnOrder with stable IDs while accounting for pinning regions, visibility, and groupedColumnMode precedence. Load for drag-and-drop columns or rendered order that differs from state.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1870,1871,1872],{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},{"name":1813,"slug":1814,"type":15},"2026-08-28T14:35:09.610931",{"slug":1875,"name":1875,"fn":1876,"description":1877,"org":1878,"tags":1879,"stars":1789,"repoUrl":1790,"updatedAt":1886},"column-pinning","configure column pinning in TanStack Table","Pin columns into logical start, center, and end regions with columnPinningFeature and renderer-owned sticky CSS. Load for RTL offsets, z-index, backgrounds, overflow, widths, gaps, or overlaps.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1880,1883,1884,1885],{"name":1881,"slug":1882,"type":15},"CSS","css",{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},{"name":1813,"slug":1814,"type":15},"2026-08-28T14:34:58.325644",{"slug":1888,"name":1888,"fn":1889,"description":1890,"org":1891,"tags":1892,"stars":1789,"repoUrl":1790,"updatedAt":1896},"column-resizing","implement column resizing in TanStack Table","Wire columnResizingFeature, header.getResizeHandler, resize mode and direction, pointer or touch events, and performant CSS-variable updates. Load when resize state changes but widths do not, or large tables resize slowly.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1893,1894,1895],{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},{"name":1813,"slug":1814,"type":15},"2026-08-28T14:34:54.339897",{"slug":1898,"name":1898,"fn":1899,"description":1900,"org":1901,"tags":1902,"stars":1789,"repoUrl":1790,"updatedAt":1907},"column-sizing","configure column sizing in TanStack Table","Use columnSizingFeature numeric size, minSize, maxSize, getSize, getStart, getAfter, and total-size APIs in table, grid, or flex CSS. Load for auto or percentage misconceptions and sizing\u002Fpinning layout mismatch.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1903,1904,1905,1906],{"name":1881,"slug":1882,"type":15},{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},{"name":1813,"slug":1814,"type":15},"2026-08-28T14:34:49.992695",{"slug":1909,"name":1909,"fn":1910,"description":1911,"org":1912,"tags":1913,"stars":1789,"repoUrl":1790,"updatedAt":1917},"column-visibility","manage column visibility in TanStack Table","Hide columns with columnVisibilityFeature while rendering visibility-aware header, column, and cell collections. Load when hidden columns remain in the DOM, false-versus-absent state is confused, or enableHiding is misunderstood.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1914,1915,1916],{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},{"name":1813,"slug":1814,"type":15},"2026-08-28T14:34:49.287546",140,{"items":1920,"total":2016},[1921,1939,1948,1963,1976,1988,2002],{"slug":1922,"name":1922,"fn":1923,"description":1924,"org":1925,"tags":1926,"stars":23,"repoUrl":24,"updatedAt":1938},"ai-code-mode","execute sandboxed TypeScript code with LLMs","LLM-generated TypeScript execution in sandboxed environments: createCodeModeTool() with isolate drivers (createNodeIsolateDriver, createQuickJSIsolateDriver, createQuickJSBunIsolateDriver, createCloudflareIsolateDriver), codeModeWithSnippets() for persistent snippet libraries, trust strategies, snippet storage (FileSystem, LocalStorage, InMemory, Mongo), client-side execution progress via code_mode:* custom events in useChat.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1927,1929,1932,1935,1936],{"name":1928,"slug":30,"type":15},"AI SDK",{"name":1930,"slug":1931,"type":15},"Code Execution","code-execution",{"name":1933,"slug":1934,"type":15},"Sandboxing","sandboxing",{"name":9,"slug":8,"type":15},{"name":1937,"slug":44,"type":15},"TypeScript","2026-08-18T03:26:11.233455",{"slug":90,"name":90,"fn":1940,"description":1941,"org":1942,"tags":1943,"stars":23,"repoUrl":24,"updatedAt":1947},"configure TanStack AI agent features","Entry point for TanStack AI skills. Routes to chat-experience, tool-calling, media-generation, structured-outputs, adapter-configuration, ag-ui-protocol, middleware, locks, custom-backend-integration, and debug-logging, plus the skills shipped by companion packages (@tanstack\u002Fai-persistence, @tanstack\u002Fai-code-mode). Use chat() not streamText(), openaiText() not createOpenAI(), toServerSentEventsResponse() not manual SSE, middleware hooks not onEnd callbacks.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1944,1945,1946],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},"2026-08-28T14:34:36.345708",{"slug":1949,"name":1950,"fn":1951,"description":1952,"org":1953,"tags":1954,"stars":23,"repoUrl":24,"updatedAt":1962},"ai-coreadapter-configuration","ai-core\u002Fadapter-configuration","configure AI provider adapters","Provider adapter selection and configuration: openaiText, anthropicText, geminiText, ollamaText, grokText, groqText, openRouterText, bedrockText, byteplusText, openaiCompatible. Per-model type safety with modelOptions, reasoning\u002Fthinking configuration, runtime adapter switching, extendAdapter() for custom models, createModel(). Generic OpenAI-compatible providers (DeepSeek, Together, Fireworks, etc.) via openaiCompatible({ baseURL, apiKey, models }) from @tanstack\u002Fai-openai\u002Fcompatible. API key env vars: OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_API_KEY\u002FGEMINI_API_KEY, XAI_API_KEY, GROQ_API_KEY, OPENROUTER_API_KEY, OLLAMA_HOST, BEDROCK_API_KEY (or AWS_BEARER_TOKEN_BEDROCK). BytePlus needs TWO keys: ARK_API_KEY (ModelArk — chat\u002Fvideo\u002Fimage) and BYTEPLUS_VOICE_API_KEY (Seed Speech — TTS\u002Ftranscription); neither is a fallback for the other.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1955,1956,1959,1961],{"name":1928,"slug":30,"type":15},{"name":1957,"slug":1958,"type":15},"Configuration","configuration",{"name":1960,"slug":36,"type":15},"LLM",{"name":9,"slug":8,"type":15},"2026-08-05T05:32:31.01777",{"slug":1964,"name":1965,"fn":1966,"description":1967,"org":1968,"tags":1969,"stars":23,"repoUrl":24,"updatedAt":1975},"ai-coreag-ui-protocol","ai-core\u002Fag-ui-protocol","implement TanStack AI streaming protocol","Server-side AG-UI streaming protocol implementation: StreamChunk event types (RUN_STARTED, TEXT_MESSAGE_START\u002FCONTENT\u002FEND, TOOL_CALL_START\u002FARGS\u002FEND, RUN_FINISHED, RUN_ERROR, STEP_STARTED\u002FSTEP_FINISHED, STATE_SNAPSHOT\u002FDELTA, CUSTOM), toServerSentEventsStream() for SSE format, toHttpStream() for NDJSON format. For backends serving AG-UI events without client packages.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1970,1973,1974],{"name":1971,"slug":1972,"type":15},"API Development","api-development",{"name":1960,"slug":36,"type":15},{"name":9,"slug":8,"type":15},"2026-08-05T05:32:29.24494",{"slug":1977,"name":1978,"fn":1979,"description":1980,"org":1981,"tags":1982,"stars":23,"repoUrl":24,"updatedAt":1987},"ai-corechat-experience","ai-core\u002Fchat-experience","implement chat experiences with TanStack AI","End-to-end chat implementation: server endpoint with chat() and toServerSentEventsResponse(), client-side useChat hook with fetchServerSentEvents(), message rendering with UIMessage parts, multimodal content, thinking\u002Freasoning display. Covers streaming states, connection adapters, and message format conversions. NOT Vercel AI SDK — uses chat() not streamText().\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1983,1984,1985,1986],{"name":1971,"slug":1972,"type":15},{"name":1786,"slug":1787,"type":15},{"name":1960,"slug":36,"type":15},{"name":9,"slug":8,"type":15},"2026-08-28T14:34:37.323359",{"slug":1989,"name":1990,"fn":1991,"description":1992,"org":1993,"tags":1994,"stars":23,"repoUrl":24,"updatedAt":2001},"ai-coreclient-persistence","ai-core\u002Fclient-persistence","implement browser chat persistence for TanStack AI","Browser chat persistence on useChat \u002F ChatClient: localStoragePersistence, sessionStoragePersistence, indexedDBPersistence. Client-authoritative (adapter, full transcript) vs server-authoritative (persistence: true, no client cache). Reload restore, pending interrupts, mid-stream rejoin with delivery durability. Use for SPA reload durability — NOT server history alone. Also covers generation hooks (useGenerateImage etc.), which take only the server-driven mode: persistence: true hydrates the last generation for the (REQUIRED) threadId from the server on mount and repaints status\u002Fresult\u002Ferror, nothing is cached in the browser. No extra package: the adapters ship in the framework packages.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1995,1996,1997,2000],{"name":13,"slug":14,"type":15},{"name":1786,"slug":1787,"type":15},{"name":1998,"slug":1999,"type":15},"Persistence","persistence",{"name":9,"slug":8,"type":15},"2026-08-05T05:32:40.196929",{"slug":2003,"name":2004,"fn":2005,"description":2006,"org":2007,"tags":2008,"stars":23,"repoUrl":24,"updatedAt":2015},"ai-corecustom-backend-integration","ai-core\u002Fcustom-backend-integration","integrate custom backends with TanStack AI","Connect useChat to a non-TanStack-AI backend through custom connection adapters. ConnectConnectionAdapter (single async iterable) vs SubscribeConnectionAdapter (separate subscribe\u002Fsend). Customize fetchServerSentEvents() and fetchHttpStream() with auth headers, custom URLs, and request options. Import from framework package, not @tanstack\u002Fai-client.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2009,2010,2011,2014],{"name":13,"slug":14,"type":15},{"name":1971,"slug":1972,"type":15},{"name":2012,"slug":2013,"type":15},"Backend","backend",{"name":9,"slug":8,"type":15},"2026-08-05T05:32:38.033904",29]