diff --git a/.changeset/bright-urls-redirect.md b/.changeset/bright-urls-redirect.md
new file mode 100644
index 00000000..17f0470c
--- /dev/null
+++ b/.changeset/bright-urls-redirect.md
@@ -0,0 +1,5 @@
+---
+'@agentskit/integrations': patch
+---
+
+Point the package homepage and README at the canonical integration guide and preserve the legacy docs URL with a direct redirect.
diff --git a/.changeset/quiet-errors-guide.md b/.changeset/quiet-errors-guide.md
new file mode 100644
index 00000000..78fae9f6
--- /dev/null
+++ b/.changeset/quiet-errors-guide.md
@@ -0,0 +1,6 @@
+---
+'@agentskit/core': patch
+'@agentskit/rag': patch
+---
+
+Point built-in and RAG errors at canonical documentation routes, and align the package and site usage guides with the current public contracts.
diff --git a/.changeset/tidy-vectra-peer.md b/.changeset/tidy-vectra-peer.md
new file mode 100644
index 00000000..151e3f50
--- /dev/null
+++ b/.changeset/tidy-vectra-peer.md
@@ -0,0 +1,5 @@
+---
+'@agentskit/memory': patch
+---
+
+Declare Vectra as an optional peer dependency for the on-disk vector memory backend.
diff --git a/.doc-bridge/capabilities.json b/.doc-bridge/capabilities.json
index 9344a8a0..3dd27305 100644
--- a/.doc-bridge/capabilities.json
+++ b/.doc-bridge/capabilities.json
@@ -7,7 +7,7 @@
"name": "AgentsKit",
"root": "."
},
- "contentHash": "4b8372dc800cc78266ddc77be7184f5451bcfa6a91c36f3ef631f6119733c5e6",
+ "contentHash": "cfa57ad9da1ec022f65144e749091be3fc89d27a360a3c580ab4f3c0658145b2",
"artifacts": {
"index": ".doc-bridge/index.json",
"llmsTxt": "llms.txt"
diff --git a/.doc-bridge/index.json b/.doc-bridge/index.json
index 3e94a918..50183382 100644
--- a/.doc-bridge/index.json
+++ b/.doc-bridge/index.json
@@ -1,8 +1,8 @@
{
"schemaVersion": 1,
- "contentHash": "4b8372dc800cc78266ddc77be7184f5451bcfa6a91c36f3ef631f6119733c5e6",
+ "contentHash": "cfa57ad9da1ec022f65144e749091be3fc89d27a360a3c580ab4f3c0658145b2",
"contentHashAlgo": "sha256-normalized-v1",
- "generatedAt": "2026-08-13T01:23:01.529Z",
+ "generatedAt": "2026-08-13T02:11:22.456Z",
"project": {
"name": "AgentsKit",
"root": "."
@@ -89,7 +89,7 @@
"type": "agent-doc",
"title": "memory",
"path": "apps/docs-next/content/docs/for-agents/memory.mdx",
- "body": "Install Primary exports Chat memory (ordered history) - fileChatMemory({ path }) — JSON file. - sqliteChatMemory — SQLite-backed. - redisChatMemory — Redis-backed. - tursoChatMemory — Turso / libSQL. - createWebStorageMemory from @agentskit/memory/web-storage — injected, SSR-safe localStorage / sessionStorage with runtime validation, byte/message bounds, cancellation, and host-owned legacy migration. Vector memory - fileVectorMemory({ path }) — JSON file. - redisVectorMemory — Redis Vector. - pgvector , pinecone , qdrant , chroma , upstashVector — BYO-client / HTTP vector adapters. See . - supabaseVectorStore , weaviateVectorStore , milvusVectorStore , mongoAtlasVectorStore — managed / cluster backends. - matchesFilter(record, filter) — utility for evaluating vector-store filter predicates outside an adapter. Higher-order memory - createVirtualizedMemory (from @agentskit/core ) — hot window + cold retriever. - createHierarchicalMemory — MemGPT tiers (working / recall / archival). - createAutoSummarizingMemory (from @agentskit/core/auto-summarize ) — fold oldest into a summary. - createEncryptedMemory — AES-GCM over any ChatMemory . See . - createInMemoryGraph — knowledge graph (nodes + edges + BFS). See . - createInMemoryPersonalization + renderProfileContext — per-subject profile. See . - wrapChatMemoryWithRedaction(mem, { rules, mode?, vault?, allowedRoles? }) — redact (or tokenize) PII at save() time on any ChatMemory . Pairs with @agentskit/core/security tokenize / reveal for role-gated read. - wrapVectorMemoryWithRedaction(mem, { rules, mode?, vault?, allowedRoles? }) — same for VectorMemory.store() . Embeddings pass through verbatim; redact the input to your embedder separately if it is a hosted provider. - forgetSubject(memory, subjectId) / makeForgettable(memory) — GDPR-style right-to-erasure helpers that purge all records for a subject across ChatMemory and VectorMemory . Key-value store ( AgentskitMemoryStore ) A generic get(key) / set(key,value) store with TTL + max-key eviction, complementing the conversation ChatMemory model — for agent scratchpad, pipeline state, and arbitrary JSON keyed by string. - createInMemoryStore(config) / createFileStore(config) / createLocalStorageStore({ config, storage? }) — zero-dependency backends. - createSqliteStore({ config, open }) — open is a better-sqlite3-style opener; tryDefaultSqliteOpener() lazy-imports better-sqlite3 . - createRedisStore({ config, client }) — client is a RedisLike ; adaptIoredis(io) bridges ioredis, tryDefaultRedisClient(url) lazy-imports node-redis. - createVectorStore({ config, vectorStore, embedder }) — exact-key get / set plus a recall(query, k) similarity search. - createKvMemoryFromConfig({ config, sqlite?, redis?, vectorStore?, embedder? }) / createKvMemoryFromConfigAuto(config) — dispatch over a KvMemoryConfig ( in-memory / file / sqlite / localstorage / redis / vector ); the auto form lazy-loads optional drivers. MEMORY BACKEND SUPPORT / isMemoryBackendSupported / MemoryBackendNotImplementedError describe coverage. Minimal example Related - — embedders + retrievers on top of vector memory. - — the ChatMemory / VectorMemory contracts. Source - npm: https://www.npmjs.com/package/@agentskit/memory - repo: https://github.com/AgentsKit-io/agentskit/tree/main/packages/memory"
+ "body": "Install Primary exports Chat memory (ordered history) - fileChatMemory({ path }) — JSON file. - sqliteChatMemory — SQLite-backed. - redisChatMemory — Redis-backed. - tursoChatMemory — Turso / libSQL. - createWebStorageMemory from @agentskit/memory/web-storage — injected, SSR-safe localStorage / sessionStorage with runtime validation, byte/message bounds, cancellation, and host-owned legacy migration. Vector memory - fileVectorMemory({ path }) — Vectra-backed index directory (optional vectra peer). - redisVectorMemory — Redis Vector. - pgvector , pinecone , qdrant , chroma , upstashVector — BYO-client / HTTP vector adapters. See . - supabaseVectorStore , weaviateVectorStore , milvusVectorStore , mongoAtlasVectorStore — managed / cluster backends. - matchesFilter(record, filter) — utility for evaluating vector-store filter predicates outside an adapter. Higher-order memory - createVirtualizedMemory (from @agentskit/core ) — hot window + cold retriever. - createHierarchicalMemory — MemGPT tiers (working / recall / archival). - createAutoSummarizingMemory (from @agentskit/core/auto-summarize ) — fold oldest into a summary. - createEncryptedMemory — AES-GCM over any ChatMemory . See . - createInMemoryGraph — knowledge graph (nodes + edges + BFS). See . - createInMemoryPersonalization + renderProfileContext — per-subject profile. See . - wrapChatMemoryWithRedaction(mem, { rules, mode?, vault?, allowedRoles? }) — redact (or tokenize) PII at save() time on any ChatMemory . Pairs with @agentskit/core/security tokenize / reveal for role-gated read. - wrapVectorMemoryWithRedaction(mem, { rules, mode?, vault?, allowedRoles? }) — same for VectorMemory.store() . Embeddings pass through verbatim; redact the input to your embedder separately if it is a hosted provider. - forgetSubject(memory, subjectId) / makeForgettable(memory) — GDPR-style right-to-erasure helpers that purge all records for a subject across ChatMemory and VectorMemory . Key-value store ( AgentskitMemoryStore ) A generic get(key) / set(key,value) store with TTL + max-key eviction, complementing the conversation ChatMemory model — for agent scratchpad, pipeline state, and arbitrary JSON keyed by string. - createInMemoryStore(config) / createFileStore(config) / createLocalStorageStore({ config, storage? }) — zero-dependency backends. - createSqliteStore({ config, open }) — open is a better-sqlite3-style opener; tryDefaultSqliteOpener() lazy-imports better-sqlite3 . - createRedisStore({ config, client }) — client is a RedisLike ; adaptIoredis(io) bridges ioredis, tryDefaultRedisClient(url) lazy-imports node-redis. - createVectorStore({ config, vectorStore, embedder }) — exact-key get / set plus a recall(query, k) similarity search. - createKvMemoryFromConfig({ config, sqlite?, redis?, vectorStore?, embedder? }) / createKvMemoryFromConfigAuto(config) — dispatch over a KvMemoryConfig ( in-memory / file / sqlite / localstorage / redis / vector ); the auto form lazy-loads optional drivers. MEMORY BACKEND SUPPORT / isMemoryBackendSupported / MemoryBackendNotImplementedError describe coverage. Minimal example Related - — embedders + retrievers on top of vector memory. - — the ChatMemory / VectorMemory contracts. Source - npm: https://www.npmjs.com/package/@agentskit/memory - repo: https://github.com/AgentsKit-io/agentskit/tree/main/packages/memory"
},
{
"id": "observability-langfuse",
@@ -110,7 +110,7 @@
"type": "agent-doc",
"title": "rag",
"path": "apps/docs-next/content/docs/for-agents/rag.mdx",
- "body": "Install Primary exports - createRAG({ embed, store, chunkSize, chunkOverlap, topK, threshold }) — ingest(docs) + retrieve(request) + search(query) . - chunkText({ chunkSize, chunkOverlap, split }) — lower-level splitter. - createRerankedRetriever(base, { candidatePool, topK, rerank }) — pluggable reranker (BM25 default). See . - createHybridRetriever(base, { vectorWeight, bm25Weight }) — vector + BM25 hybrid. - bm25Score , bm25Rerank — standalone helpers. - voyageReranker(config) — Voyage AI reranker. - jinaReranker(config) — Jina AI reranker. - RagError / RagErrorCodes — typed error (extends AgentsKitError ) thrown by loaders + rerankers; narrow on error.code ( AK RAG LOAD FAILED , AK RAG PEER MISSING , AK RAG RERANK FAILED ). Document loaders - loadUrl , loadGitHubFile , loadGitHubTree , loadNotionPage , loadConfluencePage , loadGoogleDriveFile , loadPdf (BYO parser). See . - Cloud storage: loadS3 , loadGcs , loadDropbox , loadOneDrive . Failure and cancellation contract - Loader request, response-body, pagination, and total-download failures throw RagError with AK RAG LOAD FAILED . Tree loaders may return partial success only after at least one eligible document loaded. - Loader options accept signal?: AbortSignal ; Voyage and Jina reranker options accept the same additive field. - Notion and OneDrive follow provider pagination and reject repeated or missing continuation cursors instead of returning truncated content. - Scoreless Retriever results keep their order. If any score is present, all scores must be finite and the result is ordered descending; malformed mixed score sets throw. - Hybrid retrieval min-max normalizes candidate scores and normalizes relative weights before blending. Minimal example Related - — vector stores. - — embedders. Source - npm: https://www.npmjs.com/package/@agentskit/rag - repo: https://github.com/AgentsKit-io/agentskit/tree/main/packages/rag"
+ "body": "Install Primary exports - createRAG({ embed, store, chunkSize, chunkOverlap, topK, threshold }) — ingest(InputDocument[]) + retrieve({ query, messages }) + search(query, { topK?, threshold? }) . InputDocument uses content , not text . Chunk defaults: 512 / 50. - chunkText(text, { chunkSize, chunkOverlap, split? }) — lower-level splitter. split is (text: string) = string[] . - createRerankedRetriever(base, { candidatePool, topK, rerank }) — pluggable reranker (BM25 default). See . - createHybridRetriever(base, { vectorWeight?, bm25Weight?, topK?, candidatePool? }) — vector + BM25 hybrid; defaults to 0.6 / 0.4 , 20 candidates, and 5 results. - bm25Score , bm25Rerank — standalone helpers. - voyageReranker(config) — Voyage AI reranker. - jinaReranker(config) — Jina AI reranker. - RagError / RagErrorCodes — typed error (extends AgentsKitError ) thrown by loaders + rerankers; narrow on error.code ( AK RAG LOAD FAILED , AK RAG PEER MISSING , AK RAG RERANK FAILED ). Document loaders - loadUrl(url) — raw response text as InputDocument.content . loadGitHubFile(owner, repo, path, opts) , loadGitHubTree(owner, repo, { filter?, ... }) , loadNotionPage(pageId, { token }) , loadConfluencePage(pageId, { baseUrl, token?, authorization? }) , loadGoogleDriveFile(fileId, { accessToken }) , loadPdf(url, { parsePdf }) . All return InputDocument[] . See . - Cloud storage: loadS3 , loadGcs , loadDropbox , loadOneDrive . Failure and cancellation contract - Loader request, response-body, pagination, and total-download failures throw RagError with AK RAG LOAD FAILED . Tree loaders may return partial success only after at least one eligible document loaded. - Loader options accept signal?: AbortSignal ; Voyage and Jina reranker options accept the same additive field. - Notion and OneDrive follow provider pagination and reject repeated or missing continuation cursors instead of returning truncated content. - Scoreless Retriever results keep their order. If any score is present, all scores must be finite and the result is ordered descending; malformed mixed score sets throw. - Hybrid retrieval min-max normalizes candidate scores and normalizes relative weights before blending. Minimal example Related - — vector stores. - — embedders. Source - npm: https://www.npmjs.com/package/@agentskit/rag - repo: https://github.com/AgentsKit-io/agentskit/tree/main/packages/rag"
},
{
"id": "react-native",
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 9876d905..116894e5 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -210,7 +210,7 @@ CI runs all of these on every PR. Run them locally first to avoid burning CI min
If your change affects what a consumer sees or does:
- Update the relevant page in `apps/docs-next/content/docs/`
-- Add a recipe if you've added a new building block (`apps/docs-next/content/docs/recipes/`)
+- Add a recipe if you've added a new building block (`apps/docs-next/content/docs/reference/recipes/`)
- Update the relevant ADR if you've changed how a contract behaves (rare — usually a new ADR superseding the old one)
- Update the package's `README.md` if its public surface changed
diff --git a/README.md b/README.md
index b40f2c0f..998b7f1a 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
**The agent toolkit JavaScript actually deserves.**
-A 10 KB core budget. Twenty-five focused packages. Zero lock-in. Six formal contracts that make every adapter, tool, skill, memory, retriever, and runtime substitutable.
+A 10 KB core budget. Twenty-two published packages. Zero lock-in. Six formal contracts that make every adapter, tool, skill, memory, retriever, and runtime substitutable.
[](https://www.npmjs.com/package/@agentskit/react)
[](https://bundlephobia.com/package/@agentskit/react)
@@ -394,7 +394,7 @@ See the [stability policy](./docs/STABILITY.md), [core v1 release notes](./docs/
AgentsKit is built in the open and ships because contributors show up. Every package, every doc, every example is fair game.
-- **[How to contribute →](https://www.agentskit.io/docs/contribute)** — start here
+- **[How to contribute →](https://www.agentskit.io/docs/reference/contribute)** — start here
- **[Public roadmap board](https://github.com/orgs/AgentsKit-io/projects/1)** — what's planned, in flight, and shipped
- **[Good-first-issues](https://github.com/AgentsKit-io/agentskit/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)** — curated, tractable tickets
- **[Help-wanted](https://github.com/AgentsKit-io/agentskit/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22)** — larger scoped work
diff --git a/apps/docs-next/README.md b/apps/docs-next/README.md
index 00ca2476..7d637a98 100644
--- a/apps/docs-next/README.md
+++ b/apps/docs-next/README.md
@@ -43,27 +43,23 @@ See [CONTRIBUTING.md](../../CONTRIBUTING.md) and [LICENSE](../../LICENSE).
Profile: public-app
-**Spike**: Fumadocs-based documentation site, evaluated as the replacement for the existing Docusaurus app at `apps/docs`.
-
-Tracked by [#238](https://github.com/AgentsKit-io/agentskit/issues/238) in the Phase 0 roadmap.
+Canonical Fumadocs-based documentation site for the AgentsKit package contracts,
+usage guides, recipes, integrations, and ecosystem hubs. The legacy Docusaurus
+app at `apps/docs` is being retired; keep new public documentation here.
## What's here
-A minimal but real Fumadocs site demonstrating:
+The app provides:
- Next.js 16 app router with Fumadocs UI 16.x and Fumadocs MDX 14.x
-- Home page (`app/(home)/page.tsx`) with hero + 3-feature grid
+- Home, ecosystem, integrations, recipes, publications, and resources hubs
- Docs shell (`app/docs/layout.tsx`) with Fumadocs sidebar and search
- Catch-all docs page renderer (`app/docs/[[...slug]]/page.tsx`)
-- Search API (`app/api/search/route.ts`)
-- Real content: `index`, `getting-started/quickstart`, `getting-started/installation`, `concepts/mental-model`, plus 6 concept stub pages
+- Search API (`app/api/search/route.ts`) plus `llms.txt`, sitemap, canonical metadata, and JSON-LD
+- 400+ maintained MDX pages, including package guides, for-agents handoffs, recipes, and provider/integration references
Tailwind v4 + `fumadocs-ui/css/preset.css` + neutral theme.
-## Why parallel to `apps/docs`
-
-Spike, not migration. The existing Docusaurus site keeps serving traffic at the current URL. Once this Fumadocs spike is approved, a follow-up PR migrates remaining content and the `apps/docs` directory is replaced.
-
## Run locally
```bash
@@ -79,30 +75,15 @@ pnpm --filter @agentskit/docs-next build
pnpm --filter @agentskit/docs-next start
```
-## Decision criteria for migration
-
-Compare against `apps/docs` (Docusaurus):
-
-| Criteria | Docusaurus | Fumadocs (this) |
-| --- | --- | --- |
-| Tech stack | React + custom build | Next.js 16 + Tailwind v4 |
-| MDX rendering | OK | Excellent (server components, streaming) |
-| Visual polish out-of-box | Generic | Modern, opinionated |
-| Search | Algolia (paid for OSS via partner) | Built-in (Fumadocs `createFromSource`) |
-| Customization | CSS hacks | Tailwind + React, native |
-| Deploy target | Static (anywhere) | Vercel/Cloudflare Pages (Next.js-native) |
-| i18n | Mature plugin | DIY (acceptable trade) |
-| Build speed | Slow on big sites | Fast (Next.js + Turbopack) |
-| Node 25 compat | Currently broken on `main` | Works |
-
-## Next steps if approved
+## Maintainer checks
-1. Port remaining sections from `apps/docs` (adapters, agents, chat-uis, components, data-layer, examples, hooks, infrastructure, packages, theming, contributing)
-2. Decide i18n strategy (Crowdin? freeze pt-BR/es/zh-Hans until EN stabilizes?)
-3. Set up `docs.agentskit.io` deployment on Vercel
-4. Archive `apps/docs`
-5. Add chat-with-docs (RAG over the docs themselves) — dogfooding moment
+- `pnpm --filter @agentskit/docs-next lint:mdx` validates the MDX surface.
+- `pnpm --filter @agentskit/docs-next check:links` validates internal references.
+- `pnpm docs:build` runs the production build from the repository root.
+- Keep package READMEs, `/docs/reference/packages`, and `/docs/for-agents` aligned when an API changes.
## Status
-Not wired into root `pnpm dev` / `pnpm build` yet — install + run manually until the approach is approved. See PR description.
+The app is maintained as the canonical docs surface and is available through the
+root `pnpm docs` / `pnpm docs:build` scripts. Deployment remains an explicit
+release action; local documentation changes do not publish automatically.
diff --git a/apps/docs-next/app/(home)/page.tsx b/apps/docs-next/app/(home)/page.tsx
index 7f2ae30a..21799589 100644
--- a/apps/docs-next/app/(home)/page.tsx
+++ b/apps/docs-next/app/(home)/page.tsx
@@ -17,7 +17,7 @@ import { alternatesFor } from '@/lib/locales'
import softwareIdentity from '@/lib/software-identity.generated.json'
export const metadata = {
- title: `${agentsKitIdentity.name}.js — ${agentsKitIdentity.promise}`,
+ title: 'TypeScript AI agent framework',
description: `${agentsKitIdentity.promise} A composable TypeScript foundation for runtime, tools, memory, RAG, and chat interfaces.`,
alternates: {
canonical: canonicalUrl('/'),
@@ -131,6 +131,16 @@ function Hero() {
Built for {agentsKitIdentity.audience}
+
+ {agentsKitIdentity.role}
+ ·
+ {agentsKitIdentity.maturity}
+ {agentsKitIdentity.proof.length > 0 && (
+
+ {agentsKitIdentity.proof.map((claim) => `${claim.value} ${claim.noun}`).join(' · ')}
+
+ )}
+
diff --git a/apps/docs-next/app/ecosystem/page.tsx b/apps/docs-next/app/ecosystem/page.tsx
index 7d044307..5b8cc294 100644
--- a/apps/docs-next/app/ecosystem/page.tsx
+++ b/apps/docs-next/app/ecosystem/page.tsx
@@ -36,9 +36,22 @@ function accessLabel(accessModel: string): string {
const ECOSYSTEM_JSON_LD = {
'@context': 'https://schema.org',
'@type': 'ItemList',
- '@id': 'https://www.agentskit.io/ecosystem#products',
+ '@id': `${canonicalUrl('/ecosystem')}#products`,
+ url: canonicalUrl('/ecosystem'),
name: 'AgentsKit ecosystem',
description: `${ecosystem.positioning.canonicalDescription} ${ecosystem.positioning.commercialBoundary}`,
+ isPartOf: {
+ '@type': 'WebSite',
+ name: 'AgentsKit.js',
+ url: canonicalUrl('/'),
+ },
+ breadcrumb: {
+ '@type': 'BreadcrumbList',
+ itemListElement: [
+ { '@type': 'ListItem', position: 1, name: 'Home', url: canonicalUrl('/') },
+ { '@type': 'ListItem', position: 2, name: 'Ecosystem', url: canonicalUrl('/ecosystem') },
+ ],
+ },
numberOfItems: ecosystem.products.length,
itemListElement: ecosystem.products.map((product, index) => ({
'@type': 'ListItem',
diff --git a/apps/docs-next/app/integrations/layout.tsx b/apps/docs-next/app/integrations/layout.tsx
new file mode 100644
index 00000000..a7828a39
--- /dev/null
+++ b/apps/docs-next/app/integrations/layout.tsx
@@ -0,0 +1,7 @@
+import { HomeLayout } from 'fumadocs-ui/layouts/home'
+import type { ReactNode } from 'react'
+import { baseOptions } from '../layout.config'
+
+export default function IntegrationsLayout({ children }: { children: ReactNode }) {
+ return
{children}
+}
diff --git a/apps/docs-next/app/integrations/page.tsx b/apps/docs-next/app/integrations/page.tsx
new file mode 100644
index 00000000..ec0b5df6
--- /dev/null
+++ b/apps/docs-next/app/integrations/page.tsx
@@ -0,0 +1,149 @@
+import type { Metadata } from 'next'
+import Link from 'next/link'
+import { JsonLd } from '@/components/seo/json-ld'
+import { canonicalUrl } from '@/lib/canonical-url'
+import { lists } from '@/lib/ecosystem-stats'
+import { source } from '@/lib/source'
+
+const DESCRIPTION =
+ '50-service integration catalog for TypeScript AI agents: GitHub, Slack, Stripe, Postgres, Gmail, Notion, and more with one tool contract.'
+const URL = canonicalUrl('/integrations')
+const PREFIX = 'agents/tools/integrations'
+
+export const metadata: Metadata = {
+ title: 'AI agent integrations for TypeScript',
+ description: DESCRIPTION,
+ alternates: { canonical: URL },
+}
+
+function integrations() {
+ return source
+ .getPages()
+ .filter((page) => page.slugs.length === 4 && page.slugs.slice(0, 3).join('/') === PREFIX)
+ .sort((a, b) => a.data.title.localeCompare(b.data.title))
+ .map((page) => ({
+ href: page.url,
+ slug: page.slugs[3],
+ title: page.data.title,
+ description: page.data.description ?? 'A verified AgentsKit tool integration.',
+ }))
+}
+
+export default function IntegrationsPage() {
+ const entries = integrations()
+ const guidesBySlug = new Map(entries.map((entry) => [entry.slug, entry]))
+ const catalog = lists.integrations.map((slug) => ({ slug, guide: guidesBySlug.get(slug) }))
+ const catalogGuideCount = catalog.filter((entry) => entry.guide).length
+ const structuredData = {
+ '@context': 'https://schema.org',
+ '@type': 'CollectionPage',
+ '@id': `${URL}#collection`,
+ url: URL,
+ name: 'AgentsKit integrations',
+ description: DESCRIPTION,
+ isPartOf: { '@type': 'WebSite', name: 'AgentsKit.js', url: canonicalUrl('/') },
+ breadcrumb: {
+ '@type': 'BreadcrumbList',
+ itemListElement: [
+ { '@type': 'ListItem', position: 1, name: 'Home', url: canonicalUrl('/') },
+ { '@type': 'ListItem', position: 2, name: 'Integrations', url: canonicalUrl('/integrations') },
+ ],
+ },
+ mainEntity: {
+ '@type': 'ItemList',
+ name: 'AgentsKit documented integration guides',
+ numberOfItems: entries.length,
+ itemListElement: entries.map((entry, index) => ({
+ '@type': 'ListItem',
+ position: index + 1,
+ item: {
+ '@type': 'TechArticle',
+ name: entry.title,
+ description: entry.description,
+ url: canonicalUrl(entry.href),
+ },
+ })),
+ },
+ additionalProperty: [
+ {
+ '@type': 'PropertyValue',
+ name: 'catalogServiceCount',
+ value: catalog.length,
+ },
+ {
+ '@type': 'PropertyValue',
+ name: 'documentedGuideCount',
+ value: catalogGuideCount,
+ },
+ ],
+ }
+
+ return (
+
+
+
+ /integrations
+
+ AI agent integrations for TypeScript
+
+
+ Connect an agent to the services it already uses. Each integration follows the same install, config, and
+ execute contract, with the implementation details kept on its canonical documentation page.
+
+
+ {catalog.length} catalog services · {catalogGuideCount} dedicated guides ·{' '}
+
+ integration package contract
+ {' '}
+ ·
+ tool contract
+ {' '}
+ ·
+ author your own
+
+
+
+
+
+ {entries.map((entry) => (
+
+
+
+ {entry.title}
+
+ {entry.description}
+ Read integration →
+
+
+ ))}
+
+
+
+
+ Canonical service catalog
+
+
+ The count below is generated from @agentskit/integrations. A linked
+ name has a dedicated guide on this site; an unlinked name is a catalog descriptor covered by the package
+ contract above, not an invented documentation page.
+
+
+ {catalog.map(({ slug, guide }) => (
+
+ {guide ? (
+
+ {slug}
+
+ ) : (
+ {slug}
+ )}
+
+ ))}
+
+
+
+ )
+}
diff --git a/apps/docs-next/app/layout.config.tsx b/apps/docs-next/app/layout.config.tsx
index cb56d733..3b5c0456 100644
--- a/apps/docs-next/app/layout.config.tsx
+++ b/apps/docs-next/app/layout.config.tsx
@@ -37,6 +37,9 @@ export const baseOptions: BaseLayoutProps = {
text: 'Resources',
items: [
{ text: 'Ecosystem resources', url: '/resources' },
+ { text: 'Integrations', url: '/integrations' },
+ { text: 'Recipes', url: '/recipes' },
+ { text: 'Publications', url: '/publications' },
{ text: 'Examples', url: '/docs/reference/examples' },
{ text: 'Learn', url: '/learn' },
{ text: 'Stack builder', url: '/stack' },
diff --git a/apps/docs-next/app/llms.txt/route.ts b/apps/docs-next/app/llms.txt/route.ts
index 56a70947..321223d2 100644
--- a/apps/docs-next/app/llms.txt/route.ts
+++ b/apps/docs-next/app/llms.txt/route.ts
@@ -85,6 +85,10 @@ export function GET() {
lines.push('## Optional')
lines.push('')
+ lines.push(`- [Ecosystem hub](${SITE}/ecosystem): canonical product mesh and package matrix`)
+ lines.push(`- [Integrations hub](${SITE}/integrations): verified connectors for TypeScript AI agents`)
+ lines.push(`- [Recipes hub](${SITE}/recipes): copy-paste implementation patterns for production agents`)
+ lines.push(`- [Publications hub](${SITE}/publications): first-party releases and engineering deep dives`)
lines.push(`- [Ecosystem resources](${SITE}/resources): verified tools, MCP registries, publications, directories, trust signals, and contributor surfaces`)
lines.push(`- [Public resources JSON](${SITE}/resources.json): machine-readable projection of the curated resource catalog`)
lines.push(`- [Full markdown index](${SITE}/llms-full.txt): complete text of every docs page in one file`)
diff --git a/apps/docs-next/app/publications/layout.tsx b/apps/docs-next/app/publications/layout.tsx
new file mode 100644
index 00000000..fc563755
--- /dev/null
+++ b/apps/docs-next/app/publications/layout.tsx
@@ -0,0 +1,7 @@
+import { HomeLayout } from 'fumadocs-ui/layouts/home'
+import type { ReactNode } from 'react'
+import { baseOptions } from '../layout.config'
+
+export default function PublicationsLayout({ children }: { children: ReactNode }) {
+ return
{children}
+}
diff --git a/apps/docs-next/app/publications/page.tsx b/apps/docs-next/app/publications/page.tsx
new file mode 100644
index 00000000..6b1d62a0
--- /dev/null
+++ b/apps/docs-next/app/publications/page.tsx
@@ -0,0 +1,108 @@
+import type { Metadata } from 'next'
+import Link from 'next/link'
+import { JsonLd } from '@/components/seo/json-ld'
+import { allBlogPosts, slugOf } from '@/lib/blog'
+import { canonicalUrl } from '@/lib/canonical-url'
+
+const DESCRIPTION =
+ 'Canonical AgentsKit technical publications: releases, design decisions, and engineering deep dives from the team.'
+const URL = canonicalUrl('/publications')
+
+export const metadata: Metadata = {
+ title: 'AgentsKit technical publications',
+ description: DESCRIPTION,
+ alternates: { canonical: URL },
+}
+
+function formatDate(date: string): string {
+ return new Date(`${date}T00:00:00Z`).toLocaleDateString('en-US', {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ })
+}
+
+export default function PublicationsPage() {
+ const posts = allBlogPosts()
+ const structuredData = {
+ '@context': 'https://schema.org',
+ '@type': 'CollectionPage',
+ '@id': `${URL}#collection`,
+ url: URL,
+ name: 'AgentsKit technical publications',
+ description: DESCRIPTION,
+ isPartOf: { '@type': 'WebSite', name: 'AgentsKit.js', url: canonicalUrl('/') },
+ breadcrumb: {
+ '@type': 'BreadcrumbList',
+ itemListElement: [
+ { '@type': 'ListItem', position: 1, name: 'Home', url: canonicalUrl('/') },
+ { '@type': 'ListItem', position: 2, name: 'Publications', url: canonicalUrl('/publications') },
+ ],
+ },
+ mainEntity: {
+ '@type': 'ItemList',
+ name: 'AgentsKit publications',
+ numberOfItems: posts.length,
+ itemListElement: posts.map((post, index) => ({
+ '@type': 'ListItem',
+ position: index + 1,
+ item: {
+ '@type': 'TechArticle',
+ headline: post.title,
+ description: post.description,
+ datePublished: post.date,
+ author: { '@type': 'Person', name: post.author },
+ url: canonicalUrl(`/blog/${slugOf(post)}`),
+ },
+ })),
+ },
+ }
+
+ return (
+
+
+
+ /publications
+
+ Technical publications
+
+ {DESCRIPTION}
+
+ First-party writing lives here. For independently published profiles, registries, and trust evidence, use{' '}
+
+ the verified resources index
+
+ .
+
+
+
+
+
+ )
+}
diff --git a/apps/docs-next/app/recipes/layout.tsx b/apps/docs-next/app/recipes/layout.tsx
new file mode 100644
index 00000000..1b1d808f
--- /dev/null
+++ b/apps/docs-next/app/recipes/layout.tsx
@@ -0,0 +1,7 @@
+import { HomeLayout } from 'fumadocs-ui/layouts/home'
+import type { ReactNode } from 'react'
+import { baseOptions } from '../layout.config'
+
+export default function RecipesLayout({ children }: { children: ReactNode }) {
+ return
{children}
+}
diff --git a/apps/docs-next/app/recipes/page.tsx b/apps/docs-next/app/recipes/page.tsx
new file mode 100644
index 00000000..983c7ce2
--- /dev/null
+++ b/apps/docs-next/app/recipes/page.tsx
@@ -0,0 +1,104 @@
+import type { Metadata } from 'next'
+import Link from 'next/link'
+import { JsonLd } from '@/components/seo/json-ld'
+import { canonicalUrl } from '@/lib/canonical-url'
+import { source } from '@/lib/source'
+
+const DESCRIPTION =
+ 'Copy-paste TypeScript recipes for AI agents: provider swaps, RAG, memory, tools, MCP, multi-agent workflows, security, and evals.'
+const URL = canonicalUrl('/recipes')
+const PREFIX = 'reference/recipes'
+
+export const metadata: Metadata = {
+ title: 'AI agent recipes for TypeScript',
+ description: DESCRIPTION,
+ alternates: { canonical: URL },
+}
+
+function recipes() {
+ return source
+ .getPages()
+ .filter((page) => page.slugs.length === 3 && page.slugs.slice(0, 2).join('/') === PREFIX)
+ .sort((a, b) => a.data.title.localeCompare(b.data.title))
+ .map((page) => ({
+ href: page.url,
+ title: page.data.title,
+ description: page.data.description ?? 'A standalone AgentsKit implementation recipe.',
+ }))
+}
+
+export default function RecipesPage() {
+ const entries = recipes()
+ const structuredData = {
+ '@context': 'https://schema.org',
+ '@type': 'CollectionPage',
+ '@id': `${URL}#collection`,
+ url: URL,
+ name: 'AgentsKit recipes',
+ description: DESCRIPTION,
+ isPartOf: { '@type': 'WebSite', name: 'AgentsKit.js', url: canonicalUrl('/') },
+ breadcrumb: {
+ '@type': 'BreadcrumbList',
+ itemListElement: [
+ { '@type': 'ListItem', position: 1, name: 'Home', url: canonicalUrl('/') },
+ { '@type': 'ListItem', position: 2, name: 'Recipes', url: canonicalUrl('/recipes') },
+ ],
+ },
+ mainEntity: {
+ '@type': 'ItemList',
+ name: 'AgentsKit implementation recipes',
+ numberOfItems: entries.length,
+ itemListElement: entries.map((entry, index) => ({
+ '@type': 'ListItem',
+ position: index + 1,
+ item: {
+ '@type': 'TechArticle',
+ name: entry.title,
+ description: entry.description,
+ url: canonicalUrl(entry.href),
+ },
+ })),
+ },
+ }
+
+ return (
+
+
+
+ /recipes
+
+ AI agent recipes for TypeScript
+
+
+ Small, end-to-end solutions for the moments that make an agent production-ready. Pick a recipe, copy the
+ code, and keep the underlying package contracts visible.
+
+
+ {entries.length} standalone recipes ·
+ full reference
+ {' '}
+ ·
+ choose a use case
+
+
+
+
+
+ {entries.map((entry) => (
+
+
+
+ {entry.title}
+
+ {entry.description}
+ Open recipe →
+
+
+ ))}
+
+
+ )
+}
diff --git a/apps/docs-next/app/resources/page.tsx b/apps/docs-next/app/resources/page.tsx
index 364217a1..899b0f9b 100644
--- a/apps/docs-next/app/resources/page.tsx
+++ b/apps/docs-next/app/resources/page.tsx
@@ -37,7 +37,7 @@ const RESOURCE_LABELS: Record
({
url: `${SITE}/blog/${slug}`,
- lastModified: now,
changeFrequency: 'monthly' as const,
priority: 0.6,
})),
...STEPS.map((s) => ({
url: `${SITE}/learn/${s.slug}`,
- lastModified: now,
changeFrequency: 'weekly' as const,
priority: 0.7,
})),
...SHOWCASE.map((s) => ({
url: `${SITE}/showcase/${s.slug}`,
- lastModified: now,
changeFrequency: 'monthly' as const,
priority: 0.6,
})),
@@ -58,7 +57,6 @@ export default function sitemap(): MetadataRoute.Sitemap {
const url = slug ? `${SITE}/docs/${slug}` : `${SITE}/docs`
return {
url,
- lastModified: now,
changeFrequency: 'weekly',
priority: priorityFor(slug),
}
diff --git a/apps/docs-next/content/docs/agents/hitl.mdx b/apps/docs-next/content/docs/agents/hitl.mdx
index 14021a99..f5e9bdbf 100644
--- a/apps/docs-next/content/docs/agents/hitl.mdx
+++ b/apps/docs-next/content/docs/agents/hitl.mdx
@@ -1,8 +1,11 @@
---
-title: Human-in-the-loop
-description: Gate tool calls behind approval. Surface reviews to humans before execution.
+title: Human-in-the-loop patterns for AI agents
+description: 'Practical approval patterns for TypeScript AI agents: gated tool calls, review queues, approver policies, and safe resume flows.'
---
+This page is the canonical guide to human-in-the-loop approval patterns for TypeScript AI agents.
+For a copy-paste recipe and UI wiring, see [HITL approvals](/docs/reference/recipes/hitl-approvals) and [ToolConfirmation](/docs/ui/tool-confirmation).
+
## Gate a tool
```ts
diff --git a/apps/docs-next/content/docs/agents/skills/index.mdx b/apps/docs-next/content/docs/agents/skills/index.mdx
index f5d389b6..d2fa4e00 100644
--- a/apps/docs-next/content/docs/agents/skills/index.mdx
+++ b/apps/docs-next/content/docs/agents/skills/index.mdx
@@ -27,7 +27,7 @@ Skills with built-in refusal contracts for high-stakes use cases:
- Semver range syntax: `1.2.3` / `^` / `~` / `>=` / `*`.
- [Recipe: Skill marketplace](/docs/reference/recipes/skill-marketplace).
-*Per-skill + marketplace deep dives land in step 6 of the docs IA rollout.*
+Skill guides are linked throughout this section; use the [skill marketplace recipe](/docs/reference/recipes/skill-marketplace) for installation and versioning.
## Related
diff --git a/apps/docs-next/content/docs/agents/skills/summarizer.mdx b/apps/docs-next/content/docs/agents/skills/summarizer.mdx
index 5be54575..7cebdd3e 100644
--- a/apps/docs-next/content/docs/agents/skills/summarizer.mdx
+++ b/apps/docs-next/content/docs/agents/skills/summarizer.mdx
@@ -4,6 +4,7 @@ description: Compresses long inputs into short, faithful summaries. Length-aware
---
```ts
+import { createRuntime } from '@agentskit/runtime'
import { summarizer } from '@agentskit/skills'
const runtime = createRuntime({
@@ -31,12 +32,30 @@ await runtime.run('Summarize this 40-page PDF into 10 bullets.')
Use alongside `createAutoSummarizingMemory` to fold old turns automatically:
```ts
-import { createAutoSummarizingMemory } from '@agentskit/memory'
+import { createAutoSummarizingMemory } from '@agentskit/core/auto-summarize'
+import { createInMemoryMemory } from '@agentskit/core'
+import { createRuntime } from '@agentskit/runtime'
-const memory = createAutoSummarizingMemory({
- summarize: async (msgs) => runtime.run({ input: msgs, skill: summarizer }),
- triggerAt: 30,
- keep: 10,
+const summaryRuntime = createRuntime({
+ adapter,
+ systemPrompt: 'Summarize the following chat transcript in 3 bullet points.',
+ maxTokens: 512,
+})
+
+const memory = createAutoSummarizingMemory(createInMemoryMemory(), {
+ maxTokens: 8_000,
+ keepRecent: 10,
+ summarizer: async msgs => {
+ const src = msgs.map(m => `${m.role}: ${m.content}`).join('\n')
+ const result = await summaryRuntime.run(src)
+ return {
+ id: crypto.randomUUID(),
+ role: 'system',
+ content: result.content,
+ status: 'complete',
+ createdAt: new Date(),
+ }
+ },
})
```
diff --git a/apps/docs-next/content/docs/agents/tools/index.mdx b/apps/docs-next/content/docs/agents/tools/index.mdx
index 080275c9..633605ef 100644
--- a/apps/docs-next/content/docs/agents/tools/index.mdx
+++ b/apps/docs-next/content/docs/agents/tools/index.mdx
@@ -1,6 +1,6 @@
---
-title: Tools
-description: Every function the agent can call. Built-ins, integrations, MCP bridge, composers.
+title: AI agent tools for TypeScript
+description: 'Tools for TypeScript AI agents: built-ins, integrations, MCP, and composers in @agentskit/tools.'
---
## Authoring
@@ -31,7 +31,7 @@ Browser: `browserAgent`
- `createMcpServer` — publish AgentsKit tools to any MCP host.
- [Recipe: MCP bridge](/docs/reference/recipes/mcp-bridge).
-*Per-integration pages + authoring deep dives land in step 6 of the docs IA rollout.*
+Use the [canonical integration catalog](https://www.agentskit.io/integrations) to browse all 50 service descriptors, or read the [integration package contract](/docs/for-agents/integrations) before implementing a connector. Dedicated service guides are linked from the catalog where available.
## Related
diff --git a/apps/docs-next/content/docs/agents/tools/integrations/index.mdx b/apps/docs-next/content/docs/agents/tools/integrations/index.mdx
index 5d8c4a06..70f6fe2b 100644
--- a/apps/docs-next/content/docs/agents/tools/integrations/index.mdx
+++ b/apps/docs-next/content/docs/agents/tools/integrations/index.mdx
@@ -1,8 +1,13 @@
---
-title: Integrations
-description: 50 verified connectors for the services agents actually need. Each follows the same contract — install, config, execute — and ships granular sub-tools alongside a bundled set.
+title: AI agent integrations for TypeScript
+description: '50-service catalog for TypeScript AI agents. Dedicated guides, package contracts, and compatibility notes for tools, connectors, and triggers.'
---
+The canonical `@agentskit/integrations` package contains **50 service descriptors**. This page covers the detailed
+guides available in the tools documentation; the [for-agents package guide](/docs/for-agents/integrations) describes
+the full descriptor registry and projection contract. The top-level [integrations hub](https://www.agentskit.io/integrations) keeps both
+surfaces discoverable without creating placeholder pages for services that do not yet have a dedicated guide.
+
## Categories
| Category | Integrations |
diff --git a/apps/docs-next/content/docs/cookbook/error-boundary.mdx b/apps/docs-next/content/docs/cookbook/error-boundary.mdx
index 89765ae0..ff885ab3 100644
--- a/apps/docs-next/content/docs/cookbook/error-boundary.mdx
+++ b/apps/docs-next/content/docs/cookbook/error-boundary.mdx
@@ -5,8 +5,11 @@ description: Surface LLM and tool errors without crashing the UI or silently hid
Agents fail in interesting ways: timeouts, malformed tool args, provider outages, budget exceeded. Show the user something useful instead of a spinning loader that never ends.
+`useChat` exposes `error: Error | null`. There is no `ChatError` type — narrow with `AgentsKitError` and `ErrorCodes`.
+
```tsx
-import { useChat, type ChatError } from '@agentskit/react'
+import { useChat } from '@agentskit/react'
+import { AgentsKitError, ErrorCodes } from '@agentskit/core'
export function Chat() {
const { messages, error, retry } = useChat({ adapter })
@@ -21,14 +24,19 @@ export function Chat() {
)
}
-function ErrorBox({ error, onRetry }: { error: ChatError; onRetry: () => void }) {
- if (error.code === 'budget_exceeded') {
- return You hit your daily token limit. Resets at midnight UTC.
- }
- if (error.code === 'tool_failed') {
+function ErrorBox({ error, onRetry }: { error: Error; onRetry: () => void }) {
+ if (error instanceof AgentsKitError) {
+ if (error.code === ErrorCodes.AK_TOOL_EXEC_FAILED) {
+ return (
+
+ A tool couldn't run. {error.hint ?? error.message}{' '}
+ Try again
+
+ )
+ }
return (
- Action {error.toolName} couldn't run. Try again
+ {error.message} Retry
)
}
@@ -37,5 +45,5 @@ function ErrorBox({ error, onRetry }: { error: ChatError; onRetry: () => void })
```
-`ChatError` is a **discriminated union**. Let TypeScript narrow each branch — never `catch (e: any)` and render `String(e)`.
+`ChatReturn.error` is `Error | null`. Use `instanceof AgentsKitError` and compare `error.code` to `ErrorCodes` — never `catch (e: any)` and render `String(e)`.
diff --git a/apps/docs-next/content/docs/cookbook/rag.mdx b/apps/docs-next/content/docs/cookbook/rag.mdx
index 2167f832..40e6aa5c 100644
--- a/apps/docs-next/content/docs/cookbook/rag.mdx
+++ b/apps/docs-next/content/docs/cookbook/rag.mdx
@@ -12,7 +12,7 @@ import { fileVectorMemory } from '@agentskit/memory'
const rag = createRAG({
embed: openaiEmbedder({ apiKey: process.env.OPENAI_API_KEY! }),
- store: fileVectorMemory({ path: './vectors.json' }),
+ store: fileVectorMemory({ path: './vectors' }),
})
await rag.ingest([
diff --git a/apps/docs-next/content/docs/data/memory/auto-summarize.mdx b/apps/docs-next/content/docs/data/memory/auto-summarize.mdx
index 0bf6fe1f..0d57a906 100644
--- a/apps/docs-next/content/docs/data/memory/auto-summarize.mdx
+++ b/apps/docs-next/content/docs/data/memory/auto-summarize.mdx
@@ -4,17 +4,43 @@ description: Fold oldest messages into a running summary. Token-budget-friendly.
---
```ts
-import { createAutoSummarizingMemory } from '@agentskit/memory'
-
-const memory = createAutoSummarizingMemory({
- summarize: async (msgs) => adapter.complete({
- messages: [{ role: 'system', content: 'Summarize tersely' }, ...msgs],
- }),
- triggerAt: 30,
- keep: 10,
+import { createAutoSummarizingMemory } from '@agentskit/core/auto-summarize'
+import { createInMemoryMemory } from '@agentskit/core'
+import { createRuntime } from '@agentskit/runtime'
+
+const summaryRuntime = createRuntime({
+ adapter,
+ systemPrompt: 'Summarize the following chat transcript in 3 bullet points.',
+ maxTokens: 512,
+})
+
+const memory = createAutoSummarizingMemory(createInMemoryMemory(), {
+ maxTokens: 8_000,
+ keepRecent: 6,
+ summarizer: async (msgs) => {
+ const src = msgs.map(m => `${m.role}: ${m.content}`).join('\n')
+ const result = await summaryRuntime.run(src)
+ return {
+ id: crypto.randomUUID(),
+ role: 'system',
+ content: result.content,
+ status: 'complete',
+ createdAt: new Date(),
+ }
+ },
})
```
+`createAutoSummarizingMemory` is not exported from `@agentskit/memory`. Import it from `@agentskit/core/auto-summarize` and pass a backing `ChatMemory` as the first argument.
+
+## Options
+
+| Option | Default | Purpose |
+|--------|---------|---------|
+| `maxTokens` | required | Budget trigger |
+| `summarizer` | required | `(messages) => Message` — your compaction prompt |
+| `keepRecent` | `4` | Messages always kept verbatim at the tail |
+
## Related
- [Recipe: auto-summarize](/docs/reference/recipes/auto-summarize)
diff --git a/apps/docs-next/content/docs/data/memory/file-vector.mdx b/apps/docs-next/content/docs/data/memory/file-vector.mdx
index 1bc5ea4b..75e1875a 100644
--- a/apps/docs-next/content/docs/data/memory/file-vector.mdx
+++ b/apps/docs-next/content/docs/data/memory/file-vector.mdx
@@ -6,7 +6,7 @@ description: Pure-JS file-persisted vector store. Zero infra.
```ts
import { fileVectorMemory } from '@agentskit/memory'
-const store = fileVectorMemory({ path: '.agentskit/vectors.json', dim: 1536 })
+const store = fileVectorMemory({ path: '.agentskit/vectors' })
```
## Options
@@ -14,8 +14,10 @@ const store = fileVectorMemory({ path: '.agentskit/vectors.json', dim: 1536 })
| Option | Type | Default |
|---|---|---|
| `path` | `string` | required |
-| `dim` | `number` | required |
-| `metric` | `'cosine' \| 'dot' \| 'euclidean'` | `cosine` |
+| `store` | `VectorStore` | Vectra-backed on-disk store |
+
+`path` names a Vectra index directory. Install the optional `vectra` peer for
+the default on-disk store, or provide a custom `VectorStore` implementation.
## Scale
diff --git a/apps/docs-next/content/docs/data/memory/index.mdx b/apps/docs-next/content/docs/data/memory/index.mdx
index 16ebc03b..8a18084d 100644
--- a/apps/docs-next/content/docs/data/memory/index.mdx
+++ b/apps/docs-next/content/docs/data/memory/index.mdx
@@ -29,7 +29,7 @@ description: Chat memory + vector stores + wrappers that make long-running agent
- `createInMemoryGraph` — knowledge graph (nodes + edges). [Recipe](/docs/reference/recipes/graph-memory).
- `createInMemoryPersonalization` — per-subject profile. [Recipe](/docs/reference/recipes/personalization).
-*Per-backend deep dives land in step 4 of the docs IA rollout.*
+Backend-specific guides are available in this section; start with the [vector memory adapters recipe](/docs/reference/recipes/vector-adapters) when you need a provider-neutral path.
## Related
diff --git a/apps/docs-next/content/docs/data/memory/virtualized.mdx b/apps/docs-next/content/docs/data/memory/virtualized.mdx
index 6f793e67..5ea066c4 100644
--- a/apps/docs-next/content/docs/data/memory/virtualized.mdx
+++ b/apps/docs-next/content/docs/data/memory/virtualized.mdx
@@ -4,15 +4,29 @@ description: Hot-window + cold retriever. Keep recent messages; retrieve old one
---
```ts
-import { createVirtualizedMemory } from '@agentskit/memory'
+import { createInMemoryMemory, createVirtualizedMemory } from '@agentskit/core'
-const memory = createVirtualizedMemory({
- window: 20,
- cold: vectorStore,
- embed: openaiEmbedder({ apiKey }),
+const backing = createInMemoryMemory()
+const memory = createVirtualizedMemory(backing, {
+ maxActive: 50,
+ maxRetrieved: 5,
+ retriever: async ({ hot, cold, maxRetrieved }) => {
+ // return up to maxRetrieved older messages to splice back in
+ return cold.slice(-maxRetrieved)
+ },
})
```
+`createVirtualizedMemory` ships in `@agentskit/core`, not `@agentskit/memory`. The first argument is the backing `ChatMemory`.
+
+## Options
+
+| Option | Default | Purpose |
+|--------|---------|---------|
+| `maxActive` | `50` | Recent messages always loaded |
+| `retriever` | — | `( { hot, cold, maxRetrieved } ) => Message[]` — optional cold lookup |
+| `maxRetrieved` | `10` | Cap on retrieved cold messages |
+
## When to use
Long-running sessions where most context is stale but some old turns
diff --git a/apps/docs-next/content/docs/data/providers/deepseek-embedder.mdx b/apps/docs-next/content/docs/data/providers/deepseek-embedder.mdx
index a4ac3f79..4acf9906 100644
--- a/apps/docs-next/content/docs/data/providers/deepseek-embedder.mdx
+++ b/apps/docs-next/content/docs/data/providers/deepseek-embedder.mdx
@@ -8,6 +8,7 @@ import { deepseekEmbedder } from '@agentskit/adapters'
const embed = deepseekEmbedder({
apiKey: process.env.DEEPSEEK_API_KEY!,
+ model: process.env.DEEPSEEK_EMBED_MODEL!,
})
```
@@ -16,9 +17,16 @@ const embed = deepseekEmbedder({
| Option | Type | Default |
|---|---|---|
| `apiKey` | `string` | required |
-| `model` | `string` | provider default |
+| `model` | `string` | required |
| `baseUrl` | `string` | `https://api.deepseek.com` |
+## Env
+
+| Var | Purpose |
+|---|---|
+| `DEEPSEEK_API_KEY` | API key |
+| `DEEPSEEK_EMBED_MODEL` | Embedding model |
+
## Related
- [Embedders overview](./embedders) · [deepseek](./deepseek)
diff --git a/apps/docs-next/content/docs/data/providers/embedders.mdx b/apps/docs-next/content/docs/data/providers/embedders.mdx
index 23fc6e9e..8dc10cef 100644
--- a/apps/docs-next/content/docs/data/providers/embedders.mdx
+++ b/apps/docs-next/content/docs/data/providers/embedders.mdx
@@ -8,26 +8,24 @@ description: Turn text into vectors. Used by RAG + vector memory.
| [OpenAI](./openai-embedder) | `openaiEmbedder` | `text-embedding-3-small`, `...-large` |
| [Gemini](./gemini-embedder) | `geminiEmbedder` | `text-embedding-004` |
| [Ollama](./ollama-embedder) | `ollamaEmbedder` | `nomic-embed-text`, `mxbai-embed-large` |
-| [DeepSeek](./deepseek-embedder) | `deepseekEmbedder` | provider defaults |
-| [Grok](./grok-embedder) | `grokEmbedder` | provider defaults |
-| [Kimi](./kimi-embedder) | `kimiEmbedder` | provider defaults |
+| [DeepSeek](./deepseek-embedder) | `deepseekEmbedder` | pass the provider model |
+| [Grok](./grok-embedder) | `grokEmbedder` | pass the provider model |
+| [Kimi](./kimi-embedder) | `kimiEmbedder` | pass the provider model |
| [OpenAI-compatible](./openai-compatible-embedder) | `createOpenAICompatibleEmbedder` | any `/v1/embeddings` endpoint |
## Contract
```ts
-type Embedder = {
- embed: (texts: string[]) => Promise
- dim: number
-}
+type EmbedFn = (text: string) => Promise
```
## Usage
```ts
+import type { EmbedFn } from '@agentskit/core'
import { openaiEmbedder } from '@agentskit/adapters'
-const embed = openaiEmbedder({
+const embed: EmbedFn = openaiEmbedder({
apiKey: process.env.OPENAI_API_KEY!,
model: 'text-embedding-3-small',
})
diff --git a/apps/docs-next/content/docs/data/providers/grok-embedder.mdx b/apps/docs-next/content/docs/data/providers/grok-embedder.mdx
index d22233f6..d212bf5c 100644
--- a/apps/docs-next/content/docs/data/providers/grok-embedder.mdx
+++ b/apps/docs-next/content/docs/data/providers/grok-embedder.mdx
@@ -1,6 +1,6 @@
---
title: grokEmbedder
-description: xAI embedding model.
+description: xAI embedding models through the OpenAI-compatible embeddings API.
---
```ts
@@ -8,6 +8,7 @@ import { grokEmbedder } from '@agentskit/adapters'
const embed = grokEmbedder({
apiKey: process.env.XAI_API_KEY!,
+ model: 'grok-embed-model',
})
```
@@ -16,8 +17,8 @@ const embed = grokEmbedder({
| Option | Type | Default |
|---|---|---|
| `apiKey` | `string` | required |
-| `model` | `string` | provider default |
-| `baseUrl` | `string` | `https://api.x.ai/v1` |
+| `model` | `string` | required |
+| `baseUrl` | `string` | `https://api.x.ai` |
## Related
diff --git a/apps/docs-next/content/docs/data/providers/grok.mdx b/apps/docs-next/content/docs/data/providers/grok.mdx
index 15d07990..2588acef 100644
--- a/apps/docs-next/content/docs/data/providers/grok.mdx
+++ b/apps/docs-next/content/docs/data/providers/grok.mdx
@@ -1,6 +1,6 @@
---
-title: grok
-description: xAI Grok — streaming chat + tool calls. OpenAI-compatible API surface.
+title: Grok provider for TypeScript AI agents
+description: Use xAI Grok with a TypeScript AI agent using AgentsKit's OpenAI-compatible adapter, streaming, and tool calls.
---
```ts
@@ -18,8 +18,9 @@ const adapter = grok({
|---|---|---|
| `apiKey` | `string` | required |
| `model` | `string` | required |
-| `baseUrl` | `string` | `https://api.x.ai/v1` |
-| `fetch` | `typeof fetch` | global |
+| `baseUrl` | `string` | `https://api.x.ai` |
+| `includeUsage` | `boolean` | adapter default |
+| `retry` | `RetryOptions` | adapter defaults |
## Model examples
diff --git a/apps/docs-next/content/docs/data/providers/huggingface.mdx b/apps/docs-next/content/docs/data/providers/huggingface.mdx
index 66a5797d..322435f4 100644
--- a/apps/docs-next/content/docs/data/providers/huggingface.mdx
+++ b/apps/docs-next/content/docs/data/providers/huggingface.mdx
@@ -18,7 +18,7 @@ const adapter = huggingface({
|---|---|---|
| `apiKey` | `string` | required |
| `model` | `string` | required |
-| `baseUrl` | `string` | `https://api-inference.huggingface.co` |
+| `baseUrl` | `string` | `https://router.huggingface.co/v1` |
| `fetch` | `typeof fetch` | global |
## Env
diff --git a/apps/docs-next/content/docs/data/providers/index.mdx b/apps/docs-next/content/docs/data/providers/index.mdx
index a237fec1..6b87b076 100644
--- a/apps/docs-next/content/docs/data/providers/index.mdx
+++ b/apps/docs-next/content/docs/data/providers/index.mdx
@@ -31,7 +31,7 @@ Numbers on this site always mean one of those layers — never mix them without
- `createEnsembleAdapter` — fan-out + merge. [Recipe](/docs/reference/recipes/adapter-ensemble).
- `createFallbackAdapter` — ordered try-next. [Recipe](/docs/reference/recipes/fallback-chain).
-*Per-provider pages land in step 4 of the docs IA rollout.*
+Provider-specific pages are available in this section; start with [choosing an adapter](./choosing) when the model or hosting surface is not decided yet.
## Related
diff --git a/apps/docs-next/content/docs/data/providers/kimi-embedder.mdx b/apps/docs-next/content/docs/data/providers/kimi-embedder.mdx
index 7ca62b1b..bd38911f 100644
--- a/apps/docs-next/content/docs/data/providers/kimi-embedder.mdx
+++ b/apps/docs-next/content/docs/data/providers/kimi-embedder.mdx
@@ -8,6 +8,7 @@ import { kimiEmbedder } from '@agentskit/adapters'
const embed = kimiEmbedder({
apiKey: process.env.KIMI_API_KEY!,
+ model: process.env.KIMI_EMBED_MODEL!,
})
```
@@ -16,8 +17,15 @@ const embed = kimiEmbedder({
| Option | Type | Default |
|---|---|---|
| `apiKey` | `string` | required |
-| `model` | `string` | provider default |
-| `baseUrl` | `string` | `https://api.moonshot.cn/v1` |
+| `model` | `string` | required |
+| `baseUrl` | `string` | `https://api.moonshot.ai` |
+
+## Env
+
+| Var | Purpose |
+|---|---|
+| `KIMI_API_KEY` | API key |
+| `KIMI_EMBED_MODEL` | Embedding model |
## Related
diff --git a/apps/docs-next/content/docs/data/providers/kimi.mdx b/apps/docs-next/content/docs/data/providers/kimi.mdx
index 7f2c113d..a2beb9db 100644
--- a/apps/docs-next/content/docs/data/providers/kimi.mdx
+++ b/apps/docs-next/content/docs/data/providers/kimi.mdx
@@ -18,7 +18,7 @@ const adapter = kimi({
|---|---|---|
| `apiKey` | `string` | required |
| `model` | `string` | required |
-| `baseUrl` | `string` | `https://api.moonshot.cn/v1` |
+| `baseUrl` | `string` | `https://api.moonshot.ai` |
| `fetch` | `typeof fetch` | global |
## Model examples
diff --git a/apps/docs-next/content/docs/data/providers/openai-compatible-embedder.mdx b/apps/docs-next/content/docs/data/providers/openai-compatible-embedder.mdx
index fa93617f..ff05b9e5 100644
--- a/apps/docs-next/content/docs/data/providers/openai-compatible-embedder.mdx
+++ b/apps/docs-next/content/docs/data/providers/openai-compatible-embedder.mdx
@@ -6,9 +6,8 @@ description: Escape hatch for any OpenAI-compatible `/v1/embeddings` endpoint
```ts
import { createOpenAICompatibleEmbedder } from '@agentskit/adapters'
-const embed = createOpenAICompatibleEmbedder({
+const embed = createOpenAICompatibleEmbedder('Voyage', 'https://api.voyageai.com')({
apiKey: process.env.VOYAGE_API_KEY!,
- baseUrl: 'https://api.voyageai.com/v1',
model: 'voyage-3-large',
})
```
@@ -18,10 +17,8 @@ const embed = createOpenAICompatibleEmbedder({
| Option | Type | Default |
|---|---|---|
| `apiKey` | `string` | required (unless the endpoint is keyless) |
-| `baseUrl` | `string` | required |
+| `baseUrl` | `string` | provider default; omit or override |
| `model` | `string` | required |
-| `dimensions` | `number` | — |
-| `fetch` | `typeof fetch` | global |
## Use cases
diff --git a/apps/docs-next/content/docs/data/providers/openai-embedder.mdx b/apps/docs-next/content/docs/data/providers/openai-embedder.mdx
index 946e1493..7173f309 100644
--- a/apps/docs-next/content/docs/data/providers/openai-embedder.mdx
+++ b/apps/docs-next/content/docs/data/providers/openai-embedder.mdx
@@ -18,9 +18,7 @@ const embed = openaiEmbedder({
|---|---|---|
| `apiKey` | `string` | required |
| `model` | `string` | `text-embedding-3-small` |
-| `dimensions` | `number` | model default |
-| `baseUrl` | `string` | `https://api.openai.com/v1` |
-| `fetch` | `typeof fetch` | global |
+| `baseUrl` | `string` | `https://api.openai.com` |
## Models
diff --git a/apps/docs-next/content/docs/data/rag/chunking.mdx b/apps/docs-next/content/docs/data/rag/chunking.mdx
index c5a3fa63..277ea05e 100644
--- a/apps/docs-next/content/docs/data/rag/chunking.mdx
+++ b/apps/docs-next/content/docs/data/rag/chunking.mdx
@@ -9,7 +9,16 @@ import { chunkText } from '@agentskit/rag'
const chunks = chunkText(longDoc, {
chunkSize: 800,
chunkOverlap: 120,
- split: 'paragraph',
+})
+```
+
+`chunkText(text, options)` returns `string[]`. Pass a custom `split` when you want your own boundaries instead of the default sliding window:
+
+```ts
+const paragraphs = chunkText(longDoc, {
+ chunkSize: 800,
+ chunkOverlap: 120,
+ split: text => text.split(/\n\n+/),
})
```
@@ -17,15 +26,19 @@ const chunks = chunkText(longDoc, {
| Option | Type | Default |
|---|---|---|
-| `chunkSize` | `number` | `1000` |
-| `chunkOverlap` | `number` | `100` |
-| `split` | `'sentence' \| 'paragraph' \| 'markdown' \| 'code' \| 'char'` | `paragraph` |
+| `chunkSize` | `number` | required (`createRAG` default: `512`) |
+| `chunkOverlap` | `number` | required (`createRAG` default: `50`) |
+| `split` | `(text: string) => string[]` | omitted — sliding window over whitespace |
+
+Standalone `chunkText` has no built-in size defaults. When you go through [createRAG](./create-rag), unspecified `chunkSize` / `chunkOverlap` become 512 / 50.
+
+If `split` is provided, its return value is used as-is (empty strings dropped). `chunkSize` and `chunkOverlap` then apply only to the default splitter.
## Rules of thumb
-- Prose: `paragraph`, 800/120.
-- Markdown: `markdown`, 1200/150.
-- Code: `code`, 1500/0.
+- Prose: 800 / 120.
+- Markdown: 1200 / 150.
+- Code: 1500 / 0.
## Related
diff --git a/apps/docs-next/content/docs/data/rag/context-injection.mdx b/apps/docs-next/content/docs/data/rag/context-injection.mdx
index 03a4e39b..77a6ff5e 100644
--- a/apps/docs-next/content/docs/data/rag/context-injection.mdx
+++ b/apps/docs-next/content/docs/data/rag/context-injection.mdx
@@ -30,7 +30,7 @@ import { fileVectorMemory } from '@agentskit/memory'
const rag = createRAG({
embed: openaiEmbedder({ apiKey: process.env.OPENAI_API_KEY! }),
- store: fileVectorMemory({ path: '.agentskit/vec.json', dim: 1536 }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
})
function formatContext(hits: Awaited>): string {
@@ -52,7 +52,7 @@ const systemPrompt = [
].filter(Boolean).join('\n\n')
```
-Pass `systemPrompt` as the `system` field to your adapter or `createRuntime` call.
+Pass `systemPrompt` as `context.systemPrompt` when calling `adapter.createSource`, or use it as the `systemPrompt` field in `createRuntime`.
## Runtime integration — pass `retriever` directly
@@ -68,13 +68,13 @@ await rag.ingest(myDocs)
const runtime = createRuntime({
adapter,
retriever: rag, // implements Retriever contract
- system: 'You are a helpful assistant.',
+ systemPrompt: 'You are a helpful assistant.',
})
const result = await runtime.run('How does token budgeting work?')
```
-The runtime appends the context block after your base `system` string, separated by a blank line.
+The runtime appends the context block after your base `systemPrompt` string, separated by a blank line.
## Controlling what gets injected
diff --git a/apps/docs-next/content/docs/data/rag/create-rag.mdx b/apps/docs-next/content/docs/data/rag/create-rag.mdx
index 13339489..d74b76a9 100644
--- a/apps/docs-next/content/docs/data/rag/create-rag.mdx
+++ b/apps/docs-next/content/docs/data/rag/create-rag.mdx
@@ -10,26 +10,32 @@ import { fileVectorMemory } from '@agentskit/memory'
const rag = createRAG({
embed: openaiEmbedder({ apiKey: process.env.OPENAI_API_KEY! }),
- store: fileVectorMemory({ path: '.agentskit/vec.json', dim: 1536 }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
})
-await rag.ingest([{ id: 'doc-1', text: longDoc }])
-const hits = await rag.retrieve('How does token budgeting work?')
+await rag.ingest([{ id: 'doc-1', content: longDoc }])
+const hits = await rag.retrieve({
+ query: 'How does token budgeting work?',
+ messages: [],
+})
```
+`ingest` takes `InputDocument[]` — the text field is `content`, not `text`.
+
## API
| Method | Purpose |
|---|---|
-| `ingest(docs, opts?)` | chunk + embed + store |
-| `retrieve(query, opts?)` | vector top-k |
-| `search(query, opts?)` | alias for retrieve with filters |
-| `delete(ids)` | remove docs |
+| `ingest(docs)` | chunk + embed + store |
+| `retrieve({ query, messages })` | `Retriever` contract — uses `query` |
+| `search(query, { topK?, threshold? })` | vector search with optional overrides |
+
+`retrieve` and `search` both return `RetrievedDocument[]`. Use `retrieve` when you need the contract (runtime, rerank wrappers). Use `search` when you already have a query string.
## Options
-- `chunkSize` / `chunkOverlap` / `split` — passed to [chunking](./chunking).
-- `topK` — default retrieve count.
+- `chunkSize` / `chunkOverlap` / `split` — passed to [chunking](./chunking). Defaults: `chunkSize` 512, `chunkOverlap` 50. `split` is an optional `(text: string) => string[]`.
+- `topK` / `threshold` — defaults for `search` (and therefore `retrieve`).
## Related
diff --git a/apps/docs-next/content/docs/data/rag/hybrid.mdx b/apps/docs-next/content/docs/data/rag/hybrid.mdx
index 3019fe85..c665260c 100644
--- a/apps/docs-next/content/docs/data/rag/hybrid.mdx
+++ b/apps/docs-next/content/docs/data/rag/hybrid.mdx
@@ -3,13 +3,19 @@ title: Hybrid search
description: Vector + BM25 blend with weighted normalization.
---
+`baseRetriever` is any Retriever that already produces vector candidates.
+
+`createHybridRetriever(base, { vectorWeight?, bm25Weight?, topK?, candidatePool? })`
+returns a Retriever. Weights are relative and normalized before blending (defaults
+to `0.6` vector / `0.4` BM25); it considers up to 20 candidates and returns 5 by
+default. If both weights are zero, the blend uses `0.5` / `0.5`.
+
```ts
import { createHybridRetriever } from '@agentskit/rag'
-const retriever = createHybridRetriever({
- vector: rag,
- lexical: bm25Index,
- weights: { vector: 0.7, lexical: 0.3 },
+const hybrid = createHybridRetriever(baseRetriever, {
+ vectorWeight: 0.7,
+ bm25Weight: 0.3,
})
```
diff --git a/apps/docs-next/content/docs/data/rag/index.mdx b/apps/docs-next/content/docs/data/rag/index.mdx
index 824bd771..9dea07ba 100644
--- a/apps/docs-next/content/docs/data/rag/index.mdx
+++ b/apps/docs-next/content/docs/data/rag/index.mdx
@@ -7,21 +7,21 @@ Want a working RAG agent rather than wiring the pipeline yourself? The [Registry
## Core pipeline
-- `createRAG({ embed, store })` — one-liner ingest + retrieve + search.
-- `chunkText({ chunkSize, chunkOverlap, split })` — standalone splitter.
+- `createRAG({ embed, store })` — one-liner ingest + retrieve + search. Defaults: `chunkSize` 512, `chunkOverlap` 50.
+- `chunkText(text, { chunkSize, chunkOverlap, split? })` — standalone splitter. `split` is an optional `(text: string) => string[]`.
## Reranking + hybrid
-- `createRerankedRetriever` — plug in Cohere Rerank, BGE, or the built-in BM25.
+- `createRerankedRetriever(base, { candidatePool?, topK?, rerank? })` — plug in `voyageReranker`, `jinaReranker`, or the built-in `bm25Rerank`.
- `createHybridRetriever` — vector + BM25 blend with weighted normalization.
- [Recipe: RAG reranking](/docs/reference/recipes/rag-reranking).
## Document loaders
-- `loadUrl`, `loadGitHubFile`, `loadGitHubTree`, `loadNotionPage`, `loadConfluencePage`, `loadGoogleDriveFile`, `loadPdf` (BYO parser).
+- `loadUrl` (raw response text), `loadGitHubFile`, `loadGitHubTree`, `loadNotionPage`, `loadConfluencePage`, `loadGoogleDriveFile`, `loadPdf` (BYO parser). All return `InputDocument[]`.
- [Recipe: Document loaders](/docs/reference/recipes/doc-loaders).
-*Per-loader + per-reranker deep dives land in step 4 of the docs IA rollout.*
+Loader and reranker guides are available through the [document loaders recipe](/docs/reference/recipes/doc-loaders) and [RAG reranking recipe](/docs/reference/recipes/rag-reranking).
## Related
diff --git a/apps/docs-next/content/docs/data/rag/loaders.mdx b/apps/docs-next/content/docs/data/rag/loaders.mdx
index 9710d4b6..44f4deff 100644
--- a/apps/docs-next/content/docs/data/rag/loaders.mdx
+++ b/apps/docs-next/content/docs/data/rag/loaders.mdx
@@ -3,7 +3,7 @@ title: Document loaders
description: Fetch + normalize documents from URLs, GitHub, Notion, Confluence, Google Drive, S3, GCS, Dropbox, OneDrive, PDFs.
---
-All loaders return `LoadedDocument[]` ready for `rag.ingest`.
+All loaders return `InputDocument[]` ready for `rag.ingest`. `loadUrl` puts the raw response body in `content` — no boilerplate stripping.
## URL
@@ -12,15 +12,18 @@ import { loadUrl } from '@agentskit/rag'
const docs = await loadUrl('https://example.com/post')
```
-Strips boilerplate; keeps main content + title.
+`docs[0].content` is the raw response text (HTML or otherwise). Pipe it into `rag.ingest` as-is, or clean it first.
## GitHub
```ts
import { loadGitHubFile, loadGitHubTree } from '@agentskit/rag'
-const single = await loadGitHubFile({ owner, repo, path: 'README.md', ref: 'main' })
-const tree = await loadGitHubTree({ owner, repo, ref: 'main', include: ['**/*.md'] })
+const single = await loadGitHubFile(owner, repo, 'README.md', { ref: 'main' })
+const tree = await loadGitHubTree(owner, repo, {
+ ref: 'main',
+ filter: path => path.endsWith('.md'),
+})
```
Requires `GITHUB_TOKEN` for private repos.
@@ -29,21 +32,24 @@ Requires `GITHUB_TOKEN` for private repos.
```ts
import { loadNotionPage } from '@agentskit/rag'
-const docs = await loadNotionPage({ token: process.env.NOTION_TOKEN!, pageId })
+const docs = await loadNotionPage(pageId, { token: process.env.NOTION_TOKEN! })
```
## Confluence
```ts
import { loadConfluencePage } from '@agentskit/rag'
-const docs = await loadConfluencePage({ baseUrl, auth, pageId })
+const docs = await loadConfluencePage(pageId, {
+ baseUrl,
+ token, // or authorization
+})
```
## Google Drive
```ts
import { loadGoogleDriveFile } from '@agentskit/rag'
-const docs = await loadGoogleDriveFile({ fileId, accessToken })
+const docs = await loadGoogleDriveFile(fileId, { accessToken })
```
## S3 (and S3-compatible: R2, MinIO)
@@ -112,7 +118,14 @@ Walks the drive children recursively, follows `@microsoft.graph.downloadUrl` for
```ts
import { loadPdf } from '@agentskit/rag'
-const docs = await loadPdf({ buffer, parse: myPdfParse })
+import pdfParse from 'pdf-parse'
+
+const docs = await loadPdf('https://example.com/report.pdf', {
+ parsePdf: async bytes => {
+ const result = await pdfParse(Buffer.from(bytes))
+ return { text: result.text, pages: result.numpages }
+ },
+})
```
BYO parser (e.g. `pdf-parse`, `unpdf`) to keep core deps zero.
diff --git a/apps/docs-next/content/docs/data/rag/rerank.mdx b/apps/docs-next/content/docs/data/rag/rerank.mdx
index 82557dfc..8023e254 100644
--- a/apps/docs-next/content/docs/data/rag/rerank.mdx
+++ b/apps/docs-next/content/docs/data/rag/rerank.mdx
@@ -1,26 +1,28 @@
---
title: Rerank
-description: Post-retrieval reranker. Cohere / BGE / built-in BM25.
+description: Post-retrieval reranker. Voyage / Jina / custom functions / built-in BM25.
---
```ts
-import { createRerankedRetriever, cohereReranker } from '@agentskit/rag'
+import { createRerankedRetriever, voyageReranker } from '@agentskit/rag'
-const retriever = createRerankedRetriever({
- retriever: rag,
- rerank: cohereReranker({ apiKey: process.env.COHERE_API_KEY! }),
- topN: 5,
+const retriever = createRerankedRetriever(rag, {
+ candidatePool: 20,
+ topK: 5,
+ rerank: voyageReranker({ apiKey: process.env.VOYAGE_API_KEY! }),
})
```
+`createRerankedRetriever(base, { candidatePool?, topK?, rerank? })` pulls `candidatePool` hits from the base retriever (default 20), re-scores them, and returns `topK` (default 5). Omit `rerank` and the default is `bm25Rerank`.
+
## Rerankers
-- `cohereReranker({ apiKey, model? })` — Cohere Rerank.
-- `bgeReranker({ url, model? })` — self-hosted BGE cross-encoder.
- `voyageReranker({ apiKey, model? })` — Voyage AI; defaults to `rerank-2`. Pass `rerank-2-lite` for cheaper / faster runs.
- `jinaReranker({ apiKey, model? })` — Jina AI; defaults to `jina-reranker-v2-base-multilingual`.
- `bm25Rerank` — zero-dep fallback.
+There is no `cohereReranker` or `bgeReranker` export. To call Cohere, BGE, or anything else, pass a custom `RerankFn` — see [Recipe: RAG reranking](/docs/reference/recipes/rag-reranking).
+
All rerankers are drop-in `RerankFn` values — they share the same `createRerankedRetriever` API so you can swap them without changing call sites.
## Related
diff --git a/apps/docs-next/content/docs/for-agents/memory.mdx b/apps/docs-next/content/docs/for-agents/memory.mdx
index 7aa89f65..1acfa132 100644
--- a/apps/docs-next/content/docs/for-agents/memory.mdx
+++ b/apps/docs-next/content/docs/for-agents/memory.mdx
@@ -23,7 +23,7 @@ npm install @agentskit/memory
### Vector memory
-- `fileVectorMemory({ path })` — JSON file.
+- `fileVectorMemory({ path })` — Vectra-backed index directory (optional `vectra` peer).
- `redisVectorMemory` — Redis Vector.
- `pgvector`, `pinecone`, `qdrant`, `chroma`, `upstashVector` — BYO-client / HTTP vector adapters. See [Vector adapters](/docs/reference/recipes/vector-adapters).
- `supabaseVectorStore`, `weaviateVectorStore`, `milvusVectorStore`, `mongoAtlasVectorStore` — managed / cluster backends.
diff --git a/apps/docs-next/content/docs/for-agents/rag.mdx b/apps/docs-next/content/docs/for-agents/rag.mdx
index 254d9b95..2afff562 100644
--- a/apps/docs-next/content/docs/for-agents/rag.mdx
+++ b/apps/docs-next/content/docs/for-agents/rag.mdx
@@ -11,10 +11,10 @@ npm install @agentskit/rag
## Primary exports
-- `createRAG({ embed, store, chunkSize, chunkOverlap, topK, threshold })` — `ingest(docs)` + `retrieve(request)` + `search(query)`.
-- `chunkText({ chunkSize, chunkOverlap, split })` — lower-level splitter.
+- `createRAG({ embed, store, chunkSize, chunkOverlap, topK, threshold })` — `ingest(InputDocument[])` + `retrieve({ query, messages })` + `search(query, { topK?, threshold? })`. `InputDocument` uses `content`, not `text`. Chunk defaults: 512 / 50.
+- `chunkText(text, { chunkSize, chunkOverlap, split? })` — lower-level splitter. `split` is `(text: string) => string[]`.
- `createRerankedRetriever(base, { candidatePool, topK, rerank })` — pluggable reranker (BM25 default). See [RAG reranking](/docs/reference/recipes/rag-reranking).
-- `createHybridRetriever(base, { vectorWeight, bm25Weight })` — vector + BM25 hybrid.
+- `createHybridRetriever(base, { vectorWeight?, bm25Weight?, topK?, candidatePool? })` — vector + BM25 hybrid; defaults to `0.6` / `0.4`, 20 candidates, and 5 results.
- `bm25Score`, `bm25Rerank` — standalone helpers.
- `voyageReranker(config)` — Voyage AI reranker.
- `jinaReranker(config)` — Jina AI reranker.
@@ -22,7 +22,7 @@ npm install @agentskit/rag
### Document loaders
-- `loadUrl`, `loadGitHubFile`, `loadGitHubTree`, `loadNotionPage`, `loadConfluencePage`, `loadGoogleDriveFile`, `loadPdf` (BYO parser). See [Doc loaders](/docs/reference/recipes/doc-loaders).
+- `loadUrl(url)` — raw response text as `InputDocument.content`. `loadGitHubFile(owner, repo, path, opts)`, `loadGitHubTree(owner, repo, { filter?, ... })`, `loadNotionPage(pageId, { token })`, `loadConfluencePage(pageId, { baseUrl, token?, authorization? })`, `loadGoogleDriveFile(fileId, { accessToken })`, `loadPdf(url, { parsePdf })`. All return `InputDocument[]`. See [Doc loaders](/docs/reference/recipes/doc-loaders).
- Cloud storage: `loadS3`, `loadGcs`, `loadDropbox`, `loadOneDrive`.
## Failure and cancellation contract
@@ -49,7 +49,7 @@ import { openaiEmbedder } from '@agentskit/adapters'
const rag = createRAG({
embed: openaiEmbedder({ apiKey }),
- store: fileVectorMemory({ path: './kb.json' }),
+ store: fileVectorMemory({ path: './kb-vectors' }),
})
await rag.ingest(await loadGitHubTree('org', 'repo', { token }))
diff --git a/apps/docs-next/content/docs/get-started/concepts/errors.mdx b/apps/docs-next/content/docs/get-started/concepts/errors.mdx
index 66058175..a9ec50cb 100644
--- a/apps/docs-next/content/docs/get-started/concepts/errors.mdx
+++ b/apps/docs-next/content/docs/get-started/concepts/errors.mdx
@@ -23,7 +23,7 @@ class AgentsKitError extends Error {
```
error[AK_ADAPTER_MISSING]: No adapter provided
--> Hint: Pass an adapter when creating the chat controller, e.g.
- createChatController({ adapter: openaiAdapter() })
+ createChatController({ adapter: openai({ apiKey, model: 'gpt-4o' }) })
--> Docs: https://www.agentskit.io/docs/data/providers
```
@@ -33,10 +33,13 @@ All errors extend `AgentsKitError`. The subclasses set a default `docsUrl` for t
| Class | Default docs link | Thrown when |
|-------|-------------------|-------------|
-| `AdapterError` | `/docs/data/providers` | Adapter is missing or a stream call fails |
-| `ToolError` | `/docs/agents/tools` | A tool is not found or `execute` throws |
-| `MemoryError` | `/docs/data/memory` | Memory load, save, or deserialization fails |
-| `ConfigError` | `/docs/get-started/getting-started/installation` | Required configuration is absent or invalid |
+| `AdapterError` | `/docs/data/providers` | An adapter is missing or a provider stream fails |
+| `ToolError` | `/docs/agents/tools` | A tool is missing, forbidden, invalid, or its `execute` call fails |
+| `MemoryError` | `/docs/data/memory` | Memory load, save, deserialization, or backend access fails |
+| `ConfigError` | `/docs/get-started/concepts/errors` | Required configuration is absent or invalid |
+| `RuntimeError` | `/docs/agents/runtime` | Runtime input, step, or delegation fails |
+| `SandboxError` | `/docs/production/security/mandatory-sandbox` | Sandbox policy, backend, or peer setup fails |
+| `SkillError` | `/docs/agents/skills` | A skill is invalid or duplicated |
## ErrorCodes
@@ -52,14 +55,45 @@ ErrorCodes.AK_ADAPTER_STREAM_FAILED // provider streaming call failed
// Tool errors
ErrorCodes.AK_TOOL_NOT_FOUND // tool name not registered
ErrorCodes.AK_TOOL_EXEC_FAILED // execute() threw
+ErrorCodes.AK_TOOL_PEER_MISSING // optional tool peer is not installed
+ErrorCodes.AK_TOOL_INVALID_INPUT // tool arguments or proposal are invalid
+ErrorCodes.AK_TOOL_QUOTA_EXCEEDED // tool execution exceeds its configured quota
+ErrorCodes.AK_TOOL_FORBIDDEN // tool execution is denied by policy
// Memory errors
ErrorCodes.AK_MEMORY_LOAD_FAILED // memory.load() failed
ErrorCodes.AK_MEMORY_SAVE_FAILED // memory.save() failed
ErrorCodes.AK_MEMORY_DESERIALIZE_FAILED // persisted state is corrupt
+ErrorCodes.AK_MEMORY_PEER_MISSING // optional memory backend is not installed
+ErrorCodes.AK_MEMORY_REMOTE_HTTP // remote memory request failed
// Config errors
ErrorCodes.AK_CONFIG_INVALID // missing or wrong type in config
+
+// Runtime errors
+ErrorCodes.AK_RUNTIME_INVALID_INPUT // runtime input is invalid
+ErrorCodes.AK_RUNTIME_STEP_FAILED // a runtime step failed
+ErrorCodes.AK_RUNTIME_DELEGATE_FAILED // delegated agent execution failed
+
+// Sandbox errors
+ErrorCodes.AK_SANDBOX_DENIED // sandbox policy denied execution
+ErrorCodes.AK_SANDBOX_INVALID_TOOL // tool is not valid for the sandbox
+ErrorCodes.AK_SANDBOX_PEER_MISSING // optional sandbox backend is not installed
+ErrorCodes.AK_SANDBOX_BACKEND_FAILED // sandbox backend failed
+
+// Skill errors
+ErrorCodes.AK_SKILL_INVALID // skill definition is invalid
+ErrorCodes.AK_SKILL_DUPLICATE // skill identity is duplicated
+```
+
+RAG-specific failures are exported by `@agentskit/rag`, not by core:
+
+```ts
+import { RagErrorCodes } from '@agentskit/rag'
+
+RagErrorCodes.AK_RAG_LOAD_FAILED // loader request, body, or pagination failed
+RagErrorCodes.AK_RAG_PEER_MISSING // optional loader peer is not installed
+RagErrorCodes.AK_RAG_RERANK_FAILED // reranker request or output was invalid
```
## Catching and narrowing
diff --git a/apps/docs-next/content/docs/get-started/concepts/implementations.mdx b/apps/docs-next/content/docs/get-started/concepts/implementations.mdx
index 500bf7b7..6fb2f34a 100644
--- a/apps/docs-next/content/docs/get-started/concepts/implementations.mdx
+++ b/apps/docs-next/content/docs/get-started/concepts/implementations.mdx
@@ -78,16 +78,18 @@ and the [tool ecosystem](/docs/agents/tools/integrations).
[chroma](/docs/data/memory/chroma) ·
[upstash](/docs/data/memory/upstash-vector)
-**Wrappers:** `createEncryptedMemory`, `createHierarchicalMemory`,
-`createVirtualizedMemory`, `createAutoSummarizingMemory`,
+**Wrappers (memory):** `createEncryptedMemory`, `createHierarchicalMemory`,
`createInMemoryGraph`, `createInMemoryPersonalization` —
[encrypted](/docs/data/memory/encrypted) ·
[hierarchical](/docs/data/memory/hierarchical) ·
-[virtualized](/docs/data/memory/virtualized) ·
-[auto-summarize](/docs/data/memory/auto-summarize) ·
[graph](/docs/data/memory/graph) ·
[personalization](/docs/data/memory/personalization)
+**Wrappers (core):** `createVirtualizedMemory` from `@agentskit/core`;
+`createAutoSummarizingMemory` from `@agentskit/core/auto-summarize` —
+[virtualized](/docs/data/memory/virtualized) ·
+[auto-summarize](/docs/data/memory/auto-summarize)
+
## Retriever — RAG pipeline
**Contract:** [concepts/retriever](./retriever) · **Package:** [@agentskit/rag](/docs/reference/packages/rag)
@@ -95,8 +97,8 @@ and the [tool ecosystem](/docs/agents/tools/integrations).
**Core:** `createRAG`, `chunkText` —
[createRAG](/docs/data/rag/create-rag) · [chunking](/docs/data/rag/chunking)
-**Rerankers:** `createRerankedRetriever`, `cohereReranker`,
-`bgeReranker`, `bm25Reranker` — [deep dive](/docs/data/rag/rerank)
+**Rerankers:** `createRerankedRetriever`, `voyageReranker`,
+`jinaReranker`, `bm25Rerank` — [deep dive](/docs/data/rag/rerank)
**Hybrid:** `createHybridRetriever` — [deep dive](/docs/data/rag/hybrid)
diff --git a/apps/docs-next/content/docs/get-started/concepts/memory.mdx b/apps/docs-next/content/docs/get-started/concepts/memory.mdx
index b6d44b68..ebc48c1c 100644
--- a/apps/docs-next/content/docs/get-started/concepts/memory.mdx
+++ b/apps/docs-next/content/docs/get-started/concepts/memory.mdx
@@ -57,7 +57,7 @@ export interface VectorMemory {
import { fileVectorMemory } from '@agentskit/memory'
import { openaiEmbedder } from '@agentskit/adapters'
-const store = fileVectorMemory({ path: './embeddings.json' })
+const store = fileVectorMemory({ path: '.agentskit/vectors' })
const embed = openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' })
await store.store([
diff --git a/apps/docs-next/content/docs/get-started/concepts/retriever.mdx b/apps/docs-next/content/docs/get-started/concepts/retriever.mdx
index 022c8c05..35bb4922 100644
--- a/apps/docs-next/content/docs/get-started/concepts/retriever.mdx
+++ b/apps/docs-next/content/docs/get-started/concepts/retriever.mdx
@@ -42,7 +42,7 @@ import { fileVectorMemory } from '@agentskit/memory'
import { openaiEmbedder } from '@agentskit/adapters'
const rag = createRAG({
- store: fileVectorMemory({ path: './embeddings.json' }),
+ store: fileVectorMemory({ path: './vectors' }),
embed: openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' }),
topK: 5,
})
diff --git a/apps/docs-next/content/docs/get-started/migrating/from-langchain.mdx b/apps/docs-next/content/docs/get-started/migrating/from-langchain.mdx
index 523d7a18..42723c1d 100644
--- a/apps/docs-next/content/docs/get-started/migrating/from-langchain.mdx
+++ b/apps/docs-next/content/docs/get-started/migrating/from-langchain.mdx
@@ -355,7 +355,7 @@ import { createRAG } from '@agentskit/rag'
import { fileVectorMemory } from '@agentskit/memory'
const rag = createRAG({
- store: fileVectorMemory({ path: './embeddings.json' }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
embed: openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' }),
})
diff --git a/apps/docs-next/content/docs/get-started/migrating/from-llamaindex.mdx b/apps/docs-next/content/docs/get-started/migrating/from-llamaindex.mdx
index 8d13b2cf..ff13e300 100644
--- a/apps/docs-next/content/docs/get-started/migrating/from-llamaindex.mdx
+++ b/apps/docs-next/content/docs/get-started/migrating/from-llamaindex.mdx
@@ -27,7 +27,7 @@ Stay with LlamaIndex when:
| `index.as_retriever()` | The `RAG` instance itself implements `Retriever` | Use it as `retriever:` on the runtime. |
| `index.as_query_engine()` | `runtime.run(query)` with `retriever` set | Retrieval per-turn is automatic. |
| `Document(text, metadata)` | `{ content, metadata }` | Same shape, plain object. |
-| `SimpleNodeParser`, `SentenceSplitter` | `chunkText({ chunkSize, chunkOverlap })` | Lower-level helper if you want to chunk yourself. |
+| `SimpleNodeParser`, `SentenceSplitter` | `chunkText(text, { chunkSize, chunkOverlap, split? })` | `split` is `(text: string) => string[]`. `createRAG` defaults 512 / 50. |
| `OpenAIEmbedding` | `openaiEmbedder({ apiKey, model })` | Embedders are first-class adapters. |
| `Chroma`, `Pinecone`, `Qdrant`, `Weaviate` | `chroma`, `pinecone`, `qdrant`, `weaviateVectorStore` | All in `@agentskit/memory`. |
| `OpenAIAgent.from_tools(tools)` | `createRuntime({ adapter, tools })` | Same idea; one runtime for every model. |
@@ -63,7 +63,7 @@ import { join } from 'node:path'
const rag = createRAG({
embed: openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' }),
- store: fileVectorMemory({ path: './embeddings.json' }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
})
const docs = await Promise.all(
@@ -196,7 +196,7 @@ Memory load + save, retrieval per turn, tool resolution — all handled. The run
| Backend | Import | Notes |
|---|---|---|
| In-memory | `createInMemoryMemory` (core) | Tests, demos. |
-| File JSON | `fileVectorMemory({ path })` | Vectra-backed; one process. |
+| File vector index | `fileVectorMemory({ path })` | Vectra-backed index directory; one process. |
| Postgres | `pgvector(...)` | Bring your own client (`pg` Pool, Neon, Supabase RPC). |
| Pinecone | `pinecone({ indexUrl, apiKey })` | HTTP only; no SDK dep. |
| Qdrant | `qdrant({ url, apiKey?, collection })` | HTTP only. |
diff --git a/apps/docs-next/content/docs/get-started/migrating/from-mastra.mdx b/apps/docs-next/content/docs/get-started/migrating/from-mastra.mdx
index 0d784cdc..902211d9 100644
--- a/apps/docs-next/content/docs/get-started/migrating/from-mastra.mdx
+++ b/apps/docs-next/content/docs/get-started/migrating/from-mastra.mdx
@@ -194,7 +194,7 @@ import { sqliteChatMemory, fileVectorMemory } from '@agentskit/memory'
import { createRAG } from '@agentskit/rag'
const rag = createRAG({
- store: fileVectorMemory({ path: './embeddings.json' }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
embed: openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' }),
topK: 3,
})
@@ -232,7 +232,7 @@ import { createRAG } from '@agentskit/rag'
import { fileVectorMemory } from '@agentskit/memory'
const rag = createRAG({
- store: fileVectorMemory({ path: './embeddings.json' }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
embed: openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' }),
})
diff --git a/apps/docs-next/content/docs/get-started/migrating/from-openai-assistants.mdx b/apps/docs-next/content/docs/get-started/migrating/from-openai-assistants.mdx
index 9341dc29..c51168fe 100644
--- a/apps/docs-next/content/docs/get-started/migrating/from-openai-assistants.mdx
+++ b/apps/docs-next/content/docs/get-started/migrating/from-openai-assistants.mdx
@@ -96,7 +96,7 @@ import { openaiEmbedder } from '@agentskit/adapters'
const rag = createRAG({
embed: openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' }),
- store: fileVectorMemory({ path: './kb.json' }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
})
await rag.ingest([
diff --git a/apps/docs-next/content/docs/get-started/migrating/from-vercel-ai-sdk.mdx b/apps/docs-next/content/docs/get-started/migrating/from-vercel-ai-sdk.mdx
index 0399e029..fddb8b6e 100644
--- a/apps/docs-next/content/docs/get-started/migrating/from-vercel-ai-sdk.mdx
+++ b/apps/docs-next/content/docs/get-started/migrating/from-vercel-ai-sdk.mdx
@@ -1,6 +1,6 @@
---
-title: From Vercel AI SDK
-description: Side-by-side migration guide. Map your Vercel AI SDK code to AgentsKit — with honest callouts about where each wins.
+title: Migrate from Vercel AI SDK to AgentsKit
+description: Migrate from Vercel AI SDK to AgentsKit with side-by-side TypeScript patterns for providers, UI, tools, and runtimes.
---
import { ContributeCallout } from '@/components/contribute/contribute-callout'
@@ -256,7 +256,7 @@ import { fileVectorMemory } from '@agentskit/memory'
import { openaiEmbedder } from '@agentskit/adapters'
const rag = createRAG({
- store: fileVectorMemory({ path: './embeddings.json' }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
embed: openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' }),
})
diff --git a/apps/docs-next/content/docs/production/cli/index.mdx b/apps/docs-next/content/docs/production/cli/index.mdx
index 306a3cbe..97ef8c0c 100644
--- a/apps/docs-next/content/docs/production/cli/index.mdx
+++ b/apps/docs-next/content/docs/production/cli/index.mdx
@@ -17,7 +17,7 @@ description: Nine commands wrapping every part of AgentsKit — init, chat, run,
| `agentskit rag` | Local RAG helpers (ingest / search). |
| `agentskit config` | Read / write local config. |
-*Per-command deep dives land in step 6 of the docs IA rollout.*
+Each command has a dedicated guide in this section; start with [agentskit ai](./ai) for scaffolding or [agentskit dev](./dev) for the local development loop.
## Related
diff --git a/apps/docs-next/content/docs/reference/contribute/rfc-process.mdx b/apps/docs-next/content/docs/reference/contribute/rfc-process.mdx
index 967b22ee..29c0b484 100644
--- a/apps/docs-next/content/docs/reference/contribute/rfc-process.mdx
+++ b/apps/docs-next/content/docs/reference/contribute/rfc-process.mdx
@@ -31,4 +31,4 @@ Keep it short. A great RFC is 200–500 words, not 3000.
## Examples of good RFCs
-Coming soon — link to merged RFCs here.
+For the public architectural record, see the [AgentsKit ADRs](https://github.com/AgentsKit-io/agentskit/tree/main/docs/architecture/adrs).
diff --git a/apps/docs-next/content/docs/reference/packages/cli.mdx b/apps/docs-next/content/docs/reference/packages/cli.mdx
index 95e0b592..92d13a1f 100644
--- a/apps/docs-next/content/docs/reference/packages/cli.mdx
+++ b/apps/docs-next/content/docs/reference/packages/cli.mdx
@@ -1,6 +1,6 @@
---
-title: '@agentskit/cli'
-description: The agentskit CLI — init, chat, run, dev, doctor, ai, tunnel, rag, config.
+title: AgentsKit CLI for TypeScript agents
+description: 'AgentsKit CLI for TypeScript agents: scaffold, run, chat, dev, doctor, RAG, and MCP from the terminal.'
---
`@agentskit/cli` is the operational front door to the ecosystem. It is how you bootstrap a project, run an agent, inspect your setup, and keep moving without writing scaffolding code first.
diff --git a/apps/docs-next/content/docs/reference/packages/core.mdx b/apps/docs-next/content/docs/reference/packages/core.mdx
index f4e7bf2c..56d81310 100644
--- a/apps/docs-next/content/docs/reference/packages/core.mdx
+++ b/apps/docs-next/content/docs/reference/packages/core.mdx
@@ -73,7 +73,7 @@ Heavy backends live in [`@agentskit/memory`](/docs/reference/packages/memory); v
| `AdapterError` | Thrown on adapter/stream failures; links to adapter docs |
| `ToolError` | Thrown on tool lookup or execution failures; links to tool docs |
| `MemoryError` | Thrown on memory load/save/deserialize failures; links to memory docs |
-| `ConfigError` | Thrown on invalid configuration; links to configuration docs |
+| `ConfigError` | Thrown on invalid configuration; links to [error handling](/docs/get-started/concepts/errors) |
| `ErrorCodes` | `as const` map of all `AK_*` error code strings |
See [Error handling](#error-handling-1) below for usage examples.
@@ -144,6 +144,9 @@ import {
ToolError,
MemoryError,
ConfigError,
+ RuntimeError,
+ SandboxError,
+ SkillError,
ErrorCodes,
} from '@agentskit/core'
```
@@ -152,9 +155,12 @@ import {
|-------|-------------|
| `AgentsKitError` | Base class — all errors extend this |
| `AdapterError` | Adapter is missing or a stream call fails |
-| `ToolError` | A tool is not found or its `execute` throws |
-| `MemoryError` | Memory load, save, or deserialization fails |
+| `ToolError` | A tool is missing, forbidden, invalid, or its `execute` call fails |
+| `MemoryError` | Memory load, save, deserialization, or backend access fails |
| `ConfigError` | Required configuration is absent or invalid |
+| `RuntimeError` | Runtime input, step, or delegation fails |
+| `SandboxError` | Sandbox policy, backend, or peer setup fails |
+| `SkillError` | A skill is invalid or duplicated |
### Error shape
@@ -172,7 +178,7 @@ class AgentsKitError extends Error {
```
error[AK_ADAPTER_MISSING]: No adapter provided
--> Hint: Pass an adapter when creating the chat controller, e.g.
- createChatController({ adapter: openaiAdapter() })
+ createChatController({ adapter: openai({ apiKey, model: 'gpt-4o' }) })
--> Docs: https://www.agentskit.io/docs/data/providers
```
@@ -185,12 +191,31 @@ ErrorCodes.AK_ADAPTER_MISSING // adapter not provided
ErrorCodes.AK_ADAPTER_STREAM_FAILED // streaming call failed
ErrorCodes.AK_TOOL_NOT_FOUND // tool name not registered
ErrorCodes.AK_TOOL_EXEC_FAILED // execute() threw
+ErrorCodes.AK_TOOL_PEER_MISSING // optional tool peer is not installed
+ErrorCodes.AK_TOOL_INVALID_INPUT // tool arguments or proposal are invalid
+ErrorCodes.AK_TOOL_QUOTA_EXCEEDED // tool execution exceeds its quota
+ErrorCodes.AK_TOOL_FORBIDDEN // tool execution is denied by policy
ErrorCodes.AK_MEMORY_LOAD_FAILED // memory.load() failed
ErrorCodes.AK_MEMORY_SAVE_FAILED // memory.save() failed
ErrorCodes.AK_MEMORY_DESERIALIZE_FAILED // corrupt persisted state
+ErrorCodes.AK_MEMORY_PEER_MISSING // optional memory backend is not installed
+ErrorCodes.AK_MEMORY_REMOTE_HTTP // remote memory request failed
ErrorCodes.AK_CONFIG_INVALID // missing or bad config
+ErrorCodes.AK_RUNTIME_INVALID_INPUT // runtime input is invalid
+ErrorCodes.AK_RUNTIME_STEP_FAILED // a runtime step failed
+ErrorCodes.AK_RUNTIME_DELEGATE_FAILED // delegated agent execution failed
+ErrorCodes.AK_SANDBOX_DENIED // sandbox policy denied execution
+ErrorCodes.AK_SANDBOX_INVALID_TOOL // tool is invalid for the sandbox
+ErrorCodes.AK_SANDBOX_PEER_MISSING // optional sandbox backend is not installed
+ErrorCodes.AK_SANDBOX_BACKEND_FAILED // sandbox backend failed
+ErrorCodes.AK_SKILL_INVALID // skill definition is invalid
+ErrorCodes.AK_SKILL_DUPLICATE // skill identity is duplicated
```
+RAG loader and reranker errors are package-specific. Import
+`RagError` / `RagErrorCodes` from `@agentskit/rag` for
+`AK_RAG_LOAD_FAILED`, `AK_RAG_PEER_MISSING`, and `AK_RAG_RERANK_FAILED`.
+
### Catching and narrowing errors
```ts
diff --git a/apps/docs-next/content/docs/reference/packages/overview.mdx b/apps/docs-next/content/docs/reference/packages/overview.mdx
index a8cf7aea..34cf382a 100644
--- a/apps/docs-next/content/docs/reference/packages/overview.mdx
+++ b/apps/docs-next/content/docs/reference/packages/overview.mdx
@@ -5,10 +5,11 @@ description: Every AgentsKit package at a glance — what it does, when to reach
import { ContributeCallout } from '@/components/contribute/contribute-callout'
-Twenty-one focused packages under `@agentskit/*`. Install what you need; every UI and runtime layer composes against the zero-dep **[@agentskit/core](./core)**.
+Twenty-two published packages under `@agentskit/*`, plus private workspace implementations that back public subpaths. Install what you need; every UI and runtime layer composes against the zero-dep **[@agentskit/core](./core)**.
:::tip API reference
-Full signatures: **[TypeDoc HTML](pathname:///agentskit/api-reference/)** (generated on `pnpm --filter @agentskit/docs build`; for local dev run `pnpm --filter @agentskit/docs docs:api` once).
+Full package contracts: start with each package guide below, then follow its
+generated API links when you need declaration-level signatures.
:::
## Foundation
@@ -45,9 +46,11 @@ Full signatures: **[TypeDoc HTML](pathname:///agentskit/api-reference/)** (gener
| Package | One-liner |
|---|---|
-| [@agentskit/tools](./tools) | Built-in tools + 50 integrations + MCP bridge. |
+| [@agentskit/tools](./tools) | Built-in tools + integration tools + MCP bridge. |
+| [@agentskit/integrations](/docs/for-agents/integrations) | Fetch-only service descriptors and integration catalog. |
+| [@agentskit/mcp](/docs/agents/tools/mcp) | MCP tool bridge and bounded registry transport. |
| [@agentskit/memory](./memory) | Chat + vector + hierarchical + encrypted + graph memory. |
-| [@agentskit/rag](./rag) | Chunk + retrieve + rerank + hybrid + six loaders. |
+| [@agentskit/rag](./rag) | Chunk + retrieve + rerank + hybrid + document loaders. |
| [@agentskit/skills](./skills) | Ready-made personas + marketplace. |
## Observability + evaluation
@@ -66,6 +69,7 @@ Full signatures: **[TypeDoc HTML](pathname:///agentskit/api-reference/)** (gener
| [@agentskit/sandbox](./sandbox) | Secure code execution + mandatory-sandbox policy. |
| [@agentskit/cli](./cli) | `agentskit init / chat / run / ai / dev / doctor`. |
| [@agentskit/templates](./templates) | Starter templates used by `agentskit init`. |
+| [@agentskit/statechart](./statechart) | Serializable interaction state for host-managed UI flows. |
## See also
diff --git a/apps/docs-next/content/docs/reference/packages/rag.mdx b/apps/docs-next/content/docs/reference/packages/rag.mdx
index 506dd851..4041df18 100644
--- a/apps/docs-next/content/docs/reference/packages/rag.mdx
+++ b/apps/docs-next/content/docs/reference/packages/rag.mdx
@@ -1,12 +1,12 @@
---
title: '@agentskit/rag'
-description: Plug-and-play RAG. Chunk, embed, retrieve, rerank, hybrid — plus six document loaders.
+description: Plug-and-play RAG. Chunk, embed, retrieve, rerank, hybrid, and document loaders.
---
## When to reach for it
- You want retrieval-augmented generation in a few lines.
-- You need rerankers (BM25 / Cohere / BGE) or hybrid vector+keyword search.
+- You need rerankers (BM25, Voyage, Jina, or a custom function) or hybrid vector+keyword search.
- You want document loaders for URL / GitHub / Notion / Confluence / Google Drive / PDF.
## Install
@@ -24,7 +24,7 @@ import { openaiEmbedder } from '@agentskit/adapters'
const rag = createRAG({
embed: openaiEmbedder({ apiKey: process.env.OPENAI_API_KEY! }),
- store: fileVectorMemory({ path: './kb.json' }),
+ store: fileVectorMemory({ path: './kb-vectors' }),
})
await rag.ingest([{ content: 'AgentsKit is a toolkit for AI agents.', source: 'intro' }])
const hits = await rag.search('what is agentskit')
@@ -46,8 +46,8 @@ const hits = await rag.search('what is agentskit')
## Stability
-- **Version:** `0.2.1`
-- **Tier:** alpha
+- **Version:** `0.5.2`
+- **Tier:** beta
- **Contract:** evolving
- **Roadmap:** see [packages roadmap](./roadmap) for what this package needs to reach v1.0.
diff --git a/apps/docs-next/content/docs/reference/recipes/auto-summarize.mdx b/apps/docs-next/content/docs/reference/recipes/auto-summarize.mdx
index a45e61e8..d2cd0e34 100644
--- a/apps/docs-next/content/docs/reference/recipes/auto-summarize.mdx
+++ b/apps/docs-next/content/docs/reference/recipes/auto-summarize.mdx
@@ -25,18 +25,22 @@ import { createInMemoryMemory } from '@agentskit/core'
import { createRuntime } from '@agentskit/runtime'
import { anthropic } from '@agentskit/adapters'
-const summarizerAdapter = anthropic({ apiKey: process.env.ANTHROPIC_API_KEY!, model: 'claude-haiku-4-5' })
+const summaryRuntime = createRuntime({
+ adapter: anthropic({ apiKey: process.env.ANTHROPIC_API_KEY!, model: 'claude-haiku-4-5' }),
+ systemPrompt: 'Summarize the following chat transcript in 3 bullet points.',
+ maxTokens: 512,
+})
const memory = createAutoSummarizingMemory(createInMemoryMemory(), {
maxTokens: 8_000,
keepRecent: 6,
summarizer: async messages => {
const src = messages.map(m => `${m.role}: ${m.content}`).join('\n')
- const result = await runOnce(summarizerAdapter, `Summarize the following chat transcript in 3 bullet points:\n\n${src}`)
+ const result = await summaryRuntime.run(src)
return {
id: crypto.randomUUID(),
role: 'system',
- content: result,
+ content: result.content,
status: 'complete',
createdAt: new Date(),
}
diff --git a/apps/docs-next/content/docs/reference/recipes/doc-loaders.mdx b/apps/docs-next/content/docs/reference/recipes/doc-loaders.mdx
index 63b9e5ac..38f7ae2b 100644
--- a/apps/docs-next/content/docs/reference/recipes/doc-loaders.mdx
+++ b/apps/docs-next/content/docs/reference/recipes/doc-loaders.mdx
@@ -49,7 +49,7 @@ const docs = await loadGitHubTree('my-org', 'my-repo', {
const rag = createRAG({
embed: openaiEmbedder({ apiKey: process.env.OPENAI_API_KEY! }),
- store: fileVectorMemory({ path: './kb.json' }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
})
await rag.ingest(docs)
```
diff --git a/apps/docs-next/content/docs/reference/recipes/hierarchical-memory.mdx b/apps/docs-next/content/docs/reference/recipes/hierarchical-memory.mdx
index 408fb597..320cd822 100644
--- a/apps/docs-next/content/docs/reference/recipes/hierarchical-memory.mdx
+++ b/apps/docs-next/content/docs/reference/recipes/hierarchical-memory.mdx
@@ -29,7 +29,7 @@ import {
const archival = fileChatMemory({ path: './sessions/user-42.json' })
const working = fileChatMemory({ path: './sessions/user-42.hot.json' })
-const vectorStore = fileVectorMemory({ path: './sessions/user-42.vectors.json' })
+const vectorStore = fileVectorMemory({ path: '.agentskit/vectors' })
const memory = createHierarchicalMemory({
working,
diff --git a/apps/docs-next/content/docs/reference/recipes/pdf-qa.mdx b/apps/docs-next/content/docs/reference/recipes/pdf-qa.mdx
index 5522899d..96808c89 100644
--- a/apps/docs-next/content/docs/reference/recipes/pdf-qa.mdx
+++ b/apps/docs-next/content/docs/reference/recipes/pdf-qa.mdx
@@ -52,7 +52,7 @@ function chunk(text: string, size = 500): string[] {
// 3. Index in-memory (per-PDF, ephemeral)
const rag = createRAG({
- store: fileVectorMemory({ path: `./.cache/${pdfPath}.embeddings.json` }),
+ store: fileVectorMemory({ path: `./.cache/vectors/${pdfPath}` }),
embed: openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' }),
topK: 4,
})
@@ -86,7 +86,7 @@ npx tsx ask-pdf.ts paper.pdf "What is the main contribution of this work?"
## Why this works
-- **Per-PDF cache** at `./.cache/.embeddings.json` — second run is instant
+- **Per-PDF index** at `./.cache/vectors/` — second run is instant
- **Source citations** because `RetrievedDocument.source` makes it into the prompt
- **No memory** — each invocation is independent; perfect for one-shot Q&A
diff --git a/apps/docs-next/content/docs/reference/recipes/rag-chat.mdx b/apps/docs-next/content/docs/reference/recipes/rag-chat.mdx
index 9d8ab1c6..9240cc3f 100644
--- a/apps/docs-next/content/docs/reference/recipes/rag-chat.mdx
+++ b/apps/docs-next/content/docs/reference/recipes/rag-chat.mdx
@@ -23,7 +23,7 @@ import { readFileSync, readdirSync } from 'node:fs'
import { join } from 'node:path'
const rag = createRAG({
- store: fileVectorMemory({ path: './embeddings.json' }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
embed: openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' }),
})
@@ -51,7 +51,7 @@ import { openaiEmbedder } from '@agentskit/adapters'
import '@agentskit/react/theme'
const rag = createRAG({
- store: fileVectorMemory({ path: './embeddings.json' }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
embed: openaiEmbedder({ apiKey: KEY, model: 'text-embedding-3-small' }),
})
diff --git a/apps/docs-next/content/docs/reference/recipes/rag-reranking.mdx b/apps/docs-next/content/docs/reference/recipes/rag-reranking.mdx
index bc3c34ac..c935693d 100644
--- a/apps/docs-next/content/docs/reference/recipes/rag-reranking.mdx
+++ b/apps/docs-next/content/docs/reference/recipes/rag-reranking.mdx
@@ -1,6 +1,6 @@
---
title: RAG reranking + hybrid search
-description: Wrap your vector retriever with BM25 hybrid scoring and pluggable rerankers (Cohere Rerank, BGE, etc.).
+description: Wrap your vector retriever with BM25 hybrid scoring and custom rerank functions.
---
Vector search is fast, but often misses exact-keyword matches and
@@ -22,7 +22,7 @@ import { openaiEmbedder } from '@agentskit/adapters'
const base = createRAG({
embed: openaiEmbedder({ apiKey: process.env.OPENAI_API_KEY! }),
- store: fileVectorMemory({ path: './kb.vectors.json' }),
+ store: fileVectorMemory({ path: '.agentskit/vectors' }),
topK: 20,
})
diff --git a/apps/docs-next/content/docs/reference/specs/index.mdx b/apps/docs-next/content/docs/reference/specs/index.mdx
index 4148cb31..2c3122b7 100644
--- a/apps/docs-next/content/docs/reference/specs/index.mdx
+++ b/apps/docs-next/content/docs/reference/specs/index.mdx
@@ -9,7 +9,7 @@ Small, stable, versioned JSON shapes. Each is a subpath of `@agentskit/core`: ty
- **Manifest** — packaging format for skills + tools. Tool entries mirror MCP `inputSchema` so manifests round-trip.
- **Eval Format** — portable eval dataset + run-result. `matchesExpectation` supports literal / regex / normalized / semantic similarity.
-*Per-spec deep dives land in step 6 of the docs IA rollout.*
+Read the [A2A](./a2a), [Manifest](./manifest), and [Eval Format](./eval-format) deep dives for the individual contracts.
## Related
diff --git a/apps/docs-next/content/docs/reference/stability.mdx b/apps/docs-next/content/docs/reference/stability.mdx
index 791bec24..d4e1908e 100644
--- a/apps/docs-next/content/docs/reference/stability.mdx
+++ b/apps/docs-next/content/docs/reference/stability.mdx
@@ -23,25 +23,31 @@ the existing surface.
| Package | Level | Note |
|---|---|---|
-| `@agentskit/core` | stable | Sacred — every other package depends on its contracts. |
-| `@agentskit/adapters` | stable | 29 provider factories; the contract is locked per ADR 0001. |
-| `@agentskit/runtime` | stable | ReAct loop + delegation per ADR 0006. |
-| `@agentskit/memory` | stable | Per ADR 0003. |
-| `@agentskit/rag` | stable | Per ADR 0004. |
-| `@agentskit/skills` | stable | Per ADR 0005. |
-| `@agentskit/tools` | stable | Per ADR 0002. |
-| `@agentskit/react` | stable | `useChat` shape locked. |
-| `@agentskit/ink` | stable | Mirrors React contract. |
-| `@agentskit/cli` | stable | `chat`, `init`, `run` commands stable. |
-| `@agentskit/templates` | stable | Scaffolding contract stable. |
-| `@agentskit/observability` | beta | Sink set still growing (Datadog, Axiom, New Relic shipped — Splunk / Honeycomb on roadmap). |
-| `@agentskit/eval` | beta | LLM-judge pipeline shipped; broader benchmarks queued. |
-| `@agentskit/sandbox` | beta | E2B backend stable; alternative backends (WebContainer, MicroVM) queued. |
-| `@agentskit/vue` | alpha | Composable contract mirrors React; promotion blocked on coverage gate. |
-| `@agentskit/svelte` | alpha | Store contract mirrors React; promotion blocked on coverage gate. |
-| `@agentskit/solid` | alpha | Hook contract mirrors React; promotion blocked on coverage gate. |
-| `@agentskit/angular` | alpha | Service contract; promotion blocked on coverage gate. |
-| `@agentskit/react-native` | alpha | Hook mirrors React; promotion blocked on coverage gate. |
+| `@agentskit/core` | stable | Sacred package; contract-stable per ADRs 0001–0006. |
+| `@agentskit/adapters` | beta | Provider contract and resilience hardening continue toward 1.0. |
+| `@agentskit/runtime` | beta | ReAct, topology, and durable APIs are still settling. |
+| `@agentskit/tools` | beta | Core tools are usable; integrations and MCP ergonomics evolve. |
+| `@agentskit/memory` | beta | Main backends work; vector-store surface is sharpening. |
+| `@agentskit/skills` | beta | Catalog and contract hardening continue toward promotion. |
+| `@agentskit/observability` | beta | Lifecycle, cost-guard, and provider coverage continue to grow. |
+| `@agentskit/react` | beta | Production-ready; shared `ChatReturn` remains pre-1.0. |
+| `@agentskit/ink` | beta | Terminal parity and keyboard UX continue to mature. |
+| `@agentskit/cli` | beta | Core commands are useful; programmatic surface is settling. |
+| `@agentskit/rag` | beta | Retriever, loader, and resilience contracts are hardening. |
+| `@agentskit/eval` | beta | Suite, replay, snapshot, and CI surfaces are still pre-1.0. |
+| `@agentskit/sandbox` | beta | Lifecycle, config, and backend surfaces are still pre-1.0. |
+| `@agentskit/templates` | beta | Scaffold and validation surfaces are still pre-1.0. |
+| `@agentskit/validation` | beta | Private implementation behind the public tools validation surface. |
+| `@agentskit/statechart` | beta | Serializable interaction-state contract is hardened but pre-1.0. |
+| `@agentskit/eval-braintrust` | beta | Private implementation exposed through the public eval surface. |
+| `@agentskit/observability-langfuse` | beta | Private workspace implementation exposed through observability. |
+| `@agentskit/integrations` | beta | Fetch-only catalog and execution boundaries are still pre-1.0. |
+| `@agentskit/mcp` | beta | Tool bridge and bounded registry surfaces are still pre-1.0. |
+| `@agentskit/vue` | beta | Framework binding at headless parity, still pre-1.0. |
+| `@agentskit/svelte` | beta | Framework binding at headless parity, still pre-1.0. |
+| `@agentskit/solid` | beta | Framework binding at headless parity, still pre-1.0. |
+| `@agentskit/react-native` | beta | Framework binding at headless parity, still pre-1.0. |
+| `@agentskit/angular` | beta | Framework binding at headless parity, still pre-1.0. |
## Promotion criteria
@@ -87,9 +93,8 @@ If you depend on an `alpha` or `beta` package today, do the following:
## Roadmap
-The 5 alpha UI bindings are the most concrete near-term promotion target.
-Once their coverage thresholds are at 70+ (real tests, not the placeholder
-existence checks), promotion follows. The 3 beta packages graduate when
+The framework bindings are the most concrete near-term promotion target.
+Once their coverage thresholds and release evidence are complete, promotion follows. The beta packages graduate when
their respective ADRs are written + locked.
## Related
diff --git a/apps/docs-next/content/docs/ui/use-chat.mdx b/apps/docs-next/content/docs/ui/use-chat.mdx
index eec4e3ac..7bf3773b 100644
--- a/apps/docs-next/content/docs/ui/use-chat.mdx
+++ b/apps/docs-next/content/docs/ui/use-chat.mdx
@@ -13,15 +13,20 @@ signal, Angular service, React Native hook, Ink hook).
```ts
type ChatReturn = {
messages: Message[]
- status: 'idle' | 'streaming' | 'error' | 'awaiting-tool'
+ status: 'idle' | 'streaming' | 'complete' | 'error'
+ input: string
+ usage: TokenUsage
error: Error | null
- send: (text: string, opts?: SendOptions) => Promise
+ send: (text: string) => Promise
retry: () => Promise
stop: () => void
- clear: () => void
- approve: (toolCallId: string, result?: unknown) => void
- deny: (toolCallId: string, reason?: string) => void
- edit: (messageId: string, text: string) => Promise
+ clear: () => Promise
+ approve: (toolCallId: string) => Promise
+ deny: (toolCallId: string, reason?: string) => Promise
+ edit: (messageId: string, text: string, opts?: EditOptions) => Promise
+ regenerate: (messageId?: string) => Promise
+ setInput: (value: string) => void
+ proposeToolCall: (proposal: Pick) => Promise
}
```
@@ -29,14 +34,14 @@ type ChatReturn = {
```ts
type ChatConfig = {
- adapter: Adapter
- tools?: Tool[]
- skills?: Skill[]
- memory?: Memory
- rag?: Retriever
- system?: string
- onEvent?: (e: ChatEvent) => void
+ adapter: AdapterFactory
+ tools?: ToolDefinition[]
+ skills?: SkillDefinition[]
+ memory?: ChatMemory
+ retriever?: Retriever
+ systemPrompt?: string
onError?: (e: Error) => void
+ onMessage?: (message: Message) => void
}
```
@@ -60,10 +65,11 @@ safe and has no additional effect.
| Angular | `import { AgentskitChat } from '@agentskit/angular'` | `constructor(private chat: AgentskitChat)` — `Signal` + `RxJS` |
| Ink | `import { useChat } from '@agentskit/ink'` | Terminal-safe |
-## Events (`onEvent`)
+## Events and observers
-`chat.start` · `message.append` · `message.update` · `tool.call` ·
-`tool.result` · `error` · `status.change` · `chat.end`.
+Use `onMessage` for per-message updates or `observers` for the shared
+`AgentEvent` stream. The controller does not expose an `onEvent` option on
+`ChatConfig`; framework bindings mirror the same core contract.
Full schema: [Concepts → mental model](/docs/get-started/concepts/mental-model).
diff --git a/apps/docs-next/legacy-404-redirects.mjs b/apps/docs-next/legacy-404-redirects.mjs
index c7510d1b..d49856e7 100644
--- a/apps/docs-next/legacy-404-redirects.mjs
+++ b/apps/docs-next/legacy-404-redirects.mjs
@@ -1,7 +1,9 @@
-// AUTO-GENERATED from GSC "Not found (404)" export (2026-05-19).
-// 226 crawled-but-404 URLs from doc IA churn. Each destination verified
-// against the live sitemap (or its nearest live ancestor section).
-// Junk (code-snippet file paths, unbuilt locales) intentionally left to 404.
+// AUTO-GENERATED from GSC "Not found (404)" exports (latest source: 2026-06-03).
+// 203 explicit crawled-but-404 candidates from doc IA churn. Grok CLI
+// classification: 42 extension-normalization, 87 same-leaf IA moves, 30
+// API-symbol-to-ancestor moves, and 44 dead-page-to-ancestor fallbacks.
+// The remaining 23 URLs (code-snippet paths, unbuilt locales, and junk) are
+// intentionally left to 404. Every destination below is a current docs route.
// Prepended before the wildcard rules so first-match wins over stale chains.
export const LEGACY_404_REDIRECTS = [
// From GSC "Not found (404)" export 2026-06-03: reference recipes moved under /recipes; a2a spec moved under /specs.
diff --git a/apps/docs-next/lib/deterministic-knowledge.generated.json b/apps/docs-next/lib/deterministic-knowledge.generated.json
index d9e88894..0fa0b3ed 100644
--- a/apps/docs-next/lib/deterministic-knowledge.generated.json
+++ b/apps/docs-next/lib/deterministic-knowledge.generated.json
@@ -3,12 +3,12 @@
"version": 1,
"artifactId": "agentskit-docs-v1",
"siteId": "agentskit-docs",
- "generatedAt": "2026-08-12T14:49:32-03:00",
+ "generatedAt": "2026-08-12T22:55:06-03:00",
"entries": [
{
"id": "claim.catalog-models",
"kind": "restricted-faq",
- "label": "5162 models",
+ "label": "6293 models",
"match": {
"type": "exact",
"values": [
@@ -18,7 +18,7 @@
]
},
"answer": {
- "markdown": "The verified AgentsKit ledger currently reports **5162 models**. The public conservative floor is 5000.",
+ "markdown": "The verified AgentsKit ledger currently reports **6293 models**. The public conservative floor is 6000.",
"citations": [
{
"id": "claim-catalog-models",
@@ -31,7 +31,7 @@
{
"id": "claim.catalog-providers",
"kind": "restricted-faq",
- "label": "140 providers",
+ "label": "184 providers",
"match": {
"type": "exact",
"values": [
@@ -41,7 +41,7 @@
]
},
"answer": {
- "markdown": "The verified AgentsKit ledger currently reports **140 providers**. The public conservative floor is 140.",
+ "markdown": "The verified AgentsKit ledger currently reports **184 providers**. The public conservative floor is 180.",
"citations": [
{
"id": "claim-catalog-providers",
@@ -2260,5 +2260,5 @@
}
}
],
- "contentHash": "sha256:ce7d63954d1c58c4c3dbe5b425f6768be3b7eb499df843c8e67ab0eefadda8b5"
+ "contentHash": "sha256:70679069128f2f8f0f8facd3c57f0669cce1bff59cc8dc39c8b3e761cf54f7b0"
}
diff --git a/apps/docs-next/lib/deterministic-site.generated.json b/apps/docs-next/lib/deterministic-site.generated.json
index 75c18d56..8b163636 100644
--- a/apps/docs-next/lib/deterministic-site.generated.json
+++ b/apps/docs-next/lib/deterministic-site.generated.json
@@ -3,8 +3,8 @@
"version": 1,
"siteId": "agentskit-docs",
"artifact": {
- "href": "/deterministic-knowledge/ce7d63954d1c58c4c3dbe5b425f6768be3b7eb499df843c8e67ab0eefadda8b5.json",
- "contentHash": "sha256:ce7d63954d1c58c4c3dbe5b425f6768be3b7eb499df843c8e67ab0eefadda8b5"
+ "href": "/deterministic-knowledge/70679069128f2f8f0f8facd3c57f0669cce1bff59cc8dc39c8b3e761cf54f7b0.json",
+ "contentHash": "sha256:70679069128f2f8f0f8facd3c57f0669cce1bff59cc8dc39c8b3e761cf54f7b0"
},
"fallback": {
"mode": "backend"
diff --git a/apps/docs-next/lib/reference-journey.ts b/apps/docs-next/lib/reference-journey.ts
index 232d6bc2..3ba5585e 100644
--- a/apps/docs-next/lib/reference-journey.ts
+++ b/apps/docs-next/lib/reference-journey.ts
@@ -32,6 +32,7 @@ function productById(id: string): ManifestProduct {
}
const agentskit = productById('agentskit')
+const ecosystemNext = agentskit.navigation.next.map(productById)
export const agentsKitIdentity = {
name: agentskit.name,
@@ -42,9 +43,8 @@ export const agentsKitIdentity = {
proof: claimsFor('agentskit'),
} as const
-export const ecosystemShowcase = manifest.products
+export const ecosystemShowcase = ecosystemNext
.filter(hasShowcase)
- .sort((a, b) => a.navigation.order - b.navigation.order)
.map((product) => ({
id: product.id,
name: product.name,
diff --git a/apps/docs-next/next.config.mjs b/apps/docs-next/next.config.mjs
index d7ca604d..7bb46abe 100644
--- a/apps/docs-next/next.config.mjs
+++ b/apps/docs-next/next.config.mjs
@@ -35,7 +35,6 @@ const DOC_REDIRECTS = [
{ source: '/docs/tools', destination: '/docs/agents/tools', permanent: true },
{ source: '/docs/skills/:slug*', destination: '/docs/agents/skills/:slug*', permanent: true },
{ source: '/docs/skills', destination: '/docs/agents/skills', permanent: true },
- { source: '/docs/agents/tools', destination: '/docs/agents/tools', permanent: false }, // self no-op retained for old redirect fallback
// Tab restructure — Production
{ source: '/docs/observability/:slug*', destination: '/docs/production/observability/:slug*', permanent: true },
@@ -52,6 +51,7 @@ const DOC_REDIRECTS = [
{ source: '/docs/infrastructure/:slug*', destination: '/docs/reference/packages/:slug*', permanent: true },
// Tab restructure — Reference
+ { source: '/docs/packages/integrations', destination: '/docs/for-agents/integrations', permanent: true },
{ source: '/docs/packages/:slug*', destination: '/docs/reference/packages/:slug*', permanent: true },
{ source: '/docs/packages', destination: '/docs/reference/packages', permanent: true },
// For agents is its own top-level tab — keep the short legacy path working
diff --git a/apps/docs-next/package.json b/apps/docs-next/package.json
index f89ff8cf..4fbcce00 100644
--- a/apps/docs-next/package.json
+++ b/apps/docs-next/package.json
@@ -17,6 +17,7 @@
"docs": "next dev --turbo",
"start": "next start",
"lint": "node scripts/gen-ask-context.mjs && tsc --noEmit",
+ "test": "vitest run",
"lint:mdx": "node scripts/lint-mdx.mjs",
"check:links": "node scripts/check-links.mjs",
"gen:api": "node scripts/gen-api.mjs",
@@ -68,6 +69,7 @@
"tsx": "^4.23.5",
"typedoc": "^0.28.20",
"typedoc-plugin-markdown": "^4.12.0",
- "typescript": "^6.0.3"
+ "typescript": "^6.0.3",
+ "vitest": "^4.1.10"
}
}
diff --git a/apps/docs-next/public/deterministic-knowledge/ce7d63954d1c58c4c3dbe5b425f6768be3b7eb499df843c8e67ab0eefadda8b5.json b/apps/docs-next/public/deterministic-knowledge/70679069128f2f8f0f8facd3c57f0669cce1bff59cc8dc39c8b3e761cf54f7b0.json
similarity index 99%
rename from apps/docs-next/public/deterministic-knowledge/ce7d63954d1c58c4c3dbe5b425f6768be3b7eb499df843c8e67ab0eefadda8b5.json
rename to apps/docs-next/public/deterministic-knowledge/70679069128f2f8f0f8facd3c57f0669cce1bff59cc8dc39c8b3e761cf54f7b0.json
index d9e88894..0fa0b3ed 100644
--- a/apps/docs-next/public/deterministic-knowledge/ce7d63954d1c58c4c3dbe5b425f6768be3b7eb499df843c8e67ab0eefadda8b5.json
+++ b/apps/docs-next/public/deterministic-knowledge/70679069128f2f8f0f8facd3c57f0669cce1bff59cc8dc39c8b3e761cf54f7b0.json
@@ -3,12 +3,12 @@
"version": 1,
"artifactId": "agentskit-docs-v1",
"siteId": "agentskit-docs",
- "generatedAt": "2026-08-12T14:49:32-03:00",
+ "generatedAt": "2026-08-12T22:55:06-03:00",
"entries": [
{
"id": "claim.catalog-models",
"kind": "restricted-faq",
- "label": "5162 models",
+ "label": "6293 models",
"match": {
"type": "exact",
"values": [
@@ -18,7 +18,7 @@
]
},
"answer": {
- "markdown": "The verified AgentsKit ledger currently reports **5162 models**. The public conservative floor is 5000.",
+ "markdown": "The verified AgentsKit ledger currently reports **6293 models**. The public conservative floor is 6000.",
"citations": [
{
"id": "claim-catalog-models",
@@ -31,7 +31,7 @@
{
"id": "claim.catalog-providers",
"kind": "restricted-faq",
- "label": "140 providers",
+ "label": "184 providers",
"match": {
"type": "exact",
"values": [
@@ -41,7 +41,7 @@
]
},
"answer": {
- "markdown": "The verified AgentsKit ledger currently reports **140 providers**. The public conservative floor is 140.",
+ "markdown": "The verified AgentsKit ledger currently reports **184 providers**. The public conservative floor is 180.",
"citations": [
{
"id": "claim-catalog-providers",
@@ -2260,5 +2260,5 @@
}
}
],
- "contentHash": "sha256:ce7d63954d1c58c4c3dbe5b425f6768be3b7eb499df843c8e67ab0eefadda8b5"
+ "contentHash": "sha256:70679069128f2f8f0f8facd3c57f0669cce1bff59cc8dc39c8b3e761cf54f7b0"
}
diff --git a/apps/docs-next/scripts/gen-api.mjs b/apps/docs-next/scripts/gen-api.mjs
index 80bd4fc7..e60ae314 100644
--- a/apps/docs-next/scripts/gen-api.mjs
+++ b/apps/docs-next/scripts/gen-api.mjs
@@ -107,7 +107,10 @@ function postprocess(dir, pkgName) {
const raw = readFileSync(p, 'utf8')
const isReadme = entry.name === 'README.md'
const title = isReadme ? `@agentskit/${pkgName}` : entry.name.replace(/\.md$/, '')
- const description = `Auto-generated API reference for ${title}.`
+ const description =
+ pkgName === 'core' && title === 'ArgsValidator'
+ ? 'ArgsValidator contract for validating TypeScript AI agent tool arguments against JSON Schema before execution.'
+ : `Auto-generated API reference for ${title}.`
const frontmatter = `---\ntitle: ${JSON.stringify(title)}\ndescription: ${JSON.stringify(description)}\n---\n\n`
const body = escapeMdx(raw)
const newPath = isReadme ? join(d, 'index.md') : p
diff --git a/apps/docs-next/scripts/gen-deterministic-knowledge.mjs b/apps/docs-next/scripts/gen-deterministic-knowledge.mjs
index dea43a2b..62e40cc2 100644
--- a/apps/docs-next/scripts/gen-deterministic-knowledge.mjs
+++ b/apps/docs-next/scripts/gen-deterministic-knowledge.mjs
@@ -16,11 +16,40 @@ import {
const appRoot = join(dirname(fileURLToPath(import.meta.url)), '..')
const repoRoot = join(appRoot, '../..')
-const generatedAt = process.env.DETERMINISTIC_KNOWLEDGE_GENERATED_AT ?? execFileSync(
- 'git',
- ['log', '-1', '--format=%cI', '--', '.doc-bridge/index.json', 'ecosystem-claims.json', 'ecosystem.json', 'apps/docs-next/scripts/gen-deterministic-knowledge.mjs'],
- { cwd: repoRoot, encoding: 'utf8' },
-).trim()
+const gitValue = (args) => {
+ try {
+ return execFileSync('git', args, { cwd: repoRoot, encoding: 'utf8' }).trim()
+ } catch {
+ return ''
+ }
+}
+const isValidGeneratedAt = (value) => {
+ if (typeof value !== 'string' || value.trim() === '') return false
+ const timestamp = Date.parse(value)
+ return Number.isFinite(timestamp) && timestamp !== 0
+}
+const existingGeneratedAt = async () => {
+ try {
+ return JSON.parse(await readFile(join(appRoot, 'lib/deterministic-knowledge.generated.json'), 'utf8')).generatedAt
+ } catch {
+ return ''
+ }
+}
+const resolveGeneratedAt = async () => {
+ const generatedAt = [
+ process.env.DETERMINISTIC_KNOWLEDGE_GENERATED_AT,
+ await existingGeneratedAt(),
+ gitValue(['log', '-1', '--format=%cI', '--', '.doc-bridge/index.json', 'ecosystem-claims.json', 'ecosystem.json']),
+ process.env.VERCEL_GIT_COMMIT_COMMITTED_DATE,
+ ].find(isValidGeneratedAt)
+ if (!generatedAt) {
+ throw new Error(
+ 'Missing deterministic knowledge generatedAt. Set DETERMINISTIC_KNOWLEDGE_GENERATED_AT or VERCEL_GIT_COMMIT_COMMITTED_DATE, keep a valid generatedAt in the checked-in artifact, or run from a git checkout.',
+ )
+ }
+ return generatedAt
+}
+const generatedAt = await resolveGeneratedAt()
const budgetBytes = 96 * 1024
const readJson = async path => JSON.parse(await readFile(join(repoRoot, path), 'utf8'))
@@ -177,5 +206,5 @@ await Promise.all([
writeFile(join(publicDir, `${contentHash.slice('sha256:'.length)}.json`), serializedArtifact),
])
-const revision = execFileSync('git', ['rev-parse', '--short', 'HEAD'], { cwd: repoRoot, encoding: 'utf8' }).trim()
+const revision = process.env.VERCEL_GIT_COMMIT_SHA?.slice(0, 7) || gitValue(['rev-parse', '--short', 'HEAD']) || 'source-archive'
console.log(`deterministic knowledge: ${entries.length} entries, ${byteLength}/${budgetBytes} bytes, ${contentHash}, source ${revision}`)
diff --git a/apps/docs-next/tests/deterministic-docs-answers.test.mjs b/apps/docs-next/tests/deterministic-docs-answers.test.mjs
index 81989c60..d6c82a35 100644
--- a/apps/docs-next/tests/deterministic-docs-answers.test.mjs
+++ b/apps/docs-next/tests/deterministic-docs-answers.test.mjs
@@ -54,9 +54,12 @@ test('the generated artifact is schema-valid, hash-anchored, compact, and conten
test('generation is byte-identical for unchanged canonical inputs', () => {
const beforeArtifact = readFileSync(artifactPath, 'utf8')
const beforeSite = readFileSync(sitePath, 'utf8')
+ const env = { ...process.env, VERCEL_GIT_COMMIT_COMMITTED_DATE: '2099-01-01T00:00:00.000Z' }
+ delete env.DETERMINISTIC_KNOWLEDGE_GENERATED_AT
const generated = spawnSync('pnpm', ['--filter', '@agentskit/docs-next', 'gen:deterministic-knowledge'], {
cwd: REPO_ROOT,
encoding: 'utf8',
+ env,
})
assert.equal(generated.status, 0, generated.stderr)
assert.equal(readFileSync(artifactPath, 'utf8'), beforeArtifact)
@@ -150,7 +153,7 @@ test('the real widget composes published AgentsChat local-first contracts', () =
assert.match(widget, /choiceSubmission: adapter\.resolveChoiceSubmission/)
assert.match(widget, /fallbackMode: deterministicSite\.fallback\.mode/)
assert.match(widget, /data-ak-answer-path/)
- assert.match(docsPackage, /"@agentskit\/chat": "0\.3\.0"/)
+ assert.match(docsPackage, /"@agentskit\/chat": "0\.4\.0"/)
assert.doesNotMatch(docsPackage, /"@agentskit\/chat-(?:protocol|react)":/)
assert.doesNotMatch(rootPackage, /"@agentskit\/chat(?:-protocol)?":/)
assert.doesNotMatch(widget, /function normalizeDeterministic|new Map)"']+/g) ?? []
+ return candidates.some((candidate) => {
+ try {
+ const url = new URL(candidate)
+ return url.host === 'www.agentskit.io' && [...legacyGuidePaths].some((path) => url.pathname.startsWith(path))
+ } catch {
+ return false
+ }
+ })
+}
+
+describe('documentation and package contract surfaces', () => {
+ it('keeps built-in error docs links canonical and documented', () => {
+ const source = read('packages/core/src/errors.ts')
+ const docs = read('apps/docs-next/content/docs/get-started/concepts/errors.mdx')
+ const coreReference = read('apps/docs-next/content/docs/reference/packages/core.mdx')
+
+ expect(source).toContain("${DOCS_BASE}/data/providers")
+ expect(source).toContain("${DOCS_BASE}/agents/tools")
+ expect(source).toContain("${DOCS_BASE}/data/memory")
+ expect(source).toContain("${DOCS_BASE}/get-started/concepts/errors")
+
+ for (const code of source.matchAll(/\n\s+(AK_[A-Z0-9_]+):/g)) {
+ expect(docs).toContain(code[1]!)
+ expect(coreReference).toContain(code[1]!)
+ }
+
+ expect(docs).toContain('RuntimeError')
+ expect(docs).toContain('SandboxError')
+ expect(docs).toContain('SkillError')
+ expect(docs).toContain('RagErrorCodes.AK_RAG_RERANK_FAILED')
+ expect(docs).not.toContain('openaiAdapter()')
+ })
+
+ it('keeps package README and metadata links on current guide routes', () => {
+ const packageDirs = [
+ 'adapters', 'angular', 'cli', 'core', 'eval-braintrust', 'eval', 'ink', 'mcp',
+ 'memory', 'observability-langfuse', 'observability', 'rag', 'react-native', 'react',
+ 'runtime', 'sandbox', 'skills', 'solid', 'statechart', 'svelte', 'templates', 'tools',
+ 'validation', 'vue',
+ ]
+
+ for (const packageDir of packageDirs) {
+ const readme = read(`packages/${packageDir}/README.md`)
+ const manifest = JSON.parse(read(`packages/${packageDir}/package.json`)) as { homepage?: string }
+ expect(hasLegacyGuideUrl(readme)).toBe(false)
+ expect(hasLegacyGuideUrl(manifest.homepage ?? '')).toBe(false)
+ }
+
+ expect(read('packages/mcp/README.md')).toContain('/docs/agents/tools/mcp')
+ expect(read('packages/integrations/README.md')).toContain('/docs/for-agents/integrations')
+ const cliTemplate = read('packages/cli/src/init.ts')
+ expect(cliTemplate).toContain('https://www.agentskit.io/docs/get-started/concepts/skill')
+ expect(cliTemplate).toContain('https://www.agentskit.io/docs/reference/recipes/rag-chat')
+ expect(cliTemplate).not.toContain('https://www.agentskit.io/docs/concepts/skill')
+ expect(cliTemplate).not.toContain('https://www.agentskit.io/docs/recipes/rag-chat')
+ })
+
+ it('keeps high-use RAG and UI pages free of known invented signatures', () => {
+ const pages = [
+ 'data/rag/create-rag.mdx',
+ 'data/rag/rerank.mdx',
+ 'data/rag/loaders.mdx',
+ 'data/rag/chunking.mdx',
+ 'data/providers/embedders.mdx',
+ 'ui/use-chat.mdx',
+ ].map((path) => readFileSync(resolve(docsRoot, path), 'utf8')).join('\n')
+ const executableSnippets = [...pages.matchAll(/```(?:ts|tsx)\n([\s\S]*?)```/g)]
+ .map((match) => match[1]!)
+ .join('\n')
+
+ expect(executableSnippets).not.toContain('cohereReranker')
+ expect(executableSnippets).not.toContain('bgeReranker')
+ expect(executableSnippets).not.toContain("split: 'paragraph'")
+ expect(pages).not.toContain('LoadedDocument[]')
+ expect(pages).not.toContain('awaiting-tool')
+ expect(pages).not.toContain('rag?: Retriever')
+ expect(pages).not.toContain('system?: string')
+ expect(pages).toContain('createRerankedRetriever(base,')
+ expect(pages).toContain('chunkText(text,')
+ expect(pages).toContain('type EmbedFn = (text: string) => Promise')
+ })
+
+ it('keeps contributor and package handoff paths on the current docs tree', () => {
+ expect(read('CONTRIBUTING.md')).not.toContain('content/docs/recipes/')
+ expect(read('packages/react/CONVENTIONS.md')).not.toContain('content/docs/recipes/')
+ expect(read('packages/react/CONVENTIONS.md')).toContain('content/docs/reference/recipes/custom-adapter.mdx')
+ })
+})
diff --git a/apps/docs-next/tests/legacy-redirects.test.ts b/apps/docs-next/tests/legacy-redirects.test.ts
new file mode 100644
index 00000000..9385268d
--- /dev/null
+++ b/apps/docs-next/tests/legacy-redirects.test.ts
@@ -0,0 +1,58 @@
+import { readdirSync, statSync } from 'node:fs'
+import { resolve } from 'node:path'
+import { describe, expect, it } from 'vitest'
+import { LEGACY_404_REDIRECTS } from '../legacy-404-redirects.mjs'
+
+type LegacyRedirect = {
+ source: string
+ destination: string
+ permanent: boolean
+}
+
+const redirects = LEGACY_404_REDIRECTS as LegacyRedirect[]
+
+function docRoutes(): Set {
+ const root = resolve(__dirname, '../content/docs')
+ const routes = new Set(['/docs'])
+
+ function walk(directory: string): void {
+ for (const name of readdirSync(directory)) {
+ const path = resolve(directory, name)
+ if (statSync(path).isDirectory()) {
+ walk(path)
+ continue
+ }
+ if (!/\.(md|mdx)$/.test(name)) continue
+
+ const relative = path
+ .slice(root.length + 1)
+ .replaceAll('\\', '/')
+ .replace(/\.(md|mdx)$/, '')
+ routes.add(relative.endsWith('/index') ? `/docs/${relative.slice(0, -6)}` : `/docs/${relative}`)
+ }
+ }
+
+ walk(root)
+ return routes
+}
+
+describe('legacy 404 redirects', () => {
+ it('keeps the importable queue unique, permanent, and one-hop', () => {
+ const sources = redirects.map((redirect) => redirect.source)
+ const sourceSet = new Set(sources)
+
+ expect(sources.length).toBe(203)
+ expect(sourceSet.size).toBe(sources.length)
+ expect(redirects.every((redirect) => redirect.permanent)).toBe(true)
+ expect(redirects.every((redirect) => !sourceSet.has(redirect.destination))).toBe(true)
+ })
+
+ it('keeps every queued destination backed by a current docs route', () => {
+ const routes = docRoutes()
+ const missing = redirects
+ .map((redirect) => redirect.destination)
+ .filter((destination) => !routes.has(destination))
+
+ expect(missing).toEqual([])
+ })
+})
diff --git a/apps/docs-next/tests/seo-surfaces.test.ts b/apps/docs-next/tests/seo-surfaces.test.ts
new file mode 100644
index 00000000..1706b2e0
--- /dev/null
+++ b/apps/docs-next/tests/seo-surfaces.test.ts
@@ -0,0 +1,191 @@
+import { readFileSync } from 'node:fs'
+import { resolve } from 'node:path'
+import { describe, expect, it, vi } from 'vitest'
+import { counts, lists } from '../lib/ecosystem-stats'
+
+vi.mock('@/lib/source', () => ({
+ source: { getPages: () => [] },
+}))
+vi.mock('@/lib/blog', () => ({ slugsOfAll: () => [] }))
+vi.mock('@/lib/learn-steps', () => ({ STEPS: [] }))
+vi.mock('@/lib/showcase', () => ({ SHOWCASE: [] }))
+
+import sitemap from '../app/sitemap'
+
+describe('SEO discovery surfaces', () => {
+ it('publishes the ecosystem hub without synthetic modification dates', () => {
+ const entries = sitemap()
+ const urls = entries.map((entry) => entry.url)
+
+ expect(urls).toContain('https://www.agentskit.io/ecosystem')
+ expect(urls).toContain('https://www.agentskit.io/integrations')
+ expect(urls).toContain('https://www.agentskit.io/recipes')
+ expect(urls).toContain('https://www.agentskit.io/publications')
+ expect(new Set(urls).size).toBe(urls.length)
+ expect(entries.every((entry) => entry.lastModified === undefined)).toBe(true)
+ })
+
+ it('links the ecosystem hub from the LLM index route', () => {
+ const route = readFileSync(resolve(__dirname, '../app/llms.txt/route.ts'), 'utf8')
+
+ expect(route).toContain('/ecosystem): canonical product mesh and package matrix')
+ expect(route).toContain('/integrations): verified connectors for TypeScript AI agents')
+ expect(route).toContain('/recipes): copy-paste implementation patterns for production agents')
+ expect(route).toContain('/publications): first-party releases and engineering deep dives')
+ expect(route).toContain('/resources): verified tools, MCP registries')
+ })
+
+ it('keeps the canonical integration catalog count aligned with its generated list', () => {
+ expect(counts.integrations).toBe(50)
+ expect(lists.integrations).toHaveLength(counts.integrations)
+ expect(new Set(lists.integrations).size).toBe(lists.integrations.length)
+ })
+
+ it('keeps package integration links on the canonical guide instead of the dead package alias', () => {
+ const packageJson = readFileSync(resolve(__dirname, '../../../packages/integrations/package.json'), 'utf8')
+ const readme = readFileSync(resolve(__dirname, '../../../packages/integrations/README.md'), 'utf8')
+ const nextConfig = readFileSync(resolve(__dirname, '../next.config.mjs'), 'utf8')
+ const specificRedirect = nextConfig.indexOf("source: '/docs/packages/integrations'")
+ const wildcardRedirect = nextConfig.indexOf("source: '/docs/packages/:slug*'")
+
+ expect(packageJson).toContain('https://www.agentskit.io/docs/for-agents/integrations')
+ expect(readme).not.toContain('https://www.agentskit.io/docs/packages/integrations')
+ expect(readme).toContain('https://www.agentskit.io/docs/for-agents/integrations')
+ expect(specificRedirect).toBeGreaterThan(-1)
+ expect(specificRedirect).toBeLessThan(wildcardRedirect)
+ })
+
+ it('keeps the resources title concise while preserving proof intent', () => {
+ const page = readFileSync(resolve(__dirname, '../app/resources/page.tsx'), 'utf8')
+
+ expect(page).toContain("title: 'Resources: proofs, registries, publications'")
+ expect('Resources: proofs, registries, publications | AgentsKit.js'.length).toBeLessThanOrEqual(60)
+ })
+
+ it('embeds a two-item BreadcrumbList on the canonical hubs', () => {
+ const hubs = [
+ ['../app/ecosystem/page.tsx', '/ecosystem'],
+ ['../app/integrations/page.tsx', '/integrations'],
+ ['../app/recipes/page.tsx', '/recipes'],
+ ['../app/publications/page.tsx', '/publications'],
+ ['../app/resources/page.tsx', '/resources'],
+ ] as const
+
+ for (const [relativePath, hubPath] of hubs) {
+ const page = readFileSync(resolve(__dirname, relativePath), 'utf8')
+
+ expect(page).toContain('BreadcrumbList')
+ expect(page).toContain("canonicalUrl('/')")
+ expect(page).toContain(`canonicalUrl('${hubPath}')`)
+ }
+ })
+
+ it('keeps the HITL agent guide title, description, and canonical deep links', () => {
+ const page = readFileSync(resolve(__dirname, '../content/docs/agents/hitl.mdx'), 'utf8')
+
+ expect(page).toContain('title: Human-in-the-loop patterns for AI agents')
+ expect(page).toMatch(
+ /description: ['"]?Practical approval patterns for TypeScript AI agents: gated tool calls, review queues, approver policies, and safe resume flows\.['"]?/,
+ )
+ expect(page).toContain('/docs/reference/recipes/hitl-approvals')
+ expect(page).toContain('/docs/ui/tool-confirmation')
+ })
+
+ it('points the tools guide at the live integration catalog instead of the stale IA rollout note', () => {
+ const page = readFileSync(resolve(__dirname, '../content/docs/agents/tools/index.mdx'), 'utf8')
+
+ expect(page).toContain('/integrations')
+ expect(page).toContain('/docs/for-agents/integrations')
+ expect(page).toContain('50 service descriptors')
+ expect(page).not.toContain('land in step 6')
+ })
+
+ it('overrides the ArgsValidator API description without changing the generated fallback', () => {
+ const page = readFileSync(
+ resolve(__dirname, '../content/docs/api/core/type-aliases/ArgsValidator.md'),
+ 'utf8',
+ )
+ const script = readFileSync(resolve(__dirname, '../scripts/gen-api.mjs'), 'utf8')
+ const description =
+ 'ArgsValidator contract for validating TypeScript AI agent tool arguments against JSON Schema before execution.'
+
+ expect(page).toContain(`description: ${JSON.stringify(description)}`)
+ expect(script).toContain(`pkgName === 'core' && title === 'ArgsValidator'`)
+ expect(script).toContain(description)
+ expect(script).toContain('Auto-generated API reference for ${title}.')
+ })
+
+ it('does not declare a self-redirect for /docs/agents/tools and filters source === destination', () => {
+ const nextConfig = readFileSync(resolve(__dirname, '../next.config.mjs'), 'utf8')
+
+ expect(nextConfig).not.toContain(
+ "{ source: '/docs/agents/tools', destination: '/docs/agents/tools'",
+ )
+ expect(nextConfig).toContain('r.source !== r.destination')
+ })
+
+ it('documents grokEmbedder with an explicit required model', () => {
+ const page = readFileSync(
+ resolve(__dirname, '../content/docs/data/providers/grok-embedder.mdx'),
+ 'utf8',
+ )
+
+ expect(page).toContain("model: 'grok-embed-model'")
+ expect(page.replaceAll('`', '')).toContain('| model | string | required |')
+ expect(page).toContain(
+ 'description: xAI embedding models through the OpenAI-compatible embeddings API.',
+ )
+ expect(page).not.toContain('provider default')
+ })
+
+ it('documents createHybridRetriever with the real Retriever-first signature', () => {
+ const page = readFileSync(resolve(__dirname, '../content/docs/data/rag/hybrid.mdx'), 'utf8')
+ const snippet = page.match(/```ts\n([\s\S]*?)```/)?.[1] ?? ''
+
+ expect(page).toContain('createHybridRetriever(baseRetriever')
+ expect(page).toContain('vectorWeight')
+ expect(page).toContain('bm25Weight')
+ expect(snippet).not.toContain('lexical')
+ expect(snippet).not.toContain('weights:')
+ expect(snippet).not.toContain('vector: rag')
+ })
+
+ it('replaces stale IA rollout notes with live section links', () => {
+ const pages = [
+ [
+ '../content/docs/agents/skills/index.mdx',
+ ['/docs/reference/recipes/skill-marketplace'],
+ ],
+ [
+ '../content/docs/data/memory/index.mdx',
+ ['/docs/reference/recipes/vector-adapters'],
+ ],
+ ['../content/docs/data/providers/index.mdx', ['./choosing']],
+ [
+ '../content/docs/data/rag/index.mdx',
+ ['/docs/reference/recipes/doc-loaders', '/docs/reference/recipes/rag-reranking'],
+ ],
+ ['../content/docs/production/cli/index.mdx', ['./ai', './dev']],
+ [
+ '../content/docs/reference/specs/index.mdx',
+ ['./a2a', './manifest', './eval-format'],
+ ],
+ [
+ '../content/docs/reference/contribute/rfc-process.mdx',
+ ['https://github.com/AgentsKit-io/agentskit/tree/main/docs/architecture/adrs'],
+ ],
+ ] as const
+
+ for (const [relativePath, links] of pages) {
+ const page = readFileSync(resolve(__dirname, relativePath), 'utf8')
+
+ expect(page).not.toContain('land in step')
+ expect(page).not.toContain('Coming soon')
+ expect(page).not.toContain('docs IA rollout')
+
+ for (const link of links) {
+ expect(page).toContain(link)
+ }
+ }
+ })
+})
diff --git a/apps/docs-next/tests/site-icons.test.ts b/apps/docs-next/tests/site-icons.test.ts
index f983a921..9cd812ba 100644
--- a/apps/docs-next/tests/site-icons.test.ts
+++ b/apps/docs-next/tests/site-icons.test.ts
@@ -1,8 +1,9 @@
import { existsSync, readFileSync } from 'node:fs'
import { join } from 'node:path'
import { describe, expect, it } from 'vitest'
+import { REPO_ROOT } from '../../../scripts/compute-stats.mjs'
-const publicDir = join(process.cwd(), 'apps/docs-next/public')
+const publicDir = join(REPO_ROOT, 'apps/docs-next/public')
describe('site icon fallbacks', () => {
it.each([
diff --git a/apps/docs-next/vitest.config.ts b/apps/docs-next/vitest.config.ts
new file mode 100644
index 00000000..bfa4843e
--- /dev/null
+++ b/apps/docs-next/vitest.config.ts
@@ -0,0 +1,15 @@
+import { resolve } from 'node:path'
+import { defineConfig } from 'vitest/config'
+
+export default defineConfig({
+ root: __dirname,
+ resolve: {
+ alias: {
+ '@': resolve(__dirname),
+ },
+ },
+ test: {
+ environment: 'node',
+ include: ['tests/**/*.test.ts', 'tests/**/*.test.mjs'],
+ },
+})
diff --git a/docs/evidence/ecosystem-documentation-quality/agentskit.json b/docs/evidence/ecosystem-documentation-quality/agentskit.json
index 83ecabb1..cd310304 100644
--- a/docs/evidence/ecosystem-documentation-quality/agentskit.json
+++ b/docs/evidence/ecosystem-documentation-quality/agentskit.json
@@ -4,19 +4,42 @@
"profileVersion": 1,
"productId": "agentskit",
"repo": "AgentsKit-io/agentskit",
- "commit": "69a850403dd08619ded6d191dbb190f0a4a3dd99",
- "auditedOn": "2026-07-28",
+ "commit": "f7affa991c1720fa4eaba382d51628174516defd",
+ "auditedOn": "2026-08-13",
"docBridge": {
"artifact": "docs/evidence/ecosystem-documentation-quality/doc-bridge/agentskit.json",
"doctorScore": 100,
- "coverage": { "agent": { "ready": 25, "total": 25 }, "human": { "ready": 25, "total": 25 } },
- "conformance": { "requiredPassed": 7, "requiredTotal": 7, "requiredExcepted": 0, "recommendedPassed": 2, "recommendedTotal": 2, "recommendedExcepted": 0 }
+ "coverage": {
+ "agent": {
+ "ready": 25,
+ "total": 25
+ },
+ "human": {
+ "ready": 25,
+ "total": 25
+ }
+ },
+ "conformance": {
+ "requiredPassed": 7,
+ "requiredTotal": 7,
+ "requiredExcepted": 0,
+ "recommendedPassed": 2,
+ "recommendedTotal": 2,
+ "recommendedExcepted": 0
+ }
+ },
+ "attestation": {
+ "sourceMode": "commit",
+ "contentDigest": "sha256:a992df46d9e5e4267abcb99edc6059d62b9c887a88c905c21e3fbda2bdb6b5d9"
},
- "attestation": { "sourceMode": "commit", "contentDigest": "sha256:79521950d640005a0594c28e3d1d7493981621cdb35641a0a538a875661470e5" },
"machineSurfaces": {
"llmsTxt": "llms.txt",
"llmsFullTxt": "apps/docs-next/app/llms-full.txt/route.ts",
- "rawSources": ["README.md", "apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx", "apps/docs-next/content/docs/for-agents/index.mdx"],
+ "rawSources": [
+ "README.md",
+ "apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx",
+ "apps/docs-next/content/docs/for-agents/index.mdx"
+ ],
"forAgents": "apps/docs-next/content/docs/for-agents/index.mdx"
},
"narrative": {
@@ -25,18 +48,78 @@
"humanDocs": "apps/docs-next/content/docs/index.mdx",
"forAgents": "apps/docs-next/content/docs/for-agents/index.mdx",
"keyJourneys": [
- { "id": "build-first-agent", "path": "apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx", "wordCount": 353, "visualDecision": "diagram", "evidence": ["apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx#execution-flow"] },
- { "id": "architecture-at-a-glance", "path": "apps/docs-next/content/docs/get-started/architecture-at-a-glance.mdx", "wordCount": 372, "visualDecision": "diagram", "evidence": ["apps/docs-next/content/docs/get-started/architecture-at-a-glance.mdx#the-stack-in-one-view"] },
- { "id": "deterministic-docs-answers", "path": "apps/docs-next/content/docs/cookbook/deterministic-docs-answers.mdx", "wordCount": 337, "visualDecision": "diagram", "evidence": ["apps/docs-next/content/docs/cookbook/deterministic-docs-answers.mdx#architecture"] }
+ {
+ "id": "build-first-agent",
+ "path": "apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx",
+ "wordCount": 353,
+ "visualDecision": "diagram",
+ "evidence": [
+ "apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx#execution-flow"
+ ]
+ },
+ {
+ "id": "architecture-at-a-glance",
+ "path": "apps/docs-next/content/docs/get-started/architecture-at-a-glance.mdx",
+ "wordCount": 372,
+ "visualDecision": "diagram",
+ "evidence": [
+ "apps/docs-next/content/docs/get-started/architecture-at-a-glance.mdx#the-stack-in-one-view"
+ ]
+ },
+ {
+ "id": "deterministic-docs-answers",
+ "path": "apps/docs-next/content/docs/cookbook/deterministic-docs-answers.mdx",
+ "wordCount": 337,
+ "visualDecision": "diagram",
+ "evidence": [
+ "apps/docs-next/content/docs/cookbook/deterministic-docs-answers.mdx#architecture"
+ ]
+ }
]
},
"discovery": {
- "globalProductIds": ["agentskit", "registry", "agentskit-chat", "playbook", "doc-bridge", "code-review", "akos"],
- "siblingProductIds": ["registry", "agentskit-chat", "playbook", "doc-bridge", "code-review", "akos"],
+ "globalProductIds": [
+ "agentskit",
+ "registry",
+ "agentskit-chat",
+ "playbook",
+ "doc-bridge",
+ "code-review",
+ "akos"
+ ],
+ "siblingProductIds": [
+ "registry",
+ "agentskit-chat",
+ "playbook",
+ "doc-bridge",
+ "code-review",
+ "akos"
+ ],
"contextualHooks": [
- { "id": "documentation", "status": "linked", "targetProductId": "doc-bridge", "evidence": ["apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx"] },
- { "id": "chat", "status": "linked", "targetProductId": "agentskit-chat", "evidence": ["apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx"] },
- { "id": "enterprise", "status": "linked", "targetProductId": "akos", "evidence": ["apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx"] }
+ {
+ "id": "documentation",
+ "status": "linked",
+ "targetProductId": "doc-bridge",
+ "evidence": [
+ "apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx"
+ ]
+ },
+ {
+ "id": "chat",
+ "status": "linked",
+ "targetProductId": "agentskit-chat",
+ "evidence": [
+ "apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx"
+ ]
+ },
+ {
+ "id": "enterprise",
+ "status": "linked",
+ "targetProductId": "akos",
+ "evidence": [
+ "apps/docs-next/content/docs/get-started/getting-started/build-your-first-agent.mdx"
+ ]
+ }
]
}
}
diff --git a/docs/evidence/ecosystem-documentation-quality/doc-bridge/agentskit.json b/docs/evidence/ecosystem-documentation-quality/doc-bridge/agentskit.json
index 23ab4a00..09410c58 100644
--- a/docs/evidence/ecosystem-documentation-quality/doc-bridge/agentskit.json
+++ b/docs/evidence/ecosystem-documentation-quality/doc-bridge/agentskit.json
@@ -1 +1 @@
-{"schemaVersion":1,"protocol":"agentskit.doc-bridge.attestation","productId":"agentskit","repo":"AgentsKit-io/agentskit","commit":"69a850403dd08619ded6d191dbb190f0a4a3dd99","sourceMode":"commit","contentDigest":"sha256:79521950d640005a0594c28e3d1d7493981621cdb35641a0a538a875661470e5","command":"pnpm docs:bridge:doctor && pnpm docs:bridge:gate","metrics":{"doctorScore":100,"coverage":{"agent":{"ready":25,"total":25},"human":{"ready":25,"total":25}},"conformance":{"requiredPassed":7,"requiredTotal":7,"requiredExcepted":0,"recommendedPassed":2,"recommendedTotal":2,"recommendedExcepted":0}}}
+{"schemaVersion":1,"protocol":"agentskit.doc-bridge.attestation","productId":"agentskit","repo":"AgentsKit-io/agentskit","commit":"f7affa991c1720fa4eaba382d51628174516defd","sourceMode":"commit","contentDigest":"sha256:a992df46d9e5e4267abcb99edc6059d62b9c887a88c905c21e3fbda2bdb6b5d9","command":"pnpm docs:bridge:doctor && pnpm docs:bridge:gate","metrics":{"doctorScore":100,"coverage":{"agent":{"ready":25,"total":25},"human":{"ready":25,"total":25}},"conformance":{"requiredPassed":7,"requiredTotal":7,"requiredExcepted":0,"recommendedPassed":2,"recommendedTotal":2,"recommendedExcepted":0}}}
diff --git a/packages/adapters/README.md b/packages/adapters/README.md
index fc3cb1e3..a4ff5ce0 100644
--- a/packages/adapters/README.md
+++ b/packages/adapters/README.md
@@ -18,7 +18,7 @@ Connect to any LLM provider — and swap between them — without touching your
## Verified proof
- Package metadata and tests live under `packages/adapters/`.
-- Package guide: https://www.agentskit.io/docs/packages/adapters
+- Package guide: https://www.agentskit.io/docs/reference/packages/adapters
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,12 +30,12 @@ Connect to any LLM provider — and swap between them — without touching your
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/adapters) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/adapters) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why adapters
- **Vendor independence** — switch from OpenAI to Anthropic to a local Ollama model by changing one line; your hooks, runtime, and tools stay untouched
-- **20+ providers included** — Anthropic, OpenAI, Gemini, Ollama, DeepSeek, Grok, Kimi, Mistral, Cohere, Together, Groq, Fireworks, OpenRouter, Hugging Face, LM Studio, vLLM, llama.cpp, LangChain, Vercel AI SDK, and any raw `ReadableStream`
+- **25 native adapters in the catalog** — Anthropic, OpenAI, Gemini, Ollama, DeepSeek, Grok, Kimi, Mistral, Cohere, Together, Groq, Fireworks, OpenRouter, Hugging Face, LM Studio, vLLM, llama.cpp, LangChain, Vercel AI SDK, and additional compatible providers
- **Embedder functions built in** — the same adapter pattern covers text embeddings, so you can reuse provider config for both chat and RAG
- **One-line local AI** — `ollama({ model: 'llama3.1' })` for fully offline agents with no API key required
@@ -110,7 +110,7 @@ const router = createRouter({
})
```
-See [Adapter router](https://www.agentskit.io/docs/recipes/adapter-router), [Ensemble](https://www.agentskit.io/docs/recipes/adapter-ensemble), and [Fallback chain](https://www.agentskit.io/docs/recipes/fallback-chain).
+See [Adapter router](https://www.agentskit.io/docs/reference/recipes/adapter-router), [Ensemble](https://www.agentskit.io/docs/reference/recipes/adapter-ensemble), and [Fallback chain](https://www.agentskit.io/docs/reference/recipes/fallback-chain).
## Ecosystem
diff --git a/packages/adapters/package.json b/packages/adapters/package.json
index d036729b..f41043f1 100644
--- a/packages/adapters/package.json
+++ b/packages/adapters/package.json
@@ -89,7 +89,7 @@
"stabilityNote": "Contract v1 is mechanically covered across fetch adapters and provider-specific resilience suites; stable promotion awaits soak and qualifying minor releases."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/adapters",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/adapters",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/angular/README.md b/packages/angular/README.md
index 8853ef39..a1b71644 100644
--- a/packages/angular/README.md
+++ b/packages/angular/README.md
@@ -18,7 +18,7 @@ Angular 18+ service (Signal + RxJS) + headless chat components. Same `ChatReturn
## Verified proof
- Package metadata and tests live under `packages/angular/`.
-- Package guide: https://www.agentskit.io/docs/packages/angular
+- Package guide: https://www.agentskit.io/docs/reference/packages/angular
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ Angular 18+ service (Signal + RxJS) + headless chat components. Same `ChatReturn
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/angular) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/angular) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why
@@ -117,7 +117,7 @@ MIT — see [LICENSE](../../LICENSE).
## Docs
-[Full documentation](https://www.agentskit.io/docs/packages/angular) · [GitHub](https://github.com/AgentsKit-io/agentskit)
+[Full documentation](https://www.agentskit.io/docs/reference/packages/angular) · [GitHub](https://github.com/AgentsKit-io/agentskit)
## Maturity and compatibility
diff --git a/packages/angular/package.json b/packages/angular/package.json
index 2c1ba54c..a5b8eeae 100644
--- a/packages/angular/package.json
+++ b/packages/angular/package.json
@@ -77,7 +77,7 @@
"stabilityNote": "AgentskitChat service (ChatReturn contract) + full headless component parity with @agentskit/react (standalone, partial-Ivy AOT/APF)."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/angular",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/angular",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/cli/README.md b/packages/cli/README.md
index 7fbcea3d..50001bc6 100644
--- a/packages/cli/README.md
+++ b/packages/cli/README.md
@@ -20,7 +20,7 @@ Chat with any LLM, scaffold projects, and run agents — all from your terminal.
## Verified proof
- Package metadata and tests live under `packages/cli/`.
-- Package guide: https://www.agentskit.io/docs/packages/cli
+- Package guide: https://www.agentskit.io/docs/reference/packages/cli
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -32,7 +32,7 @@ Chat with any LLM, scaffold projects, and run agents — all from your terminal.
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/cli) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/cli) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why cli
@@ -94,7 +94,7 @@ agentskit run --help
- Built-in live providers include OpenAI, Anthropic, Gemini, DeepSeek, Grok, Kimi, Groq, and OpenRouter; Ollama remains local and keyless
- `agentskit init --provider deepseek|grok|kimi|groq|openrouter` — scaffold a starter already wired to the selected provider
-Full reference: [docs/infrastructure/cli](https://www.agentskit.io/docs/infrastructure/cli) · [ARCHITECTURE.md](./ARCHITECTURE.md)
+Full reference: [docs/production/cli](https://www.agentskit.io/docs/production/cli) · [ARCHITECTURE.md](./ARCHITECTURE.md)
### agentskit doctor
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 97e256f7..15833d9b 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -84,7 +84,7 @@
"stabilityNote": "chat, init, run commands stable."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/cli",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/cli",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/cli/src/init.ts b/packages/cli/src/init.ts
index a177d9e1..25bfcd3c 100644
--- a/packages/cli/src/init.ts
+++ b/packages/cli/src/init.ts
@@ -1483,8 +1483,8 @@ ${runCmd}
## Next steps
- Open the AgentsKit docs at https://www.agentskit.io/docs
-- Add a custom skill: https://www.agentskit.io/docs/concepts/skill
-- Wire up RAG: https://www.agentskit.io/docs/recipes/rag-chat
+- Add a custom skill: https://www.agentskit.io/docs/get-started/concepts/skill
+- Wire up RAG: https://www.agentskit.io/docs/reference/recipes/rag-chat
## License
diff --git a/packages/core/README.md b/packages/core/README.md
index 5cb99821..af1cf33d 100644
--- a/packages/core/README.md
+++ b/packages/core/README.md
@@ -18,7 +18,7 @@ The zero-dependency foundation that every AgentsKit package builds on — 5 KB g
## Verified proof
- Package metadata and tests live under `packages/core/`.
-- Package guide: https://www.agentskit.io/docs/packages/core
+- Package guide: https://www.agentskit.io/docs/reference/packages/core
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ The zero-dependency foundation that every AgentsKit package builds on — 5 KB g
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/core) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/core) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why core
@@ -90,11 +90,11 @@ try {
if (err instanceof ToolError) {
// err.code → 'AK_TOOL_EXEC_FAILED'
// err.hint → actionable suggestion
- // err.docsUrl → https://www.agentskit.io/docs/tools
+ // err.docsUrl → https://www.agentskit.io/docs/agents/tools
console.error(err.toString())
// error[AK_TOOL_EXEC_FAILED]: ...
// --> Hint: ...
- // --> Docs: https://www.agentskit.io/docs/tools
+ // --> Docs: https://www.agentskit.io/docs/agents/tools
}
}
```
@@ -107,10 +107,25 @@ Available error codes (via `ErrorCodes`):
| `AK_ADAPTER_STREAM_FAILED` | streaming call to the provider fails |
| `AK_TOOL_NOT_FOUND` | requested tool name is not registered |
| `AK_TOOL_EXEC_FAILED` | `execute()` throws |
+| `AK_TOOL_PEER_MISSING` | optional tool peer dependency is not installed |
+| `AK_TOOL_INVALID_INPUT` | tool arguments or proposal are invalid |
+| `AK_TOOL_QUOTA_EXCEEDED` | tool execution exceeds its configured quota |
+| `AK_TOOL_FORBIDDEN` | tool execution is denied by policy |
| `AK_MEMORY_LOAD_FAILED` | memory.load() fails |
| `AK_MEMORY_SAVE_FAILED` | memory.save() fails |
| `AK_MEMORY_DESERIALIZE_FAILED` | persisted state is corrupt |
+| `AK_MEMORY_PEER_MISSING` | optional memory backend is not installed |
+| `AK_MEMORY_REMOTE_HTTP` | remote memory request fails |
| `AK_CONFIG_INVALID` | required config is missing or wrong type |
+| `AK_RUNTIME_INVALID_INPUT` | runtime input is invalid |
+| `AK_RUNTIME_STEP_FAILED` | a runtime step fails |
+| `AK_RUNTIME_DELEGATE_FAILED` | delegated agent execution fails |
+| `AK_SANDBOX_DENIED` | sandbox policy denies execution |
+| `AK_SANDBOX_INVALID_TOOL` | tool is not valid for the sandbox |
+| `AK_SANDBOX_PEER_MISSING` | optional sandbox backend is not installed |
+| `AK_SANDBOX_BACKEND_FAILED` | sandbox backend fails |
+| `AK_SKILL_INVALID` | skill definition is invalid |
+| `AK_SKILL_DUPLICATE` | skill identity is duplicated |
## Type-safe tools with `defineTool`
@@ -151,7 +166,7 @@ Use `InferSchemaType` to reference the inferred type elsewhere in
| `@agentskit/core/manifest` | Skill + tool manifest format (MCP-compatible) |
| `@agentskit/core/eval-format` | Portable eval dataset + run-result JSON |
-See each page under [docs.agentskit.io / for-agents](https://www.agentskit.io/docs/for-agents/core) for the full contract.
+See the [core guide for agents](https://www.agentskit.io/docs/for-agents/core) for the full contract.
## Ecosystem
diff --git a/packages/core/package.json b/packages/core/package.json
index f10fd6e3..bcf8f0e3 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -135,7 +135,7 @@
"stabilityNote": "Sacred package. Contract-stable per ADRs 0001-0006."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/core",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/core",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts
index 0a34c734..11def489 100644
--- a/packages/core/src/errors.ts
+++ b/packages/core/src/errors.ts
@@ -11,8 +11,8 @@ const DOCS_BASE = 'https://www.agentskit.io/docs'
* ```
* error[AK_ADAPTER_MISSING]: No adapter provided
* --> Hint: Pass an adapter when creating the chat controller, e.g.
- * createChatController({ adapter: openaiAdapter() })
- * --> Docs: https://www.agentskit.io/docs/adapters
+ * createChatController({ adapter: openai({ apiKey, model: 'gpt-4o' }) })
+ * --> Docs: https://www.agentskit.io/docs/data/providers
* ```
*/
function formatError(code: string, message: string, hint?: string, docsUrl?: string): string {
@@ -64,7 +64,7 @@ export class AdapterError extends AgentsKitError {
docsUrl?: string
cause?: unknown
}) {
- super({ docsUrl: `${DOCS_BASE}/adapters`, ...options })
+ super({ docsUrl: `${DOCS_BASE}/data/providers`, ...options })
this.name = 'AdapterError'
}
}
@@ -77,7 +77,7 @@ export class ToolError extends AgentsKitError {
docsUrl?: string
cause?: unknown
}) {
- super({ docsUrl: `${DOCS_BASE}/tools`, ...options })
+ super({ docsUrl: `${DOCS_BASE}/agents/tools`, ...options })
this.name = 'ToolError'
}
}
@@ -90,7 +90,7 @@ export class MemoryError extends AgentsKitError {
docsUrl?: string
cause?: unknown
}) {
- super({ docsUrl: `${DOCS_BASE}/memory`, ...options })
+ super({ docsUrl: `${DOCS_BASE}/data/memory`, ...options })
this.name = 'MemoryError'
}
}
@@ -103,7 +103,7 @@ export class ConfigError extends AgentsKitError {
docsUrl?: string
cause?: unknown
}) {
- super({ docsUrl: `${DOCS_BASE}/configuration`, ...options })
+ super({ docsUrl: `${DOCS_BASE}/get-started/concepts/errors`, ...options })
this.name = 'ConfigError'
}
}
diff --git a/packages/core/tests/errors.test.ts b/packages/core/tests/errors.test.ts
index 80595dad..d0a9e33d 100644
--- a/packages/core/tests/errors.test.ts
+++ b/packages/core/tests/errors.test.ts
@@ -5,6 +5,9 @@ import {
ToolError,
MemoryError,
ConfigError,
+ RuntimeError,
+ SandboxError,
+ SkillError,
ErrorCodes,
} from '../src/errors'
@@ -84,7 +87,7 @@ describe('AdapterError', () => {
code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,
message: 'stream broke',
})
- expect(err.docsUrl).toContain('/adapters')
+ expect(err.docsUrl).toBe('https://www.agentskit.io/docs/data/providers')
})
it('allows overriding docsUrl', () => {
@@ -106,7 +109,7 @@ describe('ToolError', () => {
expect(err).toBeInstanceOf(AgentsKitError)
expect(err).toBeInstanceOf(ToolError)
expect(err.name).toBe('ToolError')
- expect(err.docsUrl).toContain('/tools')
+ expect(err.docsUrl).toBe('https://www.agentskit.io/docs/agents/tools')
})
})
@@ -119,7 +122,7 @@ describe('MemoryError', () => {
expect(err).toBeInstanceOf(AgentsKitError)
expect(err).toBeInstanceOf(MemoryError)
expect(err.name).toBe('MemoryError')
- expect(err.docsUrl).toContain('/memory')
+ expect(err.docsUrl).toBe('https://www.agentskit.io/docs/data/memory')
})
})
@@ -133,11 +136,25 @@ describe('ConfigError', () => {
expect(err).toBeInstanceOf(AgentsKitError)
expect(err).toBeInstanceOf(ConfigError)
expect(err.name).toBe('ConfigError')
- expect(err.docsUrl).toContain('/configuration')
+ expect(err.docsUrl).toBe('https://www.agentskit.io/docs/get-started/concepts/errors')
expect(err.hint).toBe('check your config object')
})
})
+describe('domain docs links', () => {
+ it('uses canonical docs routes for every built-in error subclass', () => {
+ expect(new RuntimeError({ code: 'AK_TEST', message: 'runtime' }).docsUrl).toBe(
+ 'https://www.agentskit.io/docs/agents/runtime',
+ )
+ expect(new SandboxError({ code: 'AK_TEST', message: 'sandbox' }).docsUrl).toBe(
+ 'https://www.agentskit.io/docs/production/security/mandatory-sandbox',
+ )
+ expect(new SkillError({ code: 'AK_TEST', message: 'skill' }).docsUrl).toBe(
+ 'https://www.agentskit.io/docs/agents/skills',
+ )
+ })
+})
+
describe('ErrorCodes', () => {
it('contains namespaced error codes', () => {
expect(ErrorCodes.AK_ADAPTER_MISSING).toBe('AK_ADAPTER_MISSING')
@@ -162,6 +179,6 @@ describe('toString() multiline format', () => {
expect(lines).toHaveLength(3)
expect(lines[0]).toBe('error[AK_TOOL_NOT_FOUND]: Tool "webSearch" not found or has no execute function')
expect(lines[1]).toBe(' --> Hint: Register the tool in your ChatConfig, e.g. { tools: [webSearchTool] }.')
- expect(lines[2]).toMatch(/^ {2}--> Docs: https:\/\/www\.agentskit\.io\/docs\/tools$/)
+ expect(lines[2]).toMatch(/^ {2}--> Docs: https:\/\/www\.agentskit\.io\/docs\/agents\/tools$/)
})
})
diff --git a/packages/eval-braintrust/README.md b/packages/eval-braintrust/README.md
index 03fe5130..dd69f9db 100644
--- a/packages/eval-braintrust/README.md
+++ b/packages/eval-braintrust/README.md
@@ -17,7 +17,7 @@ Braintrust scoring pipeline for AgentsKit. Ships **8 scorers** in two families a
## Verified proof
- Package metadata and tests live under `packages/eval-braintrust/`.
-- Package guide: https://www.agentskit.io/docs/packages/eval-braintrust
+- Package guide: https://www.agentskit.io/docs/for-agents/eval-braintrust
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -29,7 +29,7 @@ Braintrust scoring pipeline for AgentsKit. Ships **8 scorers** in two families a
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/eval-braintrust) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/for-agents/eval-braintrust) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Install
diff --git a/packages/eval-braintrust/package.json b/packages/eval-braintrust/package.json
index 7c0491d3..43cc5bb3 100644
--- a/packages/eval-braintrust/package.json
+++ b/packages/eval-braintrust/package.json
@@ -66,7 +66,7 @@
"stabilityNote": "Scorer API stable; Braintrust SDK is peer-resolved at runtime."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/eval-braintrust",
+ "homepage": "https://www.agentskit.io/docs/for-agents/eval-braintrust",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/eval/README.md b/packages/eval/README.md
index cdb1a26b..f80d2550 100644
--- a/packages/eval/README.md
+++ b/packages/eval/README.md
@@ -18,7 +18,7 @@ Measure agent quality with numbers, not vibes — ship with confidence.
## Verified proof
- Package metadata and tests live under `packages/eval/`.
-- Package guide: https://www.agentskit.io/docs/packages/eval
+- Package guide: https://www.agentskit.io/docs/reference/packages/eval
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ Measure agent quality with numbers, not vibes — ship with confidence.
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/eval) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/eval) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why eval
diff --git a/packages/eval/package.json b/packages/eval/package.json
index 015e911b..c2551d9e 100644
--- a/packages/eval/package.json
+++ b/packages/eval/package.json
@@ -127,7 +127,7 @@
"stabilityNote": "Core APIs stable; richer metrics and reporters coming."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/eval",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/eval",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/ink/README.md b/packages/ink/README.md
index c4c6895b..b5ce8dbf 100644
--- a/packages/ink/README.md
+++ b/packages/ink/README.md
@@ -20,7 +20,7 @@ Build terminal AI chat interfaces with the exact same API as `@agentskit/react`.
## Verified proof
- Package metadata and tests live under `packages/ink/`.
-- Package guide: https://www.agentskit.io/docs/packages/ink
+- Package guide: https://www.agentskit.io/docs/reference/packages/ink
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -32,7 +32,7 @@ Build terminal AI chat interfaces with the exact same API as `@agentskit/react`.
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/ink) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/ink) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why ink
diff --git a/packages/ink/package.json b/packages/ink/package.json
index 9795f13e..e546cd30 100644
--- a/packages/ink/package.json
+++ b/packages/ink/package.json
@@ -70,7 +70,7 @@
"stabilityNote": "Terminal UI at parity with @agentskit/react."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/ink",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/ink",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/integrations/README.md b/packages/integrations/README.md
index 7fc3162e..1a03bebc 100644
--- a/packages/integrations/README.md
+++ b/packages/integrations/README.md
@@ -17,7 +17,7 @@ integration is HTTP/`fetch`-only: no vendor SDKs are bundled or required
## Verified proof
- Package metadata and tests live under `packages/integrations/`.
-- Package guide: https://www.agentskit.io/docs/packages/integrations
+- Package guide: https://www.agentskit.io/docs/for-agents/integrations
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -29,7 +29,7 @@ integration is HTTP/`fetch`-only: no vendor SDKs are bundled or required
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/integrations) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/for-agents/integrations) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Install
diff --git a/packages/integrations/package.json b/packages/integrations/package.json
index 6dc1a3a4..230bf3e3 100644
--- a/packages/integrations/package.json
+++ b/packages/integrations/package.json
@@ -66,7 +66,7 @@
"stabilityNote": "Canonical descriptor/registry/projection contract shipped; 50-service fetch-only catalog; auth/actions/triggers/testing; packed API gates; execution boundaries explicit (ADR-0026). Not yet stable."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/integrations",
+ "homepage": "https://www.agentskit.io/docs/for-agents/integrations",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/mcp/README.md b/packages/mcp/README.md
index 9b7c4c41..977988a7 100644
--- a/packages/mcp/README.md
+++ b/packages/mcp/README.md
@@ -27,7 +27,7 @@ them from Codex, Claude Code/Desktop, Cursor, Cline, Continue, or any MCP host.
- **Playbook**: use [playbook.agentskit.io](https://playbook.agentskit.io) for safe tool design, approvals, and agent handoff patterns.
- **AKOS**: run the same model with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/mcp) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/agents/tools/mcp) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
```bash
diff --git a/packages/mcp/package.json b/packages/mcp/package.json
index ada39045..6a40629d 100644
--- a/packages/mcp/package.json
+++ b/packages/mcp/package.json
@@ -60,7 +60,7 @@
"provenance": true
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/mcp",
+ "homepage": "https://www.agentskit.io/docs/agents/tools/mcp",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/memory/README.md b/packages/memory/README.md
index 8fda3dc3..b93ad593 100644
--- a/packages/memory/README.md
+++ b/packages/memory/README.md
@@ -18,7 +18,7 @@ Persist conversations and add vector search to your agents — swap backends wit
## Verified proof
- Package metadata and tests live under `packages/memory/`.
-- Package guide: https://www.agentskit.io/docs/packages/memory
+- Package guide: https://www.agentskit.io/docs/reference/packages/memory
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ Persist conversations and add vector search to your agents — swap backends wit
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/memory) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/memory) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why memory
@@ -116,12 +116,12 @@ Same 3-method `VectorStore` contract — swap without touching agent code.
### Higher-order wrappers (6)
-- `createHierarchicalMemory` — MemGPT-style tiers: working / recall / archival. [Recipe](https://www.agentskit.io/docs/recipes/hierarchical-memory).
-- `createVirtualizedMemory` — hot window + cold retriever for long sessions. [Recipe](https://www.agentskit.io/docs/recipes/virtualized-memory).
-- `createAutoSummarizingMemory` *(via `@agentskit/core/auto-summarize`)* — fold oldest turns into a running summary. [Recipe](https://www.agentskit.io/docs/recipes/auto-summarize).
-- `createEncryptedMemory` — AES-GCM-256 envelope over any `ChatMemory`; keys never leave the caller. [Recipe](https://www.agentskit.io/docs/recipes/encrypted-memory).
-- `createInMemoryGraph` — knowledge graph (nodes + edges + BFS). [Recipe](https://www.agentskit.io/docs/recipes/graph-memory).
-- `createInMemoryPersonalization` + `renderProfileContext` — per-user trait profile. [Recipe](https://www.agentskit.io/docs/recipes/personalization).
+- `createHierarchicalMemory` — MemGPT-style tiers: working / recall / archival. [Recipe](https://www.agentskit.io/docs/reference/recipes/hierarchical-memory).
+- `createVirtualizedMemory` — hot window + cold retriever for long sessions. [Recipe](https://www.agentskit.io/docs/reference/recipes/virtualized-memory).
+- `createAutoSummarizingMemory` *(via `@agentskit/core/auto-summarize`)* — fold oldest turns into a running summary. [Recipe](https://www.agentskit.io/docs/reference/recipes/auto-summarize).
+- `createEncryptedMemory` — AES-GCM-256 envelope over any `ChatMemory`; keys never leave the caller. [Recipe](https://www.agentskit.io/docs/reference/recipes/encrypted-memory).
+- `createInMemoryGraph` — knowledge graph (nodes + edges + BFS). [Recipe](https://www.agentskit.io/docs/reference/recipes/graph-memory).
+- `createInMemoryPersonalization` + `renderProfileContext` — per-user trait profile. [Recipe](https://www.agentskit.io/docs/reference/recipes/personalization).
Memory contract v1 (ADR 0003) — substitutable across `runtime`,
`useChat`, and every framework binding.
diff --git a/packages/memory/package.json b/packages/memory/package.json
index e92f8366..a616b801 100644
--- a/packages/memory/package.json
+++ b/packages/memory/package.json
@@ -61,6 +61,14 @@
"dependencies": {
"@agentskit/core": "workspace:*"
},
+ "peerDependencies": {
+ "vectra": "^0.15.0"
+ },
+ "peerDependenciesMeta": {
+ "vectra": {
+ "optional": true
+ }
+ },
"devDependencies": {
"@types/better-sqlite3": "^7.6.13",
"@types/node": "^25.9.5",
@@ -76,7 +84,7 @@
"stabilityNote": "File/SQLite/Redis backends — Memory contract v1."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/memory",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/memory",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/observability-langfuse/README.md b/packages/observability-langfuse/README.md
index 1dcee70e..ac81cbe1 100644
--- a/packages/observability-langfuse/README.md
+++ b/packages/observability-langfuse/README.md
@@ -14,7 +14,7 @@ Langfuse tracing adapter for AgentsKit. Emits one trace per agent run with neste
## Verified proof
- Package metadata and tests live under `packages/observability-langfuse/`.
-- Package guide: https://www.agentskit.io/docs/packages/observability-langfuse
+- Package guide: https://www.agentskit.io/docs/for-agents/observability-langfuse
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -26,7 +26,7 @@ Langfuse tracing adapter for AgentsKit. Emits one trace per agent run with neste
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/observability-langfuse) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/for-agents/observability-langfuse) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Install
diff --git a/packages/observability-langfuse/package.json b/packages/observability-langfuse/package.json
index a22cdcad..b278ba28 100644
--- a/packages/observability-langfuse/package.json
+++ b/packages/observability-langfuse/package.json
@@ -56,7 +56,7 @@
"stabilityNote": "Adapter contract stable; Langfuse SDK is peer-resolved at runtime."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/observability-langfuse",
+ "homepage": "https://www.agentskit.io/docs/for-agents/observability-langfuse",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/observability/README.md b/packages/observability/README.md
index 30ff0d6d..e1f6e10d 100644
--- a/packages/observability/README.md
+++ b/packages/observability/README.md
@@ -18,7 +18,7 @@ See exactly what your agent does — every LLM call, tool execution, and reasoni
## Verified proof
- Package metadata and tests live under `packages/observability/`.
-- Package guide: https://www.agentskit.io/docs/packages/observability
+- Package guide: https://www.agentskit.io/docs/reference/packages/observability
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ See exactly what your agent does — every LLM call, tool execution, and reasoni
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/observability) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/observability) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why observability
diff --git a/packages/observability/package.json b/packages/observability/package.json
index c79cc8cd..8ed8b408 100644
--- a/packages/observability/package.json
+++ b/packages/observability/package.json
@@ -105,7 +105,7 @@
"stabilityNote": "Observer contract stable; integration coverage growing."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/observability",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/observability",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/rag/README.md b/packages/rag/README.md
index 9f8b620b..c35a0431 100644
--- a/packages/rag/README.md
+++ b/packages/rag/README.md
@@ -18,7 +18,7 @@ Plug-and-play retrieval-augmented generation: chunk documents, embed them, and r
## Verified proof
- Package metadata and tests live under `packages/rag/`.
-- Package guide: https://www.agentskit.io/docs/packages/rag
+- Package guide: https://www.agentskit.io/docs/reference/packages/rag
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ Plug-and-play retrieval-augmented generation: chunk documents, embed them, and r
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/rag) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/rag) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why rag
@@ -94,8 +94,8 @@ You can also call `rag.retrieve({ query, messages })` to satisfy the core `Retri
- `rag.retrieve({ query, messages })` — `Retriever` contract v1 for runtime/controller injection.
- Configurable chunking: `chunkSize`, `chunkOverlap`, custom `split`.
- Works with any `EmbedFn` and any `VectorMemory`.
-- **Rerankers:** `createRerankedRetriever` (Cohere Rerank, BGE, BM25 default), `createHybridRetriever` (vector + BM25 blend), standalone `bm25Score`. [Recipe](https://www.agentskit.io/docs/recipes/rag-reranking).
-- **Document loaders:** `loadUrl`, `loadGitHubFile`, `loadGitHubTree`, `loadNotionPage`, `loadConfluencePage`, `loadGoogleDriveFile`, `loadPdf` (BYO parser). [Recipe](https://www.agentskit.io/docs/recipes/doc-loaders).
+- **Rerankers:** `createRerankedRetriever` (Voyage, Jina, custom `RerankFn`, BM25 default), `createHybridRetriever` (vector + BM25 blend), standalone `bm25Score`. [Recipe](https://www.agentskit.io/docs/reference/recipes/rag-reranking).
+- **Document loaders:** `loadUrl`, `loadGitHubFile`, `loadGitHubTree`, `loadNotionPage`, `loadConfluencePage`, `loadGoogleDriveFile`, `loadPdf` (BYO parser). [Recipe](https://www.agentskit.io/docs/reference/recipes/doc-loaders).
- **Loader resilience:** HTTP/network and response-body read/parse failures surface as `RagError` (`AK_RAG_LOAD_FAILED`). Optional `signal` aborts (including mid-body reads) are never swallowed as a per-object skip. Tree/list loaders may return partial success when at least one eligible download succeeded; if every attempted eligible download failed, they throw. Missing/invalid S3 object bodies count as failed downloads. Pagination that reports more data without a new cursor/token throws (no silent truncation). `loadNotionPage` follows Notion `has_more` / `next_cursor` with `start_cursor` until complete (preserving block order; incomplete or repeated cursors throw). Non-positive / non-finite `maxFiles` yields `[]`.
- **Score contracts:** scoreless search/rerank results keep order. When any score is present, every result must have a finite numeric score and is sorted descending — mixed or non-finite scores throw (never fabricate `-Infinity`). Malformed Voyage/Jina/custom reranker output throws `AK_RAG_RERANK_FAILED`. Optional `signal` on `voyageReranker` / `jinaReranker` is forwarded to `fetch`; request/body aborts remain `AK_RAG_RERANK_FAILED`. `bm25Score` sanitizes invalid `k1`/`b` to documented defaults and always emits finite scores. Hybrid relative weights are normalized to a finite pair that sums to 1 (both zero → 0.5/0.5).
- **Chunk/config safety:** invalid `chunkSize` / `chunkOverlap` / `topK` values are sanitized so chunking always terminates and search never sends non-finite limits to the store.
diff --git a/packages/rag/package.json b/packages/rag/package.json
index ce748f56..2397d05a 100644
--- a/packages/rag/package.json
+++ b/packages/rag/package.json
@@ -76,7 +76,7 @@
"stabilityNote": "Retriever contract v1. Ingest + retrieve shipped."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/rag",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/rag",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/rag/src/errors.ts b/packages/rag/src/errors.ts
index 1186ca28..0c90e34d 100644
--- a/packages/rag/src/errors.ts
+++ b/packages/rag/src/errors.ts
@@ -1,5 +1,7 @@
import { AgentsKitError } from '@agentskit/core'
+const RAG_DOCS_URL = 'https://www.agentskit.io/docs/data/rag'
+
/**
* Error codes raised by `@agentskit/rag` loaders and rerankers. Kept local to
* the package (rather than in core's `ErrorCodes`) because they describe RAG
@@ -23,7 +25,7 @@ export type RagErrorCode = (typeof RagErrorCodes)[keyof typeof RagErrorCodes]
*/
export class RagError extends AgentsKitError {
constructor(options: { code: RagErrorCode; message: string; hint?: string; cause?: unknown }) {
- super(options)
+ super({ docsUrl: RAG_DOCS_URL, ...options })
this.name = 'RagError'
}
}
diff --git a/packages/rag/tests/errors.test.ts b/packages/rag/tests/errors.test.ts
index 2513b658..b62c2be3 100644
--- a/packages/rag/tests/errors.test.ts
+++ b/packages/rag/tests/errors.test.ts
@@ -8,6 +8,7 @@ describe('RagError', () => {
expect(err).toBeInstanceOf(AgentsKitError)
expect(err).toBeInstanceOf(Error)
expect(err.name).toBe('RagError')
+ expect(err.docsUrl).toBe('https://www.agentskit.io/docs/data/rag')
})
it('carries the code and message', () => {
diff --git a/packages/react-native/README.md b/packages/react-native/README.md
index 5d45ec43..020031ce 100644
--- a/packages/react-native/README.md
+++ b/packages/react-native/README.md
@@ -18,7 +18,7 @@ React Native / Expo hook + headless chat components. Metro-safe (no DOM deps). S
## Verified proof
- Package metadata and tests live under `packages/react-native/`.
-- Package guide: https://www.agentskit.io/docs/packages/react-native
+- Package guide: https://www.agentskit.io/docs/reference/packages/react-native
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ React Native / Expo hook + headless chat components. Metro-safe (no DOM deps). S
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/react-native) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/react-native) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why
@@ -108,7 +108,7 @@ MIT — see [LICENSE](../../LICENSE).
## Docs
-[Full documentation](https://www.agentskit.io/docs/packages/react-native) · [GitHub](https://github.com/AgentsKit-io/agentskit)
+[Full documentation](https://www.agentskit.io/docs/reference/packages/react-native) · [GitHub](https://github.com/AgentsKit-io/agentskit)
## Maturity and compatibility
diff --git a/packages/react-native/package.json b/packages/react-native/package.json
index 00c68a12..b06985b2 100644
--- a/packages/react-native/package.json
+++ b/packages/react-native/package.json
@@ -73,7 +73,7 @@
"stabilityNote": "React Native / Expo binding — full headless component parity with @agentskit/react (8 components), rendered with RN primitives and a testID-based headless convention."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/react-native",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/react-native",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/react/CONVENTIONS.md b/packages/react/CONVENTIONS.md
index 1a7edc42..00051620 100644
--- a/packages/react/CONVENTIONS.md
+++ b/packages/react/CONVENTIONS.md
@@ -45,7 +45,7 @@ React hooks and headless UI components for AgentsKit. Everything here runs in a
- Use `@testing-library/react` + `happy-dom` (already configured).
- Test observable behavior: what the user sees, not what the component does internally.
-- Use a mock `AdapterFactory` (see [Recipe: Custom adapter](../../apps/docs-next/content/docs/recipes/custom-adapter.mdx)) for hook tests.
+- Use a mock `AdapterFactory` (see [Recipe: Custom adapter](../../apps/docs-next/content/docs/reference/recipes/custom-adapter.mdx)) for hook tests.
- Snapshot tests for components are acceptable; snapshot tests for LLM output are not.
## Common pitfalls
diff --git a/packages/react/README.md b/packages/react/README.md
index 71b734c5..c8667fc1 100644
--- a/packages/react/README.md
+++ b/packages/react/README.md
@@ -18,7 +18,7 @@ Add streaming AI chat to any React app in 10 lines of code.
## Verified proof
- Package metadata and tests live under `packages/react/`.
-- Package guide: https://www.agentskit.io/docs/packages/react
+- Package guide: https://www.agentskit.io/docs/reference/packages/react
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ Add streaming AI chat to any React app in 10 lines of code.
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/react) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/react) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why react
diff --git a/packages/react/package.json b/packages/react/package.json
index 8cb0f297..6869e52d 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -78,7 +78,7 @@
"stabilityNote": "Production-ready hooks and headless components."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/react",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/react",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/runtime/README.md b/packages/runtime/README.md
index 4216e33e..640c0dca 100644
--- a/packages/runtime/README.md
+++ b/packages/runtime/README.md
@@ -18,7 +18,7 @@ Run autonomous agents in 5 lines — no UI, no boilerplate, just results.
## Verified proof
- Package metadata and tests live under `packages/runtime/`.
-- Package guide: https://www.agentskit.io/docs/packages/runtime
+- Package guide: https://www.agentskit.io/docs/reference/packages/runtime
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ Run autonomous agents in 5 lines — no UI, no boilerplate, just results.
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/runtime) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/runtime) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why runtime
@@ -94,10 +94,10 @@ console.log(result.content)
| Primitive | Purpose | Docs |
|-----------|---------|------|
-| `createDurableRunner` + `createFileStepLog` | Temporal-style step log; resume on crash | [Durable execution](https://www.agentskit.io/docs/recipes/durable-execution) |
-| `supervisor` / `swarm` / `hierarchical` / `blackboard` | Ready-made multi-agent topologies | [Topologies](https://www.agentskit.io/docs/recipes/multi-agent-topologies) |
-| `speculate` | Fan-out N adapters, race + abort losers | [Speculative execution](https://www.agentskit.io/docs/recipes/speculative-execution) |
-| `createCronScheduler` + `createWebhookHandler` | Background agents, cron + webhooks | [Background agents](https://www.agentskit.io/docs/recipes/background-agents) |
+| `createDurableRunner` + `createFileStepLog` | Temporal-style step log; resume on crash | [Durable execution](https://www.agentskit.io/docs/reference/recipes/durable-execution) |
+| `supervisor` / `swarm` / `hierarchical` / `blackboard` | Ready-made multi-agent topologies | [Topologies](https://www.agentskit.io/docs/reference/recipes/multi-agent-topologies) |
+| `speculate` | Fan-out N adapters, race + abort losers | [Speculative execution](https://www.agentskit.io/docs/reference/recipes/speculative-execution) |
+| `createCronScheduler` + `createWebhookHandler` | Background agents, cron + webhooks | [Background agents](https://www.agentskit.io/docs/reference/recipes/background-agents) |
## Ecosystem
diff --git a/packages/runtime/package.json b/packages/runtime/package.json
index 8530374f..46a1a0ae 100644
--- a/packages/runtime/package.json
+++ b/packages/runtime/package.json
@@ -67,7 +67,7 @@
"stabilityNote": "ReAct loop and delegation per ADR 0006."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/runtime",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/runtime",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/sandbox/README.md b/packages/sandbox/README.md
index 0ad81306..f6870b23 100644
--- a/packages/sandbox/README.md
+++ b/packages/sandbox/README.md
@@ -18,7 +18,7 @@ Let agents write and run code safely — in isolated cloud VMs (E2B), constraine
## Verified proof
- Package metadata and tests live under `packages/sandbox/`.
-- Package guide: https://www.agentskit.io/docs/packages/sandbox
+- Package guide: https://www.agentskit.io/docs/reference/packages/sandbox
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
- Graduation track: [RFC 0013](../../rfcs/0013-sandbox-stable.md) (Proposed — not stable)
@@ -31,7 +31,7 @@ Let agents write and run code safely — in isolated cloud VMs (E2B), constraine
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/sandbox) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/sandbox) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why sandbox
diff --git a/packages/sandbox/package.json b/packages/sandbox/package.json
index 7e944ed6..0dfe21e6 100644
--- a/packages/sandbox/package.json
+++ b/packages/sandbox/package.json
@@ -87,7 +87,7 @@
"stabilityNote": "Lifecycle/config/runtime hardening complete on the beta line; E2B peer optional; Web Worker is thread+DOM only (not WebContainer). Stable promotion awaits soak and qualifying releases."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/sandbox",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/sandbox",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/skills/README.md b/packages/skills/README.md
index 050fcb1a..66306cc2 100644
--- a/packages/skills/README.md
+++ b/packages/skills/README.md
@@ -18,7 +18,7 @@ Reusable agent personas and behavioral instructions — skills describe what you
## Verified proof
- Package metadata and tests live under `packages/skills/`.
-- Package guide: https://www.agentskit.io/docs/packages/skills
+- Package guide: https://www.agentskit.io/docs/reference/packages/skills
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ Reusable agent personas and behavioral instructions — skills describe what you
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/skills) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/skills) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why skills
diff --git a/packages/skills/package.json b/packages/skills/package.json
index 1102a952..0ca8e8d6 100644
--- a/packages/skills/package.json
+++ b/packages/skills/package.json
@@ -62,7 +62,7 @@
"stabilityNote": "ADR-0005 contract and 26-skill catalog hardened; remains beta pending the post-0.9 soak, a second minor line, Accepted RFC/evidence, and 1.0.0."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/skills",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/skills",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/solid/README.md b/packages/solid/README.md
index 43cd8bf5..6db2a493 100644
--- a/packages/solid/README.md
+++ b/packages/solid/README.md
@@ -18,7 +18,7 @@ SolidJS hook + headless chat components. Same `ChatReturn` contract every Agents
## Verified proof
- Package metadata and tests live under `packages/solid/`.
-- Package guide: https://www.agentskit.io/docs/packages/solid
+- Package guide: https://www.agentskit.io/docs/reference/packages/solid
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ SolidJS hook + headless chat components. Same `ChatReturn` contract every Agents
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/solid) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/solid) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why
@@ -107,7 +107,7 @@ MIT — see [LICENSE](../../LICENSE).
## Docs
-[Full documentation](https://www.agentskit.io/docs/packages/solid) · [GitHub](https://github.com/AgentsKit-io/agentskit)
+[Full documentation](https://www.agentskit.io/docs/reference/packages/solid) · [GitHub](https://github.com/AgentsKit-io/agentskit)
## Maturity and compatibility
diff --git a/packages/solid/package.json b/packages/solid/package.json
index 64f07b1d..b9f8219f 100644
--- a/packages/solid/package.json
+++ b/packages/solid/package.json
@@ -72,7 +72,7 @@
"stabilityNote": "Solid binding with full headless component parity with @agentskit/react — same ChatReturn contract and data-ak-* attributes."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/solid",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/solid",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/statechart/README.md b/packages/statechart/README.md
index e37e7f8a..0f7a0d6d 100644
--- a/packages/statechart/README.md
+++ b/packages/statechart/README.md
@@ -20,7 +20,7 @@ Use Runtime flows for durable execution, DAGs, tools, and effects. Use this pack
## Verified proof
- Package metadata and tests live under `packages/statechart/`.
-- Package guide: https://www.agentskit.io/docs/packages/statechart
+- Package guide: https://www.agentskit.io/docs/reference/packages/statechart
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## Install
diff --git a/packages/statechart/package.json b/packages/statechart/package.json
index 6148962d..98b99e14 100644
--- a/packages/statechart/package.json
+++ b/packages/statechart/package.json
@@ -52,7 +52,7 @@
"stabilityNote": "Deterministic transition and hostile-input boundaries hardened for beta (ADR-0020, ADR-0027)."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/statechart",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/statechart",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/svelte/README.md b/packages/svelte/README.md
index e636d621..fdd344ba 100644
--- a/packages/svelte/README.md
+++ b/packages/svelte/README.md
@@ -18,7 +18,7 @@ Svelte 5 store + headless chat components. Same `ChatReturn` contract every Agen
## Verified proof
- Package metadata and tests live under `packages/svelte/`.
-- Package guide: https://www.agentskit.io/docs/packages/svelte
+- Package guide: https://www.agentskit.io/docs/reference/packages/svelte
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ Svelte 5 store + headless chat components. Same `ChatReturn` contract every Agen
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/svelte) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/svelte) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why
@@ -100,7 +100,7 @@ MIT — see [LICENSE](../../LICENSE).
## Docs
-[Full documentation](https://www.agentskit.io/docs/packages/svelte) · [GitHub](https://github.com/AgentsKit-io/agentskit)
+[Full documentation](https://www.agentskit.io/docs/reference/packages/svelte) · [GitHub](https://github.com/AgentsKit-io/agentskit)
## Quick start
diff --git a/packages/svelte/package.json b/packages/svelte/package.json
index 502b0ca0..69ef587a 100644
--- a/packages/svelte/package.json
+++ b/packages/svelte/package.json
@@ -70,7 +70,7 @@
"stabilityNote": "createChatStore (ChatReturn contract) + full headless component parity with @agentskit/react (Svelte 5 runes)."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/svelte",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/svelte",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/templates/README.md b/packages/templates/README.md
index 4ebdc493..8e1c062b 100644
--- a/packages/templates/README.md
+++ b/packages/templates/README.md
@@ -20,7 +20,7 @@ and publish.
## Verified proof
- Package metadata and tests live under `packages/templates/`.
-- Package guide: https://www.agentskit.io/docs/packages/templates
+- Package guide: https://www.agentskit.io/docs/reference/packages/templates
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -33,7 +33,7 @@ and package starters without inventing package shape from scratch.
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/templates) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/templates) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why templates
diff --git a/packages/templates/package.json b/packages/templates/package.json
index 63030eeb..682b96d1 100644
--- a/packages/templates/package.json
+++ b/packages/templates/package.json
@@ -60,7 +60,7 @@
"stabilityNote": "Scaffold/validation hardening complete; remains beta until promotion gates in RFC 0014."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/templates",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/templates",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/tools/README.md b/packages/tools/README.md
index 31bd76fb..edf226c3 100644
--- a/packages/tools/README.md
+++ b/packages/tools/README.md
@@ -18,7 +18,7 @@ Give your agents real-world capabilities without writing a single integration.
## Verified proof
- Package metadata and tests live under `packages/tools/`.
-- Package guide: https://www.agentskit.io/docs/packages/tools
+- Package guide: https://www.agentskit.io/docs/reference/packages/tools
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ Give your agents real-world capabilities without writing a single integration.
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/tools) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/tools) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why tools
@@ -151,8 +151,8 @@ or a custom loop.
| Subpath | Contents |
|---------|----------|
-| `@agentskit/tools/mcp` | `createMcpClient`, `createMcpServer`, `toolsFromMcpClient`, stdio + in-memory transports. [MCP bridge recipe](https://www.agentskit.io/docs/recipes/mcp-bridge). |
-| `@agentskit/tools/integrations` | `github`, `linear`, `slack`, `notion`, `discord`, `gmail`, `googleCalendar`, `stripe`, `postgres`, `s3`, `firecrawl`, `reader`, `documentParsers`, `openaiImages`, `elevenlabs`, `whisper`, `deepgram`, `maps`, `weather`, `coingecko`, `browserAgent`. [Integrations recipe](https://www.agentskit.io/docs/recipes/integrations) + [More integrations](https://www.agentskit.io/docs/recipes/more-integrations). |
+| `@agentskit/tools/mcp` | `createMcpClient`, `createMcpServer`, `toolsFromMcpClient`, stdio + in-memory transports. [MCP bridge recipe](https://www.agentskit.io/docs/reference/recipes/mcp-bridge). |
+| `@agentskit/tools/integrations` | `github`, `linear`, `slack`, `notion`, `discord`, `gmail`, `googleCalendar`, `stripe`, `postgres`, `s3`, `firecrawl`, `reader`, `documentParsers`, `openaiImages`, `elevenlabs`, `whisper`, `deepgram`, `maps`, `weather`, `coingecko`, `browserAgent`. [Integrations recipe](https://www.agentskit.io/docs/reference/recipes/integrations) + [More integrations](https://www.agentskit.io/docs/reference/recipes/more-integrations). |
## Ecosystem
diff --git a/packages/tools/package.json b/packages/tools/package.json
index aadf6aac..921b41d4 100644
--- a/packages/tools/package.json
+++ b/packages/tools/package.json
@@ -96,7 +96,7 @@
"stabilityNote": "Web search, filesystem, shell tools — Tool contract v1."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/tools",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/tools",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/validation/README.md b/packages/validation/README.md
index 71531a98..c14430f1 100644
--- a/packages/validation/README.md
+++ b/packages/validation/README.md
@@ -20,7 +20,7 @@ Validation is not automatic. You must pass the validator as `validateArgs`; tool
- Adversarial tests cover nested objects, arrays, local references, structured paths, coercion, custom Ajv instances, schema failures, caching, and strict-extra behavior.
- Public consumers import `@agentskit/tools/validation`; `@agentskit/validation` is a private workspace implementation.
-- Package guide: https://www.agentskit.io/docs/packages/validation
+- Package guide: https://www.agentskit.io/docs/for-agents/validation
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -32,7 +32,7 @@ Validation is not automatic. You must pass the validator as `validateArgs`; tool
- **Playbook**: learn production validation patterns at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: apply the same boundary with enterprise governance at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/validation) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/for-agents/validation) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Install
diff --git a/packages/validation/package.json b/packages/validation/package.json
index 1fc25059..8bf35125 100644
--- a/packages/validation/package.json
+++ b/packages/validation/package.json
@@ -54,7 +54,7 @@
"stabilityNote": "Private Ajv implementation hardened behind @agentskit/tools/validation; graduation is coupled to the public tools surface (ADR-0008, RFC-0015)."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/validation",
+ "homepage": "https://www.agentskit.io/docs/for-agents/validation",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/packages/vue/README.md b/packages/vue/README.md
index 418cf6bc..a11eacdc 100644
--- a/packages/vue/README.md
+++ b/packages/vue/README.md
@@ -18,7 +18,7 @@ Vue 3 composable + headless chat components. Same `ChatReturn` contract every Ag
## Verified proof
- Package metadata and tests live under `packages/vue/`.
-- Package guide: https://www.agentskit.io/docs/packages/vue
+- Package guide: https://www.agentskit.io/docs/reference/packages/vue
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem
@@ -30,7 +30,7 @@ Vue 3 composable + headless chat components. Same `ChatReturn` contract every Ag
- **Playbook**: learn the production patterns behind this layer at [playbook.agentskit.io](https://playbook.agentskit.io).
- **AKOS**: run the same concepts with enterprise deployment, governance, and observability at [akos.agentskit.io](https://akos.agentskit.io).
-Docs: [package guide](https://www.agentskit.io/docs/packages/vue) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
+Docs: [package guide](https://www.agentskit.io/docs/reference/packages/vue) · [agent handoff](https://github.com/AgentsKit-io/agentskit/blob/main/llms.txt)
## Why
@@ -105,7 +105,7 @@ MIT — see [LICENSE](../../LICENSE).
## Docs
-[Full documentation](https://www.agentskit.io/docs/packages/vue) · [GitHub](https://github.com/AgentsKit-io/agentskit)
+[Full documentation](https://www.agentskit.io/docs/reference/packages/vue) · [GitHub](https://github.com/AgentsKit-io/agentskit)
## Quick start
diff --git a/packages/vue/package.json b/packages/vue/package.json
index 90c459f7..ab959b62 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -69,7 +69,7 @@
"stabilityNote": "useChat (ChatReturn contract) + full headless component parity with @agentskit/react; 100% component coverage."
},
"license": "MIT",
- "homepage": "https://www.agentskit.io/docs/packages/vue",
+ "homepage": "https://www.agentskit.io/docs/reference/packages/vue",
"repository": {
"type": "git",
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 560d81b4..7f3734ed 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -262,6 +262,9 @@ importers:
typescript:
specifier: ^6.0.3
version: 6.0.3
+ vitest:
+ specifier: ^4.1.10
+ version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@25.9.5)(@vitest/coverage-v8@4.1.10)(happy-dom@20.10.6)(jsdom@29.1.1(@noble/hashes@2.2.0))(msw@2.15.0(@types/node@25.9.5)(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0))
apps/example-discord-bot:
dependencies:
diff --git a/readme-standard-v1.json b/readme-standard-v1.json
index 8f21d78c..76775e0d 100644
--- a/readme-standard-v1.json
+++ b/readme-standard-v1.json
@@ -208,7 +208,7 @@
"ecosystem.json",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:ffaad71cc9e84856581b1ea28271599d3248e3ced280fb154654058a5218c6d5"
+ "sourceHash": "sha256:f1fcac65d645d87448c4e17ab4c22eb1ccdfb549712fd2522dbc7daabd574b14"
},
"exceptions": []
},
@@ -287,7 +287,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:d210b9657181c5e6cc761fcd6e39dee8b1a8b8b631a3fe711a62f0c3956edc4b"
+ "sourceHash": "sha256:3e0f5c2fc9211dad117a669571d77b3e517f78bf19568851ee249264836e2bb7"
},
"exceptions": []
},
@@ -366,7 +366,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:0ef7164ab76c0f18ba1a5b3517a2c6fe53f70b2f27c3c00183bb724441e15599"
+ "sourceHash": "sha256:f445e0021f391023214c9643d11d852b00d8ae699c374fb34f98b8dacfcf5d27"
},
"exceptions": []
},
@@ -445,7 +445,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:23dd7b213770e99bd91586df05e1c879fc8e01991f1800b1eb426cdb02cb8e77"
+ "sourceHash": "sha256:09c87d48b5eee82ce7713a4f74296025eb25c32461a4a1f1c9d1e42a708ad79a"
},
"exceptions": []
},
@@ -524,7 +524,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:8de6f0d7621dc1d4ed10fc1ae165a5401e15d89b82544aa4a53d92d5aafe5c91"
+ "sourceHash": "sha256:ecf32bf19c7546d4112c643b0cb3a6269bd288bf10d9ba58657013f404b1f307"
},
"exceptions": []
},
@@ -603,7 +603,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:90b8535e0876338044424d0e136ba612a7b4b0e5839fcc37161bfe008d1d7cb8"
+ "sourceHash": "sha256:58d01d8ae2b516e98c96b4ff626c71d6dbe041cc06ed8b66144e082093ab56a3"
},
"exceptions": []
},
@@ -682,7 +682,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:91b800cd7f2cadc121c0b80bc42cf38d92f11e5351e02f0e4cf6032bfb877216"
+ "sourceHash": "sha256:2e3f2e9fea80dc95286ca4ed990962e9c8b18da6902155b8889e38189a8657bb"
},
"exceptions": []
},
@@ -761,7 +761,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:aa2fdb8f2a006fcaa4ac358723acf953741d4ae5e1c0f0b3c4b485163fafb50a"
+ "sourceHash": "sha256:e6d954f6053a69f397155c90ca82fdfe9337d0750eeec284a73126c254d453df"
},
"exceptions": []
},
@@ -840,7 +840,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:0eda648d3d5a44761028c7b658325256d5375a8c3d57a487e18fed2eb010c808"
+ "sourceHash": "sha256:a6a4fdfa8dd64c70115522d4c2b63b5197b9bf5a0d2c418998cd7d747c60b242"
},
"exceptions": []
},
@@ -919,7 +919,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:2d97834a2fbb3c87c87465d8d4486e9f296958d446df1745a9965b2f7f359f12"
+ "sourceHash": "sha256:e7295cda7b5b2995cd6a7352f3920faa3567c1b31a7b5ed28db670ff25bb04f3"
},
"exceptions": []
},
@@ -998,7 +998,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:9a84389349e686a9cfbd7237080017793b9ae078d2d330687efdb76600af3a0a"
+ "sourceHash": "sha256:b25f46950697316b71a26078c39c0729e352da0751a1c7013e1f33303a63f20e"
},
"exceptions": []
},
@@ -1077,7 +1077,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:e510a7f3c13d19112c394047f5ccc1ac7ae983c0d3e77825499bb5ef1ea13e1e"
+ "sourceHash": "sha256:4332cab74ffc54975a4b3096ca19a802b36915b294912c4d64b45cbf94ef7b4d"
},
"exceptions": []
},
@@ -1156,7 +1156,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:1e94e42166e72c3f8559275f298cd408a303d9176fab496c5d8d1e8bb4810061"
+ "sourceHash": "sha256:c6d61cc19b7dfff687de01f97eaa32ff43366b6e919fb70468938cd60fa81b6c"
},
"exceptions": []
},
@@ -1235,7 +1235,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:ed3d75fc6f5658fd180e114ca6e16bdef5e02854c2c894a3693f09f7b2bdece8"
+ "sourceHash": "sha256:02474b9b3d7962acdd002b1111134703800ea6b435a09e4c64e97ae8516f904a"
},
"exceptions": []
},
@@ -1314,7 +1314,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:2ff3f560a4906ef294fda390417af24ed6f433d26ee215770c2e6ec1ef793494"
+ "sourceHash": "sha256:7532732c218d4a9a3e35b4d08a194978a4f37a11e099db6f5d7a51e1809dfc94"
},
"exceptions": []
},
@@ -1393,7 +1393,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:5b596e6cbd1bb3749b9bfec4e12cb9b1e0e9d4eeda9d3a1619e2a2da65fa51ed"
+ "sourceHash": "sha256:9ca050b9974158cb5cf3d64b5f41bac76ca2963267277a9a970beb4916a04836"
},
"exceptions": []
},
@@ -1472,7 +1472,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:be3638e6e04690b89c2528a053d5c944293ba1e0a4618358b2d1f068cdaba41c"
+ "sourceHash": "sha256:c92700b6714342d5e3f927e729b190c35b2ac36cc2309c808c3176b8aaa07930"
},
"exceptions": []
},
@@ -1551,7 +1551,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:3f6322359bed0ba799b5b9deb90a0287bb4346bd343b1fd90b059e6ddff29dc9"
+ "sourceHash": "sha256:69bd84da3d8093aa7a25b0b4e8ec3bcfe2c73d76f9188d999b89f69cb2576fe8"
},
"exceptions": []
},
@@ -1630,7 +1630,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:fabd0f2bc0a771594028b6c6d99b504691d37c3a258f9eb352c5f52622e278df"
+ "sourceHash": "sha256:6365951bd4ea4ea7db98f491400d02021ca0afe3dcaae99c3c9239da56e8d497"
},
"exceptions": []
},
@@ -1709,7 +1709,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:92ee2f92676c1874dad5a868279274ba8619cce22436bc4466a261aa66f5e60f"
+ "sourceHash": "sha256:1443fc9c032cc0ff5832f9f7ab0d7c3c9581ac98e99a36ac9fd34b17d611452e"
},
"exceptions": []
},
@@ -1788,7 +1788,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:562d74814a2bb95f11ee67cfff9a29681dae94462018dd8f9b24780df8992b73"
+ "sourceHash": "sha256:7836f701edb76985ca029595ea2c6812ade398661d6de992b07cd60cdc0044c2"
},
"exceptions": []
},
@@ -1867,7 +1867,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:232098e75f48cc94df287903e4bef2aa4822ef541817f1bf63130555ef0f8534"
+ "sourceHash": "sha256:19a166cdb815cc53171d0ef7e15682fbe9f8b50b32e306b27a0b67712eaf935a"
},
"exceptions": []
},
@@ -1946,7 +1946,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:398a3b9d317731ef92e99e6f68b6e2807e74588f6f8551fd8dd80395649eb802"
+ "sourceHash": "sha256:112c7b4f895a091f0a0e159c0db5ec98cd9968e64ca433663f0ad2fd640fc81c"
},
"exceptions": []
},
@@ -2025,7 +2025,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:a5251a9052206dad693d7f6da664e67ab7b406741a1d117172111d29247aea1f"
+ "sourceHash": "sha256:2f6a0d385f4e5e81bfc7bef94bc8722fdf789d85e30723e4e7a4cd5c2cbc75d3"
},
"exceptions": []
},
@@ -2104,7 +2104,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:76ad3551fb175d0a55ad2433f27e68b430a6c412e5424232beae1f150473db76"
+ "sourceHash": "sha256:37a81ee5daa0526f67ae4df369e6ef621820a05a6bcd9ed0738466517c23cbe4"
},
"exceptions": []
},
@@ -2183,7 +2183,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:2e6c1ffff6f3f8dcf50a2d6b4c5ebd5505bcc6ff7d936005bc32318fbdad91c4"
+ "sourceHash": "sha256:309c6a365e121e508d4c5d8b2b9a5f9fdbe4702c9872268e91ddeec9d99afda1"
},
"exceptions": []
},
@@ -2253,7 +2253,7 @@
"ecosystem-claims.json",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:c555bbde331247679f340b7343b65df9bfb0df98bb4aeccfaf5d808b0b889c3f"
+ "sourceHash": "sha256:95589b5ca70bdf3aea410f7e70b6e8520742f9c944a989265e03b6b4d10a84e7"
},
"exceptions": [
{