diff --git a/.changeset/chat-memory-postgres.md b/.changeset/chat-memory-postgres.md
new file mode 100644
index 000000000..1422b116e
--- /dev/null
+++ b/.changeset/chat-memory-postgres.md
@@ -0,0 +1,7 @@
+---
+'@agentskit/memory': minor
+---
+
+Add the optional `@agentskit/memory/postgres` subpath with BYO Drizzle/node-postgres ChatMemory, exported schema and migration SQL, tenant/session isolation, full message-part persistence, and opt-in turn-aware retention. Connection lifetime remains host-owned for Node pools and Workers clients.
+
+Bounded retention cuts only at user turn boundaries and keeps the leading system prompt, so turns and tool call/result groups are never split and history is never emptied. Supports Drizzle 0.44 and 0.45 (from 0.45.3).
diff --git a/.doc-bridge/capabilities.json b/.doc-bridge/capabilities.json
index f266cae74..9c549ddb0 100644
--- a/.doc-bridge/capabilities.json
+++ b/.doc-bridge/capabilities.json
@@ -7,7 +7,7 @@
"name": "AgentsKit",
"root": "."
},
- "contentHash": "0dbf922bfae3b8b64f1654a926fa23e3678c44c08a9510aade00d8e237918fa8",
+ "contentHash": "85ceaef8fdb67f5b5644c4b297c3b9bade5667bb1458af891e07718f69633d7f",
"artifacts": {
"index": ".doc-bridge/index.json",
"llmsTxt": ".doc-bridge/llms.txt"
diff --git a/.doc-bridge/index.json b/.doc-bridge/index.json
index 18a70927e..fee47dd87 100644
--- a/.doc-bridge/index.json
+++ b/.doc-bridge/index.json
@@ -1,8 +1,8 @@
{
"schemaVersion": 1,
- "contentHash": "0dbf922bfae3b8b64f1654a926fa23e3678c44c08a9510aade00d8e237918fa8",
+ "contentHash": "85ceaef8fdb67f5b5644c4b297c3b9bade5667bb1458af891e07718f69633d7f",
"contentHashAlgo": "sha256-normalized-v1",
- "generatedAt": "2026-10-08T03:22:15.493Z",
+ "generatedAt": "2026-10-08T03:57:45.715Z",
"project": {
"name": "AgentsKit",
"root": "."
@@ -6556,6 +6556,30 @@
],
"contentHash": "275290371076d15e21d24346859d5b3390722228cea5fae9086a3ddc6c24a865"
},
+ {
+ "id": "document:docs/memory-postgres-validation.md",
+ "type": "document",
+ "title": "PostgreSQL ChatMemory task contract and validation",
+ "path": "docs/memory-postgres-validation.md",
+ "description": "Intent: implement the existing public ChatMemory contract with BYO Drizzle/pg, without changing Core contracts. Authorized scope: packages/memory, corresponding docs/changeset, and pnpm-lock.yaml (coordinator explicitly approved lock changes). SessionStorage CAS/leases are owned by another task and excluded by coordinator confirmation.",
+ "tags": [
+ "document",
+ "human"
+ ],
+ "contentHash": "ae653a26f324675e83fa3e6b5414c4fae28b7ace97b2d92148752d6e07f7812b"
+ },
+ {
+ "id": "document:docs/memory-react-resolution-ch-c3.md",
+ "type": "document",
+ "title": "CH-C3: remove the global React type workaround",
+ "path": "docs/memory-react-resolution-ch-c3.md",
+ "description": "State: AWAITING_HUMAN_APPROVAL; worker implementation and checks are validated, with coordinator review outstanding. No current blocker remains.",
+ "tags": [
+ "document",
+ "human"
+ ],
+ "contentHash": "adbc4680481abff16b9d503be9912059b7b133fadb53d6886adea35e1381dfcc"
+ },
{
"id": "document:docs/PHASE-0-EXECUTION-PLAN.md",
"type": "document",
@@ -7178,7 +7202,7 @@
"document",
"project"
],
- "contentHash": "ddfb926a3bb058a47bc74c00ba52260c894f751597691210caef2374676a6d4a"
+ "contentHash": "e4de036b9a616d728221a7da1158c65f7b0004d43effb3d5d3b44e8896c2bc34"
},
{
"id": "document:packages/net/CONVENTIONS.md",
@@ -26292,6 +26316,24 @@
],
"contentHash": "48035e5834b25982e781114da75b65dd69752663093dad985a12ee0b793d4d8a"
},
+ {
+ "id": "module:packages/memory/src/postgres.ts",
+ "type": "module",
+ "title": "postgres.ts",
+ "path": "packages/memory/src/postgres.ts",
+ "symbols": [
+ "PostgresChatMemoryOptions",
+ "postgresChatMemory",
+ "postgresChatMigrationSql",
+ "postgresChatTable"
+ ],
+ "tags": [
+ "module",
+ "ts",
+ "src"
+ ],
+ "contentHash": "4f9e3e433e31d6ba824acf9a5625043bb900090ad946184faff00d48b353725e"
+ },
{
"id": "module:packages/memory/src/redaction.ts",
"type": "module",
@@ -26902,6 +26944,61 @@
],
"contentHash": "3553abb07e10e9d2be3572f187586fe417215a0860584f23d0cd71c604b094c1"
},
+ {
+ "id": "module:packages/memory/tests/postgres-contract.ts",
+ "type": "module",
+ "title": "postgres-contract.ts",
+ "path": "packages/memory/tests/postgres-contract.ts",
+ "symbols": [
+ "postgresContract"
+ ],
+ "tags": [
+ "module",
+ "ts",
+ "tests"
+ ],
+ "contentHash": "51d4b3c7474608d4daa5a425eb6b82e3de26085ec05c8b5f65e5bca531d1c435"
+ },
+ {
+ "id": "module:packages/memory/tests/postgres-worker.ts",
+ "type": "module",
+ "title": "postgres-worker.ts",
+ "path": "packages/memory/tests/postgres-worker.ts",
+ "symbols": [
+ "default"
+ ],
+ "tags": [
+ "module",
+ "ts",
+ "tests"
+ ],
+ "contentHash": "d0f70be39cd7f2f3cc2ef337374e77875c50edda2418fe5a84a40587ae5e4b57"
+ },
+ {
+ "id": "module:packages/memory/tests/postgres-workerd.mjs",
+ "type": "module",
+ "title": "postgres-workerd.mjs",
+ "path": "packages/memory/tests/postgres-workerd.mjs",
+ "tags": [
+ "module",
+ "mjs",
+ "tests"
+ ],
+ "contentHash": "8ff9e14616c68478c21038f9f9b5699d745f77e296239b00fee208c6fc14ec25"
+ },
+ {
+ "id": "module:packages/memory/tests/postgres.integration.test.ts",
+ "type": "module",
+ "title": "postgres.integration.test.ts",
+ "path": "packages/memory/tests/postgres.integration.test.ts",
+ "tags": [
+ "module",
+ "ts",
+ "test",
+ "tests"
+ ],
+ "contentHash": "4eb6ac84dc737b33cec36c640d92ac31de6e2b228b8a97923a484ce5f5a1c457"
+ },
{
"id": "module:packages/memory/tests/redaction.test.ts",
"type": "module",
@@ -27084,7 +27181,7 @@
"ts",
"memory"
],
- "contentHash": "cfdef86d19de22e3fb91d47ccf2e8143bb065b22e00afa0f388fac42b93f7461"
+ "contentHash": "572be3c9adb9dc621e3e7bc6bc11fd319fe6816d897a14551422cd33d6db8103"
},
{
"id": "module:packages/memory/vitest.config.ts",
@@ -38197,8 +38294,8 @@
"changes": {}
},
"inputs": {
- "hash": "54915d85f7a308fa5ec1af4cf890ad9bed63ec04e569a06772a865a7b0676bca",
- "fileCount": 2539,
+ "hash": "ee634f0a707bb1a44a72879697761ccd8d8979c3fe4438c5120cbbf977dd3829",
+ "fileCount": 2546,
"projectionVersion": 2
},
"retrieval": {
@@ -38220,9 +38317,9 @@
"projection": {
"type": "retrieval-index",
"schemaVersion": 1,
- "contentHash": "997a1701967a593a3431a61ddb7c105abf17552fcf32c48a76697493fd9c31a4",
+ "contentHash": "c351080629b1827cfb7fd526e0ea3c45664c22b69012a955e77c58c293e03d76",
"contentHashAlgo": "sha256-normalized-v1",
- "snapshotHash": "15107afcf7657b21ca4445c206e72b993c7d0e05d80fd3ab83476518d31ce853",
+ "snapshotHash": "b8340635b73aa608508f3a93e6461a7343c158545cf34b3e25b6eaf99ee3bc5b",
"overlayHash": "f99666ff9119084dd25c2974ae64eb6935ec2aa785ff5ad478fb9d541f7a5e94",
"configurationHash": "9662cc07ea4ab203ff2ddf457d2db48b5375a7ab4a1f8fbc79dfebcaa8f9a00c",
"lexiconVersion": 1,
@@ -38242,7 +38339,7 @@
},
"lexical": {
"version": 1,
- "documentCount": 2494,
+ "documentCount": 2501,
"fieldNames": [
"aliases",
"body",
@@ -38253,13 +38350,13 @@
"title"
],
"averageFieldLength": {
- "aliases": 3.0144346431435447,
- "body": 61.41539695268645,
- "headings": 4.019647153167602,
- "path": 7.613472333600641,
- "summary": 4.5509222133119485,
- "symbols": 7.454691259021652,
- "title": 3.354851643945469
+ "aliases": 3.0139944022391045,
+ "body": 61.660135945621754,
+ "headings": 4.034386245501799,
+ "path": 7.611755297880848,
+ "summary": 4.562574970011995,
+ "symbols": 7.442622950819672,
+ "title": 3.359456217512995
}
},
"entries": [
@@ -38678,7 +38775,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/reference/examples/discord-bot.mdx"
@@ -38717,7 +38814,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/reference/examples/dspy.mdx"
@@ -38795,7 +38892,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/reference/examples/embedded.mdx"
@@ -39116,7 +39213,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/reference/examples/slack-bot.mdx"
@@ -39155,7 +39252,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/reference/examples/teams-bot.mdx"
@@ -39511,7 +39608,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/data/providers/embedders.mdx"
@@ -39626,7 +39723,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/production/cli/index.mdx"
@@ -39789,7 +39886,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/production/security/index.mdx"
@@ -39952,7 +40049,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.002784,
+ "pagerank": 0.002769,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/reference/packages/eval-braintrust.mdx"
@@ -40036,7 +40133,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.002784,
+ "pagerank": 0.002769,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/production/evals/snapshots.mdx"
@@ -40075,7 +40172,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/production/evals/replay.mdx"
@@ -40114,7 +40211,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.002784,
+ "pagerank": 0.002769,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/production/evals/snapshots.mdx"
@@ -40153,7 +40250,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.002369,
+ "pagerank": 0.002356,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/ui/index.mdx"
@@ -40223,7 +40320,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.002784,
+ "pagerank": 0.002769,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/agents/tools/integrations-catalog.mdx"
@@ -40293,7 +40390,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/data/memory/index.mdx"
@@ -40332,7 +40429,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/data/rag/loaders.mdx"
@@ -40371,7 +40468,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/data/rag/rerank.mdx"
@@ -40410,7 +40507,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.002369,
+ "pagerank": 0.002356,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/ui/index.mdx"
@@ -40449,7 +40546,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.002784,
+ "pagerank": 0.002769,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/production/security/sandbox.mdx"
@@ -40488,7 +40585,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.002369,
+ "pagerank": 0.002356,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/ui/index.mdx"
@@ -40527,7 +40624,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.002369,
+ "pagerank": 0.002356,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/ui/index.mdx"
@@ -40597,7 +40694,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.002784,
+ "pagerank": 0.002769,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/agents/tools/integrations-catalog.mdx"
@@ -40687,7 +40784,7 @@
"aliases": "area"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [
"document:apps/docs-next/content/docs/production/observability/devtools.mdx"
@@ -41513,7 +41610,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -41599,7 +41696,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -41652,7 +41749,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.005829,
+ "pagerank": 0.005797,
"inboundLinks": 10,
"coveredBy": [],
"mentionedBy": [
@@ -41848,7 +41945,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -44209,7 +44306,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -46248,7 +46345,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -46390,7 +46487,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -47069,7 +47166,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -48461,7 +48558,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -49682,7 +49779,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002369,
+ "pagerank": 0.002356,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -50300,7 +50397,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -50354,7 +50451,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -50400,7 +50497,7 @@
"aliases": "adapters document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -50751,7 +50848,7 @@
"aliases": "angular document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -50857,7 +50954,7 @@
"aliases": "cli document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -51003,7 +51100,7 @@
"aliases": "core document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -51174,7 +51271,7 @@
"aliases": "cross-platform document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -51290,7 +51387,7 @@
"aliases": "doc-bridge document agent"
},
"graph": {
- "pagerank": 0.002052,
+ "pagerank": 0.00204,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -51337,7 +51434,7 @@
"aliases": "eval-braintrust document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -51398,7 +51495,7 @@
"aliases": "eval document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -51625,7 +51722,7 @@
"aliases": "ink document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -51736,7 +51833,7 @@
"aliases": "integrations document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -51877,7 +51974,7 @@
"aliases": "mcp document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -51953,7 +52050,7 @@
"aliases": "memory document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -52124,7 +52221,7 @@
"aliases": "net document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -52185,7 +52282,7 @@
"aliases": "observability-langfuse document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -52251,7 +52348,7 @@
"aliases": "observability document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -52382,7 +52479,7 @@
"aliases": "rag document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -52463,7 +52560,7 @@
"aliases": "react-native document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -52559,7 +52656,7 @@
"aliases": "react document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -52645,7 +52742,7 @@
"aliases": "runtime document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -52786,7 +52883,7 @@
"aliases": "sandbox document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -52867,7 +52964,7 @@
"aliases": "skills document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -53038,7 +53135,7 @@
"aliases": "solid document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -53114,7 +53211,7 @@
"aliases": "statechart document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -53190,7 +53287,7 @@
"aliases": "svelte document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -53276,7 +53373,7 @@
"aliases": "templates document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -53372,7 +53469,7 @@
"aliases": "tools document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -53673,7 +53770,7 @@
"aliases": "validation document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -53739,7 +53836,7 @@
"aliases": "vue document agent"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -53897,7 +53994,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -54866,7 +54963,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -55404,7 +55501,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -56223,7 +56320,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -56794,7 +56891,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -56843,7 +56940,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -57053,7 +57150,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -57358,7 +57455,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -57607,7 +57704,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -58479,7 +58576,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -58523,7 +58620,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -58606,7 +58703,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -59181,7 +59278,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -59258,7 +59355,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -59523,7 +59620,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -59762,7 +59859,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -59821,7 +59918,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -59890,7 +59987,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60054,7 +60151,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60113,7 +60210,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60197,7 +60294,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60301,7 +60398,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60345,7 +60442,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60479,7 +60576,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60533,7 +60630,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60617,7 +60714,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60721,7 +60818,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60900,7 +60997,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -60984,7 +61081,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -61028,7 +61125,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -61251,7 +61348,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -61340,7 +61437,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -61399,7 +61496,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -61468,7 +61565,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -61512,7 +61609,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -61596,7 +61693,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -61640,7 +61737,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -61744,7 +61841,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -61963,7 +62060,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -62748,7 +62845,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -65723,7 +65820,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -66566,7 +66663,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -66728,7 +66825,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -66773,7 +66870,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -67431,7 +67528,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -68036,7 +68133,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -68148,7 +68245,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 3,
"coveredBy": [],
"mentionedBy": [
@@ -68432,7 +68529,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.007704,
+ "pagerank": 0.007661,
"inboundLinks": 8,
"coveredBy": [],
"mentionedBy": [
@@ -68533,7 +68630,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.00755,
+ "pagerank": 0.007508,
"inboundLinks": 3,
"coveredBy": [],
"mentionedBy": [
@@ -68584,7 +68681,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.029654,
+ "pagerank": 0.02949,
"inboundLinks": 64,
"coveredBy": [],
"mentionedBy": [
@@ -69034,7 +69131,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.0032,
+ "pagerank": 0.003182,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -69078,7 +69175,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.02282,
+ "pagerank": 0.022694,
"inboundLinks": 11,
"coveredBy": [],
"mentionedBy": [],
@@ -69188,7 +69285,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.012846,
+ "pagerank": 0.012775,
"inboundLinks": 10,
"coveredBy": [],
"mentionedBy": [],
@@ -69303,7 +69400,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.008781,
+ "pagerank": 0.008732,
"inboundLinks": 8,
"coveredBy": [],
"mentionedBy": [],
@@ -69413,7 +69510,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.00589,
+ "pagerank": 0.005857,
"inboundLinks": 7,
"coveredBy": [],
"mentionedBy": [],
@@ -69538,7 +69635,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.006159,
+ "pagerank": 0.006124,
"inboundLinks": 7,
"coveredBy": [],
"mentionedBy": [],
@@ -69653,7 +69750,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.006033,
+ "pagerank": 0.005999,
"inboundLinks": 5,
"coveredBy": [],
"mentionedBy": [],
@@ -69793,7 +69890,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002188,
+ "pagerank": 0.002176,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -69848,7 +69945,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002607,
+ "pagerank": 0.002592,
"inboundLinks": 4,
"coveredBy": [],
"mentionedBy": [
@@ -69961,7 +70058,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.013218,
+ "pagerank": 0.013145,
"inboundLinks": 5,
"coveredBy": [],
"mentionedBy": [],
@@ -70046,7 +70143,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -70126,7 +70223,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -70196,7 +70293,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.003043,
+ "pagerank": 0.003026,
"inboundLinks": 3,
"coveredBy": [],
"mentionedBy": [],
@@ -70291,7 +70388,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -70361,7 +70458,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -70416,7 +70513,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -70461,7 +70558,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -70506,7 +70603,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.004908,
+ "pagerank": 0.004881,
"inboundLinks": 5,
"coveredBy": [],
"mentionedBy": [],
@@ -70586,7 +70683,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.00396,
+ "pagerank": 0.003938,
"inboundLinks": 3,
"coveredBy": [],
"mentionedBy": [],
@@ -70661,7 +70758,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -70700,7 +70797,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -70745,7 +70842,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.037404,
+ "pagerank": 0.037197,
"inboundLinks": 13,
"coveredBy": [],
"mentionedBy": [],
@@ -70890,7 +70987,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.018949,
+ "pagerank": 0.018844,
"inboundLinks": 10,
"coveredBy": [],
"mentionedBy": [],
@@ -70990,7 +71087,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.004151,
+ "pagerank": 0.004128,
"inboundLinks": 5,
"coveredBy": [],
"mentionedBy": [],
@@ -71105,7 +71202,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.003444,
+ "pagerank": 0.003425,
"inboundLinks": 4,
"coveredBy": [],
"mentionedBy": [],
@@ -71175,7 +71272,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.003129,
+ "pagerank": 0.003112,
"inboundLinks": 3,
"coveredBy": [],
"mentionedBy": [],
@@ -71250,7 +71347,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -71295,7 +71392,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002852,
+ "pagerank": 0.002836,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -71375,7 +71472,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -71414,7 +71511,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -71464,7 +71561,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -71524,7 +71621,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002575,
+ "pagerank": 0.002561,
"inboundLinks": 3,
"coveredBy": [],
"mentionedBy": [
@@ -71621,7 +71718,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002575,
+ "pagerank": 0.002561,
"inboundLinks": 3,
"coveredBy": [],
"mentionedBy": [
@@ -71743,7 +71840,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -71788,7 +71885,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -71838,7 +71935,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002022,
+ "pagerank": 0.002011,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -71893,7 +71990,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002852,
+ "pagerank": 0.002836,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -71943,7 +72040,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002732,
+ "pagerank": 0.002717,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -71998,7 +72095,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002852,
+ "pagerank": 0.002836,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -72042,7 +72139,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.003036,
+ "pagerank": 0.00302,
"inboundLinks": 13,
"coveredBy": [],
"mentionedBy": [
@@ -72342,7 +72439,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -73671,7 +73768,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -73776,7 +73873,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [
@@ -73816,6 +73913,114 @@
"provenance": "observed",
"confidence": "observed"
},
+ {
+ "id": "document:docs/memory-postgres-validation.md",
+ "kind": "document",
+ "path": "docs/memory-postgres-validation.md",
+ "title": "PostgreSQL ChatMemory task contract and validation",
+ "summary": "Intent: implement the existing public ChatMemory contract with BYO Drizzle/pg, without changing Core contracts. Authorized scope: packages/memory, corresponding docs/changeset, and pnpm-lock.yaml (coordinator explicitly approved lock changes). SessionStorage CAS/leases are owned by another task and excluded by coordinator confirmation.",
+ "audience": "human",
+ "aliases": [],
+ "tags": [
+ "document",
+ "human"
+ ],
+ "fields": {
+ "title": "PostgreSQL ChatMemory task contract and validation",
+ "headings": "PostgreSQL ChatMemory task contract and validation Current evidence (2026-10-06) CH-C2 guardrail repair (2026-10-06) CH-C3 follow-up AK-1827 review follow-up (2026-10-07)",
+ "path": "docs/memory-postgres-validation.md",
+ "symbols": "",
+ "summary": "Intent: implement the existing public ChatMemory contract with BYO Drizzle/pg, without changing Core contracts. Authorized scope: packages/memory, corresponding docs/changeset, and pnpm-lock.yaml (coordinator explicitly approved lock changes). SessionStorage CAS/leases are owned by another task and excluded by coordinator confirmation.",
+ "body": "PostgreSQL ChatMemory task contract and validation Intent: implement the existing public ChatMemory contract with BYO Drizzle/pg, without changing Core contracts. Authorized scope: packages/memory, corresponding docs/changeset, and pnpm-lock.yaml (coordinator explicitly approved lock changes). SessionStorage CAS/leases are owned by another task and excluded by coordinator confirmation. No adapters/core edits, push, PR, release, deployment, real accounts, or private consumer details. Local commit required; coordinator reviews output. Validation budget: local package checks, one disposable PostgreSQL 16 Docker container, local wrangler/workerd, registry downloads for required optional peers and dev tools. No CI or external database fixtures. Remove task-owned container and temporary workerd state; preserve existing files. State: BLOCKED (doc-bridge), pending coordinator evidence review. Criterion Required evidence Status --- --- --- C1: isolated public subpath/schema/SQL package build, ESM/CJS imports; migration executed on PG16 validated: see evidence below C2: CM1–CM6/parts/dates/atomic replace shared real Postgres contract suite on current sources validated: see evidence below C3: tenant/session isolation shared suite tests read/write/clear across both keys validated: see evidence below C4: explicit history policy and signal shared suite retention/invalid config/abort; README documents in-flight boundary validated: see evidence below C5: Node Pool and Workers Client same suite via Pool and real wrangler dev HTTP with Client/waitUntil validated: see evidence below C6: package build/lint/test documented package commands validated: see evidence below C7: docs/changeset and handoff current diff, confidentiality scan, local commit, coordinator review partially validated: artifacts present; coordinator review pending G1: doc bridge handoff/gate documented query/gate commands blocked: invalid config analysis.areas RF-12 ChatMemory portion and RF-13/16 map to C1–C5. RF-12 SessionStorage, RF-14 CAS and RF-15 lease are not analyzed here and explicitly out of scope. Neon/Hyperdrive, deployment, UI and production performance are not applicable for this local ChatMemory contract. RLS example is documentation; database role policy behavior is not validated by the suite. Environment blockers: ORCA PLAYBOOK.md absent in this worktree; no agents were dispatched or resumed by this worker. pnpm exec ak-docs query package memory --agent rejected configuration: analysis: Unrecognized key: \"areas\" . Harness configuration remains unchanged per coordinator instruction. Current evidence (2026-10-06) Base revision: 0e1c1aa92e69f29f41241e49753ecab8ae279119 . Implementation/config/test/lock digest (paths ordered as recorded below): 069ee90942dcc4d00754f37455eac4950cedc32e29e505617c7303d885c1b97b . Digest paths: packages/memory/src/postgres.ts , packages/memory/package.json , packages/memory/tsup.config.ts , packages/memory/tests/postgres-contract.ts , packages/memory/tests/postgres.integration.test.ts , packages/memory/tests/postgres-worker.ts , packages/memory/tests/postgres-workerd.mjs , packages/memory/tests/wrangler.postgres.jsonc , pnpm-lock.yaml . - C1: ESM and CJS exports imported successfully; the exported SQL created the real PostgreSQL 16 table in both acceptance runners. src/index.ts unchanged; Drizzle/pg remain external and optional. - C2/C3/C4: AK POSTGRES TEST PORT=55439 pnpm --filter @agentskit/memory test passed 33 files / 242 tests; the shared suite checks CM1–CM6, independent snapshots, full parts/tools/metadata/date roundtrip, tenant/session read/write/clear isolation, complete concurrent snapshots, empty replacement, newest-N retention, invalid options/records, aborted mutations and recovery. - C5: Node Pool suite passed against server version 16; real local wrangler dev HTTP returned 200 with every shared contract result passing, using pg.Client per request and waitUntil(client.end()). Final fixture imports the compiled public subpa",
+ "aliases": "document human"
+ },
+ "graph": {
+ "pagerank": 0.001943,
+ "inboundLinks": 0,
+ "coveredBy": [],
+ "mentionedBy": [],
+ "inbound": [],
+ "outbound": [
+ {
+ "kind": "links-to",
+ "id": "document:docs/memory-react-resolution-ch-c3.md",
+ "confidence": "observed"
+ },
+ {
+ "kind": "mentions",
+ "id": "module:packages/memory/src/postgres.ts",
+ "confidence": "observed"
+ },
+ {
+ "kind": "mentions",
+ "id": "module:packages/memory/tests/postgres-contract.ts",
+ "confidence": "observed"
+ },
+ {
+ "kind": "mentions",
+ "id": "module:packages/memory/tests/postgres-worker.ts",
+ "confidence": "observed"
+ },
+ {
+ "kind": "mentions",
+ "id": "module:packages/memory/tests/postgres-workerd.mjs",
+ "confidence": "observed"
+ },
+ {
+ "kind": "mentions",
+ "id": "module:packages/memory/tests/postgres.integration.test.ts",
+ "confidence": "observed"
+ },
+ {
+ "kind": "mentions",
+ "id": "module:packages/memory/tsup.config.ts",
+ "confidence": "observed"
+ }
+ ]
+ },
+ "contentHash": "ae653a26f324675e83fa3e6b5414c4fae28b7ace97b2d92148752d6e07f7812b",
+ "provenance": "observed",
+ "confidence": "observed"
+ },
+ {
+ "id": "document:docs/memory-react-resolution-ch-c3.md",
+ "kind": "document",
+ "path": "docs/memory-react-resolution-ch-c3.md",
+ "title": "CH-C3: remove the global React type workaround",
+ "summary": "State: AWAITING_HUMAN_APPROVAL; worker implementation and checks are validated, with coordinator review outstanding. No current blocker remains.",
+ "audience": "human",
+ "aliases": [],
+ "tags": [
+ "document",
+ "human"
+ ],
+ "fields": {
+ "title": "CH-C3: remove the global React type workaround",
+ "headings": "CH-C3: remove the global React type workaround Contract and budget Findings and smallest repair Evidence binding Criterion results Attempts and limits",
+ "path": "docs/memory-react-resolution-ch-c3.md",
+ "symbols": "",
+ "summary": "State: AWAITING_HUMAN_APPROVAL; worker implementation and checks are validated, with coordinator review outstanding. No current blocker remains.",
+ "body": "CH-C3: remove the global React type workaround State: AWAITING HUMAN APPROVAL; worker implementation and checks are validated, with coordinator review outstanding. No current blocker remains. Contract and budget Approved intent: fix dependency resolution in this worktree without a global hoisting workaround. Scope: revert CH-C2's .npmrc and root package.json additions, keep the lockfile minimal, investigate memory's Drizzle/pg metadata, run docs-next type-check/build, memory build/test (242), ratchets, global tests, quality gates and doc-bridge freshness, make small local commits and report here. No push, PR, publication, deployment, real credentials, unrelated process cleanup or changes to other packages. No UI implementation or public contract changes; UI visual approval and a structural ADR are not applicable. This dispatch is goal authorization; final approval belongs to the coordinator. Budget: local/offline dependency installs, existing repository checks and cached Turbo evidence, --concurrency=2 , VITEST MAX WORKERS=1 ; no CI. One task-owned trust-auth PostgreSQL 16 container bound to 127.0.0.1:55440 provides the required real database test. An isolated manifest-only install tests fresh hoisting; its directory is task-owned and is removed after inspection. Findings and smallest repair - Reverted the two hoist-pattern lines and root @types/react dev dependency. The lockfile differs by only the three corresponding importer lines; no dependency versions or peer snapshots change. Frozen offline installation accepts this lockfile. An initial unfrozen install refreshed unrelated Cloudflare snapshots; that churn was discarded before validation. - Memory already declares Drizzle and pg optional peers, with both present as dev dependencies and @types/pg available for development. Their metadata needs no additional change. Adding a React dev dependency to memory would introduce an unrelated dependency with no supporting evidence. - Drizzle 0.45.3 declares @types/react ^18.2.45 only in its own devDependencies, not in peerDependencies or dependencies. Published dependency installation does not install a library's devDependencies. pnpm --filter @agentskit/memory why @types/react has no result. pg likewise has no React dependency. - pnpm why -r @types/react identifies the React 18 path as: React 19.2.17 remains declared by docs-next and React workspace consumers. The before/after tree diff contains exactly one removed line: ├── agentskit@0.3.0 (devDependencies) under React 19; all other paths match. - A clean manifest-only install (all workspace package manifests, root lockfile, workspace config and reverted .npmrc) using pnpm install --offline --frozen-lockfile --ignore-scripts exits 0 and selects private-hoisted React 19.2.17. Root node modules/@types/react is absent. The existing worktree reinstallation selects the same version and docs-next type-check passes. Thus no memory-origin React conflict reproduces on the current locked tree. - CH-C2 reported an installation that privately hoisted React 18; that old installation's hoist map was not retained. Its exact historical selection cause is partially validated , not reconstructed or attributed to Drizzle. The evidence establishes the React 18 dependency origin and validates that the current source needs no global or package-local React workaround. Evidence binding Starting revision: 1d0fc5b9d3c73e70c1fa54456cf057db4f725d06 . Implementation input SHA-256 (ordered path, NUL, bytes, NUL for .npmrc , package.json , pnpm-lock.yaml , packages/memory/package.json ): 4741232b735738502a3628458899b06cbd5e42cc64036942a49ed9944a1f90b8 . Implementation commit: 7a665a8d . Later report/index commits do not alter those inputs; their exact commit is included in the worker receipt. Criterion results ID Criterion Evidence Current result --- --- --- --- C1 No global workaround; minimal lock diff: .npmrc -2, root manifest -1, lock -3; frozen offline install exit 0 validated C2 Memory metadata and depen",
+ "aliases": "document human"
+ },
+ "graph": {
+ "pagerank": 0.003595,
+ "inboundLinks": 1,
+ "coveredBy": [],
+ "mentionedBy": [],
+ "inbound": [
+ {
+ "kind": "links-to",
+ "id": "document:docs/memory-postgres-validation.md",
+ "confidence": "observed"
+ }
+ ],
+ "outbound": []
+ },
+ "contentHash": "adbc4680481abff16b9d503be9912059b7b133fadb53d6886adea35e1381dfcc",
+ "provenance": "observed",
+ "confidence": "observed"
+ },
{
"id": "document:docs/PHASE-0-EXECUTION-PLAN.md",
"kind": "document",
@@ -73838,7 +74043,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002508,
+ "pagerank": 0.002494,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -73993,7 +74198,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -74316,7 +74521,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002662,
+ "pagerank": 0.002647,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [
@@ -74629,7 +74834,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.002052,
+ "pagerank": 0.00204,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -74668,7 +74873,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.008539,
+ "pagerank": 0.008492,
"inboundLinks": 4,
"coveredBy": [],
"mentionedBy": [
@@ -74781,7 +74986,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [
@@ -74838,7 +75043,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -74912,7 +75117,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.00256,
+ "pagerank": 0.002546,
"inboundLinks": 7,
"coveredBy": [],
"mentionedBy": [
@@ -75029,7 +75234,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.022913,
+ "pagerank": 0.022785,
"inboundLinks": 4,
"coveredBy": [],
"mentionedBy": [
@@ -75107,7 +75312,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.076828,
+ "pagerank": 0.076402,
"inboundLinks": 64,
"coveredBy": [],
"mentionedBy": [
@@ -75661,7 +75866,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.020782,
+ "pagerank": 0.020667,
"inboundLinks": 4,
"coveredBy": [],
"mentionedBy": [
@@ -75998,7 +76203,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -76082,7 +76287,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.012031,
+ "pagerank": 0.011964,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [
@@ -76363,7 +76568,7 @@
"aliases": "document human"
},
"graph": {
- "pagerank": 0.035586,
+ "pagerank": 0.035388,
"inboundLinks": 13,
"coveredBy": [],
"mentionedBy": [
@@ -76562,7 +76767,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -76775,7 +76980,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.019403,
+ "pagerank": 0.019295,
"inboundLinks": 10,
"coveredBy": [],
"mentionedBy": [
@@ -76869,7 +77074,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.00276,
+ "pagerank": 0.002744,
"inboundLinks": 4,
"coveredBy": [],
"mentionedBy": [
@@ -76931,7 +77136,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [
@@ -77008,7 +77213,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -77380,7 +77585,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.002052,
+ "pagerank": 0.00204,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [
@@ -77536,7 +77741,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002508,
+ "pagerank": 0.002494,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [
@@ -77686,7 +77891,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -77878,7 +78083,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.002508,
+ "pagerank": 0.002494,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -78216,7 +78421,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -78438,7 +78643,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -78545,7 +78750,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -78697,7 +78902,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -78909,7 +79114,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -79124,7 +79329,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -79207,7 +79412,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -79273,7 +79478,7 @@
],
"fields": {
"title": "@agentskit/memory",
- "headings": "@agentskit/memory Verified proof How this fits the ecosystem Why memory Install Quick example With RAG Features Chat memory (4) Browser Web Storage Vector memory (11) Higher-order wrappers (6) Ecosystem Contributors License Docs Maturity and compatibility Contributing",
+ "headings": "@agentskit/memory Verified proof How this fits the ecosystem Why memory Install Quick example With RAG Features Chat memory (4) Browser Web Storage Vector memory (11) Higher-order wrappers (6) Ecosystem Contributors License Docs Maturity and compatibility Contributing PostgreSQL chat memory (Node and Workers)",
"path": "packages/memory/README.md",
"symbols": "",
"summary": "Profile: major-package",
@@ -79281,7 +79486,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -79392,6 +79597,11 @@
"id": "module:packages/memory/src/personalization.ts",
"confidence": "observed"
},
+ {
+ "kind": "mentions-symbol",
+ "id": "module:packages/memory/src/postgres.ts",
+ "confidence": "observed"
+ },
{
"kind": "mentions-symbol",
"id": "module:packages/memory/src/redis-vector.ts",
@@ -79449,7 +79659,7 @@
}
]
},
- "contentHash": "ddfb926a3bb058a47bc74c00ba52260c894f751597691210caef2374676a6d4a",
+ "contentHash": "e4de036b9a616d728221a7da1158c65f7b0004d43effb3d5d3b44e8896c2bc34",
"provenance": "observed",
"confidence": "observed"
},
@@ -79568,7 +79778,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -79755,7 +79965,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -79818,7 +80028,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -79892,7 +80102,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -80035,7 +80245,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -80154,7 +80364,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -80396,7 +80606,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -80524,7 +80734,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -80623,7 +80833,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -80776,7 +80986,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -80850,7 +81060,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.002052,
+ "pagerank": 0.00204,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [
@@ -81016,7 +81226,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -81090,7 +81300,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -81218,7 +81428,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -81287,7 +81497,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -81479,7 +81689,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -81640,7 +81850,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.002784,
+ "pagerank": 0.002769,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -81833,7 +82043,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -82083,7 +82293,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.002052,
+ "pagerank": 0.00204,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -82207,7 +82417,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -82266,7 +82476,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -82578,7 +82788,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -82725,7 +82935,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -82854,7 +83064,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 9,
"coveredBy": [],
"mentionedBy": [
@@ -83183,7 +83393,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002065,
+ "pagerank": 0.002053,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -83232,7 +83442,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.004193,
+ "pagerank": 0.004169,
"inboundLinks": 3,
"coveredBy": [],
"mentionedBy": [],
@@ -83311,7 +83521,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.003315,
+ "pagerank": 0.003297,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -83440,7 +83650,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002065,
+ "pagerank": 0.002053,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -83514,7 +83724,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002942,
+ "pagerank": 0.002926,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -83613,7 +83823,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002065,
+ "pagerank": 0.002053,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -83692,7 +83902,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002065,
+ "pagerank": 0.002053,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -83761,7 +83971,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.004279,
+ "pagerank": 0.004256,
"inboundLinks": 4,
"coveredBy": [],
"mentionedBy": [],
@@ -83845,7 +84055,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002065,
+ "pagerank": 0.002053,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -83924,7 +84134,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002895,
+ "pagerank": 0.002879,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -83998,7 +84208,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002065,
+ "pagerank": 0.002053,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -84072,7 +84282,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.00511,
+ "pagerank": 0.005081,
"inboundLinks": 4,
"coveredBy": [],
"mentionedBy": [],
@@ -84161,7 +84371,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002895,
+ "pagerank": 0.002879,
"inboundLinks": 2,
"coveredBy": [],
"mentionedBy": [],
@@ -84255,7 +84465,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.002065,
+ "pagerank": 0.002053,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [],
@@ -84330,7 +84540,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -84474,7 +84684,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 1,
"coveredBy": [],
"mentionedBy": [
@@ -84626,7 +84836,7 @@
"aliases": "document project"
},
"graph": {
- "pagerank": 0.00755,
+ "pagerank": 0.007508,
"inboundLinks": 6,
"coveredBy": [],
"mentionedBy": [
@@ -84750,7 +84960,7 @@
"aliases": "document unclassified"
},
"graph": {
- "pagerank": 0.001954,
+ "pagerank": 0.001943,
"inboundLinks": 0,
"coveredBy": [],
"mentionedBy": [],
@@ -150630,6 +150840,11 @@
"id": "module:packages/memory/src/file-chat.ts",
"confidence": "observed"
},
+ {
+ "kind": "imports",
+ "id": "module:packages/memory/src/postgres.ts",
+ "confidence": "observed"
+ },
{
"kind": "imports",
"id": "module:packages/memory/src/redis-chat.ts",
@@ -151996,6 +152211,65 @@
"provenance": "observed",
"confidence": "observed"
},
+ {
+ "id": "module:packages/memory/src/postgres.ts",
+ "kind": "module",
+ "path": "packages/memory/src/postgres.ts",
+ "title": "postgres.ts",
+ "aliases": [],
+ "symbols": [
+ "PostgresChatMemoryOptions",
+ "postgresChatMemory",
+ "postgresChatMigrationSql",
+ "postgresChatTable"
+ ],
+ "tags": [
+ "module",
+ "ts",
+ "src"
+ ],
+ "fields": {
+ "title": "postgres.ts",
+ "headings": "",
+ "path": "packages/memory/src/postgres.ts",
+ "symbols": "PostgresChatMemoryOptions postgresChatMemory postgresChatMigrationSql postgresChatTable",
+ "summary": "",
+ "body": "",
+ "aliases": "module ts src"
+ },
+ "graph": {
+ "pagerank": 0,
+ "inboundLinks": 2,
+ "coveredBy": [],
+ "mentionedBy": [
+ "document:docs/memory-postgres-validation.md",
+ "document:packages/memory/README.md"
+ ],
+ "packageId": "package:@agentskit/memory",
+ "inbound": [
+ {
+ "kind": "mentions",
+ "id": "document:docs/memory-postgres-validation.md",
+ "confidence": "observed"
+ },
+ {
+ "kind": "mentions-symbol",
+ "id": "document:packages/memory/README.md",
+ "confidence": "observed"
+ }
+ ],
+ "outbound": [
+ {
+ "kind": "imports",
+ "id": "module:packages/memory/src/decode.ts",
+ "confidence": "observed"
+ }
+ ]
+ },
+ "contentHash": "4f9e3e433e31d6ba824acf9a5625043bb900090ad946184faff00d48b353725e",
+ "provenance": "observed",
+ "confidence": "observed"
+ },
{
"id": "module:packages/memory/src/redaction.ts",
"kind": "module",
@@ -154774,6 +155048,199 @@
"provenance": "observed",
"confidence": "observed"
},
+ {
+ "id": "module:packages/memory/tests/postgres-contract.ts",
+ "kind": "module",
+ "path": "packages/memory/tests/postgres-contract.ts",
+ "title": "postgres-contract.ts",
+ "aliases": [],
+ "symbols": [
+ "postgresContract"
+ ],
+ "tags": [
+ "module",
+ "ts",
+ "tests"
+ ],
+ "fields": {
+ "title": "postgres-contract.ts",
+ "headings": "",
+ "path": "packages/memory/tests/postgres-contract.ts",
+ "symbols": "postgresContract",
+ "summary": "",
+ "body": "",
+ "aliases": "module ts tests"
+ },
+ "graph": {
+ "pagerank": 0,
+ "inboundLinks": 1,
+ "coveredBy": [],
+ "mentionedBy": [
+ "document:docs/memory-postgres-validation.md"
+ ],
+ "packageId": "package:@agentskit/memory",
+ "inbound": [
+ {
+ "kind": "imports",
+ "id": "module:packages/memory/tests/postgres-worker.ts",
+ "confidence": "observed"
+ },
+ {
+ "kind": "imports",
+ "id": "module:packages/memory/tests/postgres.integration.test.ts",
+ "confidence": "observed"
+ },
+ {
+ "kind": "mentions",
+ "id": "document:docs/memory-postgres-validation.md",
+ "confidence": "observed"
+ }
+ ],
+ "outbound": []
+ },
+ "contentHash": "51d4b3c7474608d4daa5a425eb6b82e3de26085ec05c8b5f65e5bca531d1c435",
+ "provenance": "observed",
+ "confidence": "observed"
+ },
+ {
+ "id": "module:packages/memory/tests/postgres-worker.ts",
+ "kind": "module",
+ "path": "packages/memory/tests/postgres-worker.ts",
+ "title": "postgres-worker.ts",
+ "aliases": [],
+ "symbols": [
+ "default"
+ ],
+ "tags": [
+ "module",
+ "ts",
+ "tests"
+ ],
+ "fields": {
+ "title": "postgres-worker.ts",
+ "headings": "",
+ "path": "packages/memory/tests/postgres-worker.ts",
+ "symbols": "default",
+ "summary": "",
+ "body": "",
+ "aliases": "module ts tests"
+ },
+ "graph": {
+ "pagerank": 0,
+ "inboundLinks": 1,
+ "coveredBy": [],
+ "mentionedBy": [
+ "document:docs/memory-postgres-validation.md"
+ ],
+ "packageId": "package:@agentskit/memory",
+ "inbound": [
+ {
+ "kind": "mentions",
+ "id": "document:docs/memory-postgres-validation.md",
+ "confidence": "observed"
+ }
+ ],
+ "outbound": [
+ {
+ "kind": "imports",
+ "id": "module:packages/memory/tests/postgres-contract.ts",
+ "confidence": "observed"
+ }
+ ]
+ },
+ "contentHash": "d0f70be39cd7f2f3cc2ef337374e77875c50edda2418fe5a84a40587ae5e4b57",
+ "provenance": "observed",
+ "confidence": "observed"
+ },
+ {
+ "id": "module:packages/memory/tests/postgres-workerd.mjs",
+ "kind": "module",
+ "path": "packages/memory/tests/postgres-workerd.mjs",
+ "title": "postgres-workerd.mjs",
+ "aliases": [],
+ "tags": [
+ "module",
+ "mjs",
+ "tests"
+ ],
+ "fields": {
+ "title": "postgres-workerd.mjs",
+ "headings": "",
+ "path": "packages/memory/tests/postgres-workerd.mjs",
+ "symbols": "",
+ "summary": "",
+ "body": "",
+ "aliases": "module mjs tests"
+ },
+ "graph": {
+ "pagerank": 0,
+ "inboundLinks": 1,
+ "coveredBy": [],
+ "mentionedBy": [
+ "document:docs/memory-postgres-validation.md"
+ ],
+ "packageId": "package:@agentskit/memory",
+ "inbound": [
+ {
+ "kind": "mentions",
+ "id": "document:docs/memory-postgres-validation.md",
+ "confidence": "observed"
+ }
+ ],
+ "outbound": []
+ },
+ "contentHash": "8ff9e14616c68478c21038f9f9b5699d745f77e296239b00fee208c6fc14ec25",
+ "provenance": "observed",
+ "confidence": "observed"
+ },
+ {
+ "id": "module:packages/memory/tests/postgres.integration.test.ts",
+ "kind": "module",
+ "path": "packages/memory/tests/postgres.integration.test.ts",
+ "title": "postgres.integration.test.ts",
+ "aliases": [],
+ "tags": [
+ "module",
+ "ts",
+ "test",
+ "tests"
+ ],
+ "fields": {
+ "title": "postgres.integration.test.ts",
+ "headings": "",
+ "path": "packages/memory/tests/postgres.integration.test.ts",
+ "symbols": "",
+ "summary": "",
+ "body": "",
+ "aliases": "module ts test tests"
+ },
+ "graph": {
+ "pagerank": 0,
+ "inboundLinks": 1,
+ "coveredBy": [],
+ "mentionedBy": [
+ "document:docs/memory-postgres-validation.md"
+ ],
+ "packageId": "package:@agentskit/memory",
+ "inbound": [
+ {
+ "kind": "mentions",
+ "id": "document:docs/memory-postgres-validation.md",
+ "confidence": "observed"
+ }
+ ],
+ "outbound": [
+ {
+ "kind": "imports",
+ "id": "module:packages/memory/tests/postgres-contract.ts",
+ "confidence": "observed"
+ }
+ ]
+ },
+ "contentHash": "4eb6ac84dc737b33cec36c640d92ac31de6e2b228b8a97923a484ce5f5a1c457",
+ "provenance": "observed",
+ "confidence": "observed"
+ },
{
"id": "module:packages/memory/tests/redaction.test.ts",
"kind": "module",
@@ -155354,11 +155821,19 @@
},
"graph": {
"pagerank": 0,
- "inboundLinks": 0,
+ "inboundLinks": 1,
"coveredBy": [],
- "mentionedBy": [],
+ "mentionedBy": [
+ "document:docs/memory-postgres-validation.md"
+ ],
"packageId": "package:@agentskit/memory",
- "inbound": [],
+ "inbound": [
+ {
+ "kind": "mentions",
+ "id": "document:docs/memory-postgres-validation.md",
+ "confidence": "observed"
+ }
+ ],
"outbound": [
{
"kind": "imports",
@@ -155367,7 +155842,7 @@
}
]
},
- "contentHash": "cfdef86d19de22e3fb91d47ccf2e8143bb065b22e00afa0f388fac42b93f7461",
+ "contentHash": "572be3c9adb9dc621e3e7bc6bc11fd319fe6816d897a14551422cd33d6db8103",
"provenance": "observed",
"confidence": "observed"
},
@@ -191247,7 +191722,7 @@
"aliases": "adapters @agentskit/adapters package ownership"
},
"graph": {
- "pagerank": 0.004445,
+ "pagerank": 0.004421,
"inboundLinks": 64,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/adapters.mdx",
@@ -191672,7 +192147,7 @@
"aliases": "angular @agentskit/angular package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 37,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/angular.mdx",
@@ -191935,7 +192410,7 @@
"aliases": "cli @agentskit/cli package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 28,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/cli.mdx",
@@ -192144,7 +192619,7 @@
"aliases": "core @agentskit/core package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 64,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/core.mdx",
@@ -192569,7 +193044,7 @@
"aliases": "cross-platform @agentskit/cross-platform package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 11,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/cross-platform.mdx",
@@ -192676,7 +193151,7 @@
"aliases": "eval @agentskit/eval package ownership"
},
"graph": {
- "pagerank": 0.007767,
+ "pagerank": 0.007724,
"inboundLinks": 45,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/eval-braintrust.mdx",
@@ -193069,7 +193544,7 @@
"aliases": "ink @agentskit/ink package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 56,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/ink.mdx",
@@ -193446,7 +193921,7 @@
"aliases": "integrations @agentskit/integrations package ownership"
},
"graph": {
- "pagerank": 0.0032,
+ "pagerank": 0.003182,
"inboundLinks": 19,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/integrations.mdx",
@@ -193601,7 +194076,7 @@
"aliases": "mcp @agentskit/mcp package ownership"
},
"graph": {
- "pagerank": 0.0032,
+ "pagerank": 0.003182,
"inboundLinks": 20,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/mcp.mdx",
@@ -193762,7 +194237,7 @@
"aliases": "memory @agentskit/memory package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 64,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/memory.mdx",
@@ -194157,7 +194632,7 @@
],
"outbound": []
},
- "contentHash": "ad8d31c451510378895497d4f1a87602a699cab6b6a2789142af23d40f4de940",
+ "contentHash": "9c04e53ca288c601e2b1b6957073505b0beac1c2eda0ceeb0fceeb497435cf09",
"provenance": "observed",
"confidence": "observed",
"ownershipId": "memory"
@@ -194187,7 +194662,7 @@
"aliases": "net @agentskit/net package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 19,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/net.mdx",
@@ -194342,7 +194817,7 @@
"aliases": "observability @agentskit/observability package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 54,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/observability.mdx",
@@ -194707,7 +195182,7 @@
"aliases": "observability-langfuse @agentskit/observability-langfuse package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 8,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/observability-langfuse.mdx",
@@ -194796,7 +195271,7 @@
"aliases": "rag @agentskit/rag package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 51,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/rag.mdx",
@@ -195143,7 +195618,7 @@
"aliases": "react @agentskit/react package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 64,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/react.mdx",
@@ -195568,7 +196043,7 @@
"aliases": "react-native @agentskit/react-native package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 36,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/react-native.mdx",
@@ -195825,7 +196300,7 @@
"aliases": "runtime @agentskit/runtime package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 64,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/runtime.mdx",
@@ -196250,7 +196725,7 @@
"aliases": "sandbox @agentskit/sandbox package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 40,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/sandbox.mdx",
@@ -196531,7 +197006,7 @@
"aliases": "skills @agentskit/skills package ownership"
},
"graph": {
- "pagerank": 0.003615,
+ "pagerank": 0.003595,
"inboundLinks": 30,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/skills.mdx",
@@ -196752,7 +197227,7 @@
"aliases": "solid @agentskit/solid package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 34,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/solid.mdx",
@@ -196997,7 +197472,7 @@
"aliases": "statechart @agentskit/statechart package ownership"
},
"graph": {
- "pagerank": 0.002784,
+ "pagerank": 0.002769,
"inboundLinks": 13,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/statechart.mdx",
@@ -197116,7 +197591,7 @@
"aliases": "svelte @agentskit/svelte package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 39,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/svelte.mdx",
@@ -197391,7 +197866,7 @@
"aliases": "templates @agentskit/templates package ownership"
},
"graph": {
- "pagerank": 0.004445,
+ "pagerank": 0.004421,
"inboundLinks": 22,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/templates.mdx",
@@ -197564,7 +198039,7 @@
"aliases": "tools @agentskit/tools package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 64,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/tools.mdx",
@@ -197989,7 +198464,7 @@
"aliases": "validation @agentskit/validation package ownership"
},
"graph": {
- "pagerank": 0.00403,
+ "pagerank": 0.004008,
"inboundLinks": 13,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/validation.mdx",
@@ -198108,7 +198583,7 @@
"aliases": "vue @agentskit/vue package ownership"
},
"graph": {
- "pagerank": 0.005276,
+ "pagerank": 0.005247,
"inboundLinks": 39,
"coveredBy": [
"document:apps/docs-next/content/docs/for-agents/vue.mdx",
@@ -198379,7 +198854,7 @@
"aliases": "agentskit package"
},
"graph": {
- "pagerank": 0.002369,
+ "pagerank": 0.002356,
"inboundLinks": 46,
"coveredBy": [
"document:apps/docs-next/content/docs/reference/packages/overview.mdx"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0d94946b4..0f6af2722 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -197,9 +197,38 @@ jobs:
if: steps.package-scope.outputs.run_all == 'false'
run: pnpm exec turbo run test --filter='...[origin/main]' --concurrency=2
+ postgres-memory:
+ name: PostgreSQL ChatMemory contract
+ runs-on: ubuntu-latest
+ services:
+ postgres:
+ image: postgres:16
+ env:
+ POSTGRES_HOST_AUTH_METHOD: trust
+ ports:
+ - 5432:5432
+ options: >-
+ --health-cmd "pg_isready -U postgres"
+ --health-interval 10s
+ --health-timeout 5s
+ --health-retries 5
+ steps:
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
+ with:
+ node-version: 22
+ cache: pnpm
+ - run: pnpm install --frozen-lockfile
+ - run: pnpm --filter @agentskit/memory test:postgres
+ env:
+ AK_POSTGRES_TEST_PORT: 5432
+ VITEST_MAX_WORKERS: 2
+ TURBO_CONCURRENCY: 2
+
quality:
name: Lint, Test, Build
- needs: [gates, tests]
+ needs: [gates, tests, postgres-memory]
if: always()
runs-on: ubuntu-latest
steps:
@@ -207,7 +236,8 @@ jobs:
env:
GATES_RESULT: ${{ needs.gates.result }}
TESTS_RESULT: ${{ needs.tests.result }}
- run: test "$GATES_RESULT" = success && test "$TESTS_RESULT" = success
+ POSTGRES_RESULT: ${{ needs.postgres-memory.result }}
+ run: test "$GATES_RESULT" = success && test "$TESTS_RESULT" = success && test "$POSTGRES_RESULT" = success
compatibility:
name: Compatibility (Node ${{ matrix.node }})
diff --git a/.size-limit.json b/.size-limit.json
index 8a650aef6..3bc18c8fe 100644
--- a/.size-limit.json
+++ b/.size-limit.json
@@ -634,5 +634,11 @@
"path": "node_modules/.cache/size-limit-subpaths/cross-platform/testing.js",
"limit": "1.5 KB",
"gzip": true
+ },
+ {
+ "name": "@agentskit/memory (ESM export ./postgres)",
+ "path": "node_modules/.cache/size-limit-subpaths/memory/postgres.js",
+ "limit": "1.5 KB",
+ "gzip": true
}
]
diff --git a/apps/docs-next/lib/api-symbol-routes.json b/apps/docs-next/lib/api-symbol-routes.json
index 4d97f502e..043cc8d8f 100644
--- a/apps/docs-next/lib/api-symbol-routes.json
+++ b/apps/docs-next/lib/api-symbol-routes.json
@@ -305,6 +305,7 @@
"api/runtime/type-aliases/VoteJudgeFn": "/docs/api/runtime/type-aliases#type-alias-votejudgefn-lt-ctx-gt",
"api/runtime/type-aliases/WebhookHandler": "/docs/api/runtime/type-aliases#type-alias-webhookhandler",
"api/runtime/variables/DEFAULT_TOPOLOGY_CONCURRENCY": "/docs/api/runtime/variables#variable-default-topology-concurrency",
+ "api/adapters/classes/CapabilityUnsupportedError": "/docs/api/adapters/classes#class-capabilityunsupportederror",
"api/adapters/functions/anthropic": "/docs/api/adapters/functions#function-anthropic",
"api/adapters/functions/applyCarbonTable": "/docs/api/adapters/functions#function-applycarbontable",
"api/adapters/functions/azureOpenAI": "/docs/api/adapters/functions#function-azureopenai",
@@ -312,6 +313,7 @@
"api/adapters/functions/bedrock": "/docs/api/adapters/functions#function-bedrock",
"api/adapters/functions/cerebras": "/docs/api/adapters/functions#function-cerebras",
"api/adapters/functions/chunkText": "/docs/api/adapters/functions#function-chunktext",
+ "api/adapters/functions/cloudflareAiGateway": "/docs/api/adapters/functions#function-cloudflareaigateway",
"api/adapters/functions/cohere": "/docs/api/adapters/functions#function-cohere",
"api/adapters/functions/createAdapter": "/docs/api/adapters/functions#function-createadapter",
"api/adapters/functions/createEnsembleAdapter": "/docs/api/adapters/functions#function-createensembleadapter",
@@ -332,6 +334,7 @@
"api/adapters/functions/ollama": "/docs/api/adapters/functions#function-ollama",
"api/adapters/functions/ollamaEmbedder": "/docs/api/adapters/functions#function-ollamaembedder",
"api/adapters/functions/openai": "/docs/api/adapters/functions#function-openai",
+ "api/adapters/functions/openaiCompatible": "/docs/api/adapters/functions#function-openaicompatible",
"api/adapters/functions/openaiEmbedder": "/docs/api/adapters/functions#function-openaiembedder",
"api/adapters/functions/recordingAdapter": "/docs/api/adapters/functions#function-recordingadapter",
"api/adapters/functions/refreshCredentials": "/docs/api/adapters/functions#function-refreshcredentials",
@@ -343,6 +346,7 @@
"api/adapters/functions/vertex": "/docs/api/adapters/functions#function-vertex",
"api/adapters/functions/webllm": "/docs/api/adapters/functions#function-webllm",
"api/adapters/functions/withDeprecationPolicy": "/docs/api/adapters/functions#function-withdeprecationpolicy",
+ "api/adapters/functions/workersAi": "/docs/api/adapters/functions#function-workersai",
"api/adapters/interfaces/AnthropicConfig": "/docs/api/adapters/interfaces#interface-anthropicconfig",
"api/adapters/interfaces/ApplyCarbonOptions": "/docs/api/adapters/interfaces#interface-applycarbonoptions",
"api/adapters/interfaces/AzureOpenAIConfig": "/docs/api/adapters/interfaces#interface-azureopenaiconfig",
@@ -350,6 +354,7 @@
"api/adapters/interfaces/BedrockConfig": "/docs/api/adapters/interfaces#interface-bedrockconfig",
"api/adapters/interfaces/BedrockRuntimeClientLike": "/docs/api/adapters/interfaces#interface-bedrockruntimeclientlike",
"api/adapters/interfaces/CerebrasConfig": "/docs/api/adapters/interfaces#interface-cerebrasconfig",
+ "api/adapters/interfaces/CloudflareAiGatewayConfig": "/docs/api/adapters/interfaces#interface-cloudflareaigatewayconfig",
"api/adapters/interfaces/CohereConfig": "/docs/api/adapters/interfaces#interface-cohereconfig",
"api/adapters/interfaces/CreateAdapterConfig": "/docs/api/adapters/interfaces#interface-createadapterconfig",
"api/adapters/interfaces/CredentialRefreshable": "/docs/api/adapters/interfaces#interface-credentialrefreshable",
@@ -380,7 +385,9 @@
"api/adapters/interfaces/ModelDeprecation": "/docs/api/adapters/interfaces#interface-modeldeprecation",
"api/adapters/interfaces/OllamaConfig": "/docs/api/adapters/interfaces#interface-ollamaconfig",
"api/adapters/interfaces/OllamaEmbedderConfig": "/docs/api/adapters/interfaces#interface-ollamaembedderconfig",
+ "api/adapters/interfaces/OpenAICompatibleConfig": "/docs/api/adapters/interfaces#interface-openaicompatibleconfig",
"api/adapters/interfaces/OpenAICompatibleEmbedderConfig": "/docs/api/adapters/interfaces#interface-openaicompatibleembedderconfig",
+ "api/adapters/interfaces/OpenAICompatibleTransportConfig": "/docs/api/adapters/interfaces#interface-openaicompatibletransportconfig",
"api/adapters/interfaces/OpenAIConfig": "/docs/api/adapters/interfaces#interface-openaiconfig",
"api/adapters/interfaces/OpenAIEmbedderConfig": "/docs/api/adapters/interfaces#interface-openaiembedderconfig",
"api/adapters/interfaces/OpenRouterConfig": "/docs/api/adapters/interfaces#interface-openrouterconfig",
@@ -399,6 +406,7 @@
"api/adapters/interfaces/VertexConfig": "/docs/api/adapters/interfaces#interface-vertexconfig",
"api/adapters/interfaces/WebLlmConfig": "/docs/api/adapters/interfaces#interface-webllmconfig",
"api/adapters/interfaces/WebLlmEngineLike": "/docs/api/adapters/interfaces#interface-webllmenginelike",
+ "api/adapters/interfaces/WorkersAiConfig": "/docs/api/adapters/interfaces#interface-workersaiconfig",
"api/adapters/type-aliases/CarbonTable": "/docs/api/adapters/type-aliases#type-alias-carbontable",
"api/adapters/type-aliases/DataRegion": "/docs/api/adapters/type-aliases#type-alias-dataregion",
"api/adapters/type-aliases/DeprecationAction": "/docs/api/adapters/type-aliases#type-alias-deprecationaction",
@@ -426,6 +434,7 @@
"api/adapters/variables/llamacpp": "/docs/api/adapters/variables#variable-llamacpp",
"api/adapters/variables/lmstudio": "/docs/api/adapters/variables#variable-lmstudio",
"api/adapters/variables/mistral": "/docs/api/adapters/variables#variable-mistral",
+ "api/adapters/variables/openRouter-1": "/docs/api/adapters/variables#variable-openrouter",
"api/adapters/variables/openrouter": "/docs/api/adapters/variables#variable-openrouter",
"api/adapters/variables/qwen": "/docs/api/adapters/variables#variable-qwen",
"api/adapters/variables/replicateAdapter": "/docs/api/adapters/variables#variable-replicateadapter",
diff --git a/apps/docs-next/lib/deterministic-knowledge.generated.json b/apps/docs-next/lib/deterministic-knowledge.generated.json
index d88af6aa5..23df67cd1 100644
--- a/apps/docs-next/lib/deterministic-knowledge.generated.json
+++ b/apps/docs-next/lib/deterministic-knowledge.generated.json
@@ -123,7 +123,7 @@
{
"id": "claim.memory-backends",
"kind": "restricted-faq",
- "label": "18 memory backends",
+ "label": "19 memory backends",
"match": {
"type": "exact",
"values": [
@@ -133,7 +133,7 @@
]
},
"answer": {
- "markdown": "The verified AgentsKit ledger currently reports **18 memory backends**.",
+ "markdown": "The verified AgentsKit ledger currently reports **19 memory backends**.",
"citations": [
{
"id": "claim-memory-backends",
@@ -2444,5 +2444,5 @@
}
}
],
- "contentHash": "sha256:d5ec6c6da96e33909607d43ca11ebd3f4ffe22bbdb09f9ceda7329601b5d51db"
+ "contentHash": "sha256:0f0c04bee4e18b603df0f08ceab4eaffc6e88165420be8b2ea20da60973365d6"
}
diff --git a/apps/docs-next/lib/deterministic-site.generated.json b/apps/docs-next/lib/deterministic-site.generated.json
index f2589b0f1..da431efdb 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/d5ec6c6da96e33909607d43ca11ebd3f4ffe22bbdb09f9ceda7329601b5d51db.json",
- "contentHash": "sha256:d5ec6c6da96e33909607d43ca11ebd3f4ffe22bbdb09f9ceda7329601b5d51db"
+ "href": "/deterministic-knowledge/0f0c04bee4e18b603df0f08ceab4eaffc6e88165420be8b2ea20da60973365d6.json",
+ "contentHash": "sha256:0f0c04bee4e18b603df0f08ceab4eaffc6e88165420be8b2ea20da60973365d6"
},
"fallback": {
"mode": "backend"
diff --git a/apps/docs-next/lib/ecosystem-claims.snapshot.json b/apps/docs-next/lib/ecosystem-claims.snapshot.json
index 4e98c6dd1..137a87dfc 100644
--- a/apps/docs-next/lib/ecosystem-claims.snapshot.json
+++ b/apps/docs-next/lib/ecosystem-claims.snapshot.json
@@ -95,7 +95,7 @@
},
{
"id": "memory-backends",
- "value": 18,
+ "value": 19,
"noun": "memory backends",
"evidence": {
"type": "repository-derivation",
diff --git a/apps/docs-next/lib/ecosystem-stats.snapshot.json b/apps/docs-next/lib/ecosystem-stats.snapshot.json
index 857925c6e..de60bbd9a 100644
--- a/apps/docs-next/lib/ecosystem-stats.snapshot.json
+++ b/apps/docs-next/lib/ecosystem-stats.snapshot.json
@@ -4,12 +4,12 @@
"counts": {
"packages": 24,
"frameworkBindings": 7,
- "nativeAdapters": 25,
+ "nativeAdapters": 28,
"integrations": 50,
"catalogProviders": 222,
"catalogModels": 7870,
"skills": 22,
- "memoryBackends": 18,
+ "memoryBackends": 19,
"recipes": 64
},
"lists": {
diff --git a/apps/docs-next/public/deterministic-knowledge/d5ec6c6da96e33909607d43ca11ebd3f4ffe22bbdb09f9ceda7329601b5d51db.json b/apps/docs-next/public/deterministic-knowledge/0f0c04bee4e18b603df0f08ceab4eaffc6e88165420be8b2ea20da60973365d6.json
similarity index 99%
rename from apps/docs-next/public/deterministic-knowledge/d5ec6c6da96e33909607d43ca11ebd3f4ffe22bbdb09f9ceda7329601b5d51db.json
rename to apps/docs-next/public/deterministic-knowledge/0f0c04bee4e18b603df0f08ceab4eaffc6e88165420be8b2ea20da60973365d6.json
index d88af6aa5..23df67cd1 100644
--- a/apps/docs-next/public/deterministic-knowledge/d5ec6c6da96e33909607d43ca11ebd3f4ffe22bbdb09f9ceda7329601b5d51db.json
+++ b/apps/docs-next/public/deterministic-knowledge/0f0c04bee4e18b603df0f08ceab4eaffc6e88165420be8b2ea20da60973365d6.json
@@ -123,7 +123,7 @@
{
"id": "claim.memory-backends",
"kind": "restricted-faq",
- "label": "18 memory backends",
+ "label": "19 memory backends",
"match": {
"type": "exact",
"values": [
@@ -133,7 +133,7 @@
]
},
"answer": {
- "markdown": "The verified AgentsKit ledger currently reports **18 memory backends**.",
+ "markdown": "The verified AgentsKit ledger currently reports **19 memory backends**.",
"citations": [
{
"id": "claim-memory-backends",
@@ -2444,5 +2444,5 @@
}
}
],
- "contentHash": "sha256:d5ec6c6da96e33909607d43ca11ebd3f4ffe22bbdb09f9ceda7329601b5d51db"
+ "contentHash": "sha256:0f0c04bee4e18b603df0f08ceab4eaffc6e88165420be8b2ea20da60973365d6"
}
diff --git a/apps/landing/lib/ecosystem-claims.snapshot.json b/apps/landing/lib/ecosystem-claims.snapshot.json
index 4e98c6dd1..137a87dfc 100644
--- a/apps/landing/lib/ecosystem-claims.snapshot.json
+++ b/apps/landing/lib/ecosystem-claims.snapshot.json
@@ -95,7 +95,7 @@
},
{
"id": "memory-backends",
- "value": 18,
+ "value": 19,
"noun": "memory backends",
"evidence": {
"type": "repository-derivation",
diff --git a/apps/landing/lib/ecosystem-stats.snapshot.json b/apps/landing/lib/ecosystem-stats.snapshot.json
index 857925c6e..de60bbd9a 100644
--- a/apps/landing/lib/ecosystem-stats.snapshot.json
+++ b/apps/landing/lib/ecosystem-stats.snapshot.json
@@ -4,12 +4,12 @@
"counts": {
"packages": 24,
"frameworkBindings": 7,
- "nativeAdapters": 25,
+ "nativeAdapters": 28,
"integrations": 50,
"catalogProviders": 222,
"catalogModels": 7870,
"skills": 22,
- "memoryBackends": 18,
+ "memoryBackends": 19,
"recipes": 64
},
"lists": {
diff --git a/docs/memory-postgres-validation.md b/docs/memory-postgres-validation.md
new file mode 100644
index 000000000..af80c1008
--- /dev/null
+++ b/docs/memory-postgres-validation.md
@@ -0,0 +1,229 @@
+# PostgreSQL ChatMemory task contract and validation
+
+Intent: implement the existing public ChatMemory contract with BYO Drizzle/pg,
+without changing Core contracts. Authorized scope: packages/memory, corresponding
+docs/changeset, and pnpm-lock.yaml (coordinator explicitly approved lock changes).
+SessionStorage CAS/leases are owned by another task and excluded by coordinator
+confirmation. No adapters/core edits, push, PR, release, deployment, real accounts,
+or private consumer details. Local commit required; coordinator reviews output.
+
+Validation budget: local package checks, one disposable PostgreSQL 16 Docker
+container, local wrangler/workerd, registry downloads for required optional peers
+and dev tools. No CI or external database fixtures. Remove task-owned container
+and temporary workerd state; preserve existing files. State: BLOCKED (doc-bridge), pending coordinator evidence review.
+
+| Criterion | Required evidence | Status |
+|---|---|---|
+| C1: isolated public subpath/schema/SQL | package build, ESM/CJS imports; migration executed on PG16 | validated: see evidence below |
+| C2: CM1–CM6/parts/dates/atomic replace | shared real Postgres contract suite on current sources | validated: see evidence below |
+| C3: tenant/session isolation | shared suite tests read/write/clear across both keys | validated: see evidence below |
+| C4: explicit history policy and signal | shared suite retention/invalid config/abort; README documents in-flight boundary | validated: see evidence below |
+| C5: Node Pool and Workers Client | same suite via Pool and real wrangler dev HTTP with Client/waitUntil | validated: see evidence below |
+| C6: package build/lint/test | documented package commands | validated: see evidence below |
+| C7: docs/changeset and handoff | current diff, confidentiality scan, local commit, coordinator review | partially validated: artifacts present; coordinator review pending |
+| G1: doc bridge handoff/gate | documented query/gate commands | blocked: invalid config analysis.areas |
+
+RF-12 ChatMemory portion and RF-13/16 map to C1–C5. RF-12 SessionStorage,
+RF-14 CAS and RF-15 lease are not analyzed here and explicitly out of scope.
+Neon/Hyperdrive, deployment, UI and production performance are not applicable
+for this local ChatMemory contract. RLS example is documentation; database role
+policy behavior is not validated by the suite.
+
+Environment blockers: `ORCA_PLAYBOOK.md` absent in this worktree; no agents were
+dispatched or resumed by this worker. `pnpm exec ak-docs query package memory
+--agent` rejected configuration: `analysis: Unrecognized key: "areas"`.
+Harness configuration remains unchanged per coordinator instruction.
+
+## Current evidence (2026-10-06)
+
+Base revision: `0e1c1aa92e69f29f41241e49753ecab8ae279119`.
+Implementation/config/test/lock digest (paths ordered as recorded below):
+`069ee90942dcc4d00754f37455eac4950cedc32e29e505617c7303d885c1b97b`.
+
+Digest paths: `packages/memory/src/postgres.ts`, `packages/memory/package.json`, `packages/memory/tsup.config.ts`, `packages/memory/tests/postgres-contract.ts`, `packages/memory/tests/postgres.integration.test.ts`, `packages/memory/tests/postgres-worker.ts`, `packages/memory/tests/postgres-workerd.mjs`, `packages/memory/tests/wrangler.postgres.jsonc`, `pnpm-lock.yaml`.
+
+- C1: ESM and CJS exports imported successfully; the exported SQL created the real PostgreSQL 16 table in both acceptance runners. `src/index.ts` unchanged; Drizzle/pg remain external and optional.
+- C2/C3/C4: `AK_POSTGRES_TEST_PORT=55439 pnpm --filter @agentskit/memory test` passed 33 files / 242 tests; the shared suite checks CM1–CM6, independent snapshots, full parts/tools/metadata/date roundtrip, tenant/session read/write/clear isolation, complete concurrent snapshots, empty replacement, newest-N retention, invalid options/records, aborted mutations and recovery.
+- C5: Node Pool suite passed against server version 16; real local wrangler dev HTTP returned 200 with every shared contract result passing, using pg.Client per request and waitUntil(client.end()). Final fixture imports the compiled public subpath, not source.
+- C6: package build (tsup ESM/CJS/declarations via documented test build chain) and lint passed. `test:coverage` passed 33 files / 242 tests with 93.45% lines overall and 95% lines / 100% branches in postgres.ts (90% package threshold). Standalone fixture strict typecheck passed with TypeScript 6 `--ignoreConfig`.
+- Supporting size evidence: local `size-limit packages/memory/dist/index.js --limit "16 KB" --json` passed at 13,406 bytes; the postgres.js file check passed at 796 bytes. These are narrow file checks, not the full repository size/subpath-closure gate or production latency evidence.
+- G1 blocked: package handoff rejects `analysis.areas`; `docs:bridge:gate` failed to return after eight minutes and was terminated. pnpm subsequently attempted automatic dependency repair; that task-owned process was terminated too. No harness/config changes were made.
+
+Validated: C1–C6 local executable artifact behavior. Partially validated: C7 local artifacts/commit ready, pending coordinator review. Not analyzed: SessionStorage CAS/lease, production deployments/performance, RLS role enforcement. Blocked: doc-bridge handoff/gate. Not applicable: UI/browser/visual approval, Neon/Cloudflare accounts, external publication.
+
+No structural contract decision was introduced: this backend implements ADR 0003 using the existing versioned Core record and validator. No ADR/guardrail was changed. The only default-export exception is Wrangler’s required module entry in the test fixture; public package exports remain named.
+
+Final reconciliation: current implementation digest rechecked; confidentiality/attribution scan and `git diff --check` passed. Task-owned PostgreSQL container removed; workerd runner removed its temporary persistence directories and exited. Build/declaration and coverage outputs remain local ignored verification artifacts. Local commit includes this report; no push, PR, release, external message, or published artifact was created. Next action: coordinator reviews the diff/evidence and resolves the blocked doc-bridge environment before approving overall completion.
+
+
+## CH-C2 guardrail repair (2026-10-06)
+
+Contract: **fix** the branch's actual validation failures. Authorized scope is
+memory's acceptance runner and public API documentation, workspace dependency
+resolution, the existing size/API/freshness records, generated backend-count
+artifacts, this report and doc-bridge projections. Core contracts, dependency
+versions outside this repair, guardrail rules/allowlists, other repositories,
+push/PR/release and unrelated processes are excluded. Acceptance requires green
+net ratchet and docs typecheck, the requested sequential package/docs/global
+checks, real execution of the changed runner, and local commits with evidence
+reported to the coordinator. Goal approval is the CH-C2 dispatch; parent evidence
+approval remains with the coordinator. No new structural contract or ADR.
+
+Budget: offline cached dependency installation, Turbo concurrency 2,
+VITEST_MAX_WORKERS=1, one task-owned trust-auth PostgreSQL 16 container and local
+workerd. No CI, remote database, publication or credentials. A task-owned isolated
+local clone at clean main revision `0e1c1aa92e69f29f41241e49753ecab8ae279119`
+was used to compare failures; the shared temporary baseline disappeared during
+an earlier attempt, so those interrupted results were discarded.
+
+Fixes:
+
+- Replace handwritten fetch retry and unbounded JSON parsing with existing net
+ retry/readJson helpers; cap the acceptance response at 4096 bytes. Use the
+ existing cross-platform spawnProcess helper and process-tree cleanup, adding
+ it only as memory's workspace dev dependency. No ratchet rule was suppressed.
+- Both branches' lockfiles already contain React types 18 and 19. The failing
+ installation selected private-hoisted React 18 for dependencies without an
+ explicit types peer, while clean main selected 19. Exclude React types from
+ private hoisting and provide the existing 19.2.17 version at the root for
+ fallback resolution. Frozen offline reinstallation succeeds; lock changes
+ add only root React types and the local workspace dev dependency, six lines.
+ No React UI types/components or unrelated dependency versions were changed.
+- Register the existing PostgreSQL subpath in the API snapshot and size targets,
+ document its three previously undocumented exports, and regenerate the
+ existing ledger/snapshots from 18 to 19 backends. Refresh affected source hashes
+ with review dates preserved; no human approval or attestation was manufactured.
+
+Current implementation/evidence revision: `713bb679` (repair `aaaa175a`, derived
+artifact synchronization `713bb679`). SHA-256 of ordered inputs `.npmrc`,
+`package.json`, `pnpm-lock.yaml`, `packages/memory/package.json`,
+`packages/memory/src/postgres.ts`, `packages/memory/tests/postgres-workerd.mjs`,
+`.size-limit.json`, `docs/stability/public-api-v1.json`,
+`readme-standard-v1.json`, `ecosystem-claims.json` (path, NUL, bytes, NUL):
+`9defc8b67a3abe1622c2685822c6ce44647fdb038db9925ca9ddc519c4dd3888`.
+The final report/index commit does not change these implementation inputs.
+
+| Criterion | Executed evidence on current inputs | Result |
+|---|---|---|
+| N1 approved net helpers, no ratchet growth | `node scripts/check-net-rules.mjs`; global cross-platform/net gates | validated: zero new findings; baselines/rules unchanged |
+| N2 dependency resolution and docs types | frozen offline install; `pnpm --filter @agentskit/docs-next exec tsc --noEmit` | validated: exit 0, no React type edits or unrelated version updates |
+| N3 memory build/test and runner | package build/test; `AK_POSTGRES_TEST_PORT=55439 pnpm --filter @agentskit/memory test:workerd` | validated: 33 files / 242 tests; real workerd+PG CM1–CM6, isolation, parts, retention, abort and recovery passed |
+| N4 docs build | `pnpm exec turbo run build --filter=@agentskit/docs-next --concurrency=2` | validated: 15/15 tasks, 14 cached; exit 0 |
+| N5 global tests | `AK_POSTGRES_TEST_PORT=55439 VITEST_MAX_WORKERS=1 pnpm test` | validated: 77/77 tasks, 72 cached; exit 0; cached tasks are explicitly included |
+| N6 quality gates | `VITEST_MAX_WORKERS=1 pnpm check:quality-gates` | validated: all 52 gates passed; initial seven failures were repaired |
+| N7 doc-bridge after lock/report | regenerate index, then standalone `pnpm docs:bridge:gate` | validated: standalone gate exit 0 after report/index regeneration; index freshness, 27 human-doc links and documentation conformance pass |
+| N8 local commits, scope and cleanup | final diff/status and task-owned resource reconciliation | validated local repair/docs commits and diff; final report/index commit in worker receipt; coordinator review pending |
+
+Clean-main comparison: API JSDoc and size-target checks passed before the shared
+baseline disappeared. The owned isolated main passed README Standard, its tests
+and cross-platform ratchet. Its doc-quality certification test reproduced the
+`doc-bridge-live` doctor failure (19 passed / 1 failed, clean source verified);
+its unchanged doc-bridge index was stale in the recipe gate. Missing build
+outputs in that isolated recipe setup were environmental and were not presented
+as source regressions. In CH-C2, regeneration repaired the live/index failures:
+all 52 quality gates now pass, so no remaining global-gate failure is being
+classified as pre-existing or waived.
+
+Validated: N1–N7 executable results, including real changed runner behavior.
+Partially validated: N8 parent review;
+derived numeric documentation content has build and deterministic-answer test
+evidence, without a claimed browser/visual review. Not analyzed: browser
+interaction, responsive layout, accessibility, contrast/overflow and visual
+approval for generated count surfaces; production performance, RLS, CAS/leases
+and deployed runtimes. Blocked: no remaining executed global gate; any required
+visual/human evidence remains for coordinator review. Not applicable: changes to
+UI components/styles, external deployment/publication, credentials or CI.
+State: AWAITING_HUMAN_APPROVAL for parent evidence review; this worker does not
+approve its output or declare the parent feature complete.
+
+Task-owned PostgreSQL container was removed after the real runner passed; the
+runner removed its temporary persistence state and awaited its own process tree.
+The isolated baseline and task-owned logs are removed in final reconciliation.
+Ignored build/declaration/cache outputs remain local. No unrelated process was
+terminated, no push/PR/release occurred, and no agent attribution was added.
+Next human action: coordinator reviews the commits/evidence and determines any
+required visual review before parent completion.
+
+## CH-C3 follow-up
+
+The global React type workaround described in the CH-C2 section above is
+removed by CH-C3. See [current resolution evidence](./memory-react-resolution-ch-c3.md)
+for the dependency-origin investigation, minimal lockfile diff and current checks.
+The CH-C2 section remains a historical record of its own revision.
+
+## AK-1827 review follow-up (2026-10-07)
+
+Contract: fix C1–C4 in this worktree, merge current origin/main, create local
+commits and report to the Orca coordinator; no push or external publication.
+Scope: memory implementation/tests/docs/changeset, CI workflow and generated
+Doc Bridge/README/ecosystem projections. Core is validated after the merge,
+without additional contract changes. Goal approval is the task dispatch;
+coordinator evidence review remains required. No new structural decision.
+Budget: frozen cached installation, one task-owned PostgreSQL 16 container,
+one npm registry tarball for Drizzle compatibility, local workerd, Turbo <=2
+and Vitest <=2. No credentials, remote CI execution or unrelated cleanup.
+
+Merged main input: `bbd4d97404826f28eb685f74dba570eadcbeed3f`.
+Current implementation input SHA-256 (ordered path, NUL, bytes, NUL):
+`39e576744a709defeb167af79b6d7059db34080fca1835f0d347cd0c042aaac2`.
+Paths: `packages/memory/src/postgres.ts`,
+`packages/memory/tests/postgres-contract.ts`, `packages/memory/package.json`,
+`.github/workflows/ci.yml`, `pnpm-lock.yaml`.
+
+| Criterion | Current evidence | Status |
+|---|---|---|
+| C1 merge main, preserve both sides, regenerate conflicts | Only generated index/capabilities/README conflicts; scripts regenerated them; README/ecosystem hashes identical on repeated generation; core 39 files/562 tests and package typechecks passed | validated locally; merge commit recorded in worker receipt |
+| C2 retained history never starts inside tool group | Real PG16 suite tests cutoffs N=1–5 across two parallel calls/results and a tool-only suffix; memory 33 files/242 tests passed; shared suite also passed via real local workerd | validated |
+| C3 snapshot comment and peer compatibility | Comment says replace-all snapshot; Drizzle 0.44.0 package typecheck and real PG contract passed, as did configured 0.45.3; optional peer widened to `^0.44.0 || ^0.45.3`; frozen install passed | validated |
+| C4 required CI PG16 service without secrets | YAML parsed; assertions for Ubuntu/service/trust/port/command/quality dependency/no secrets passed; exact package command ran on real PG16 locally | validated configuration and local acceptance; hosted CI execution not performed |
+| G1 affected package tests/typecheck/lint | memory 242/core 562 tests passed; both documented lint commands (tsc) passed; shared fixture separate strict typecheck passed | validated |
+| G2 Doc Bridge 1.12 | `pnpm exec ak-docs --version` returned 1.12.0; package handoff succeeded; `pnpm exec ak-docs gate run` passed index-freshness, human-guide-links, documentation-standard-v1 after workerd temp cleanup | validated; final report-only update is regenerated and checked before commit |
+| G3 full pre-push under resource floors | `TURBO_CONCURRENCY=2 VITEST_MAX_WORKERS=2 sh .husky/pre-push`, CI unset; monitor sampled memory/swap every 10s and terminated only its own process group below the floor | validated fourth attempt: exit 0; prior attempts discarded (see reconciliation below) |
+
+Discarded evidence: first retention fixture incorrectly expected explicit
+undefined properties after JSON roundtrip; fixed fixture and reran the full
+memory suite. A Doc Bridge run raced workerd temporary bundle removal; removed
+task-owned empty `.wrangler` directories and regenerated/reran successfully.
+Neither failed attempt is represented as a passing final gate.
+
+Validated: C1–C4 local criteria and G1–G3; final report-only update receives a fresh G2 run.
+Partially validated: hosted CI execution and parent evidence review.
+Not analyzed: production performance/deployment, RLS enforcement, CAS/leases,
+unrelated product/UI behavior. Blocked: none after the fourth hook passed.
+Not applicable: new UI components/styles, browser visual approval, external
+publication, secrets or new architecture/contracts.
+State: AWAITING_HUMAN_APPROVAL for coordinator evidence review. Historical
+evidence above describes its own revisions only.
+
+Coordinator authorization via Orca ask reply: retry the full hook with swap
+free >=200 MB and memory free >=25%, keeping Turbo/Vitest <=2. This explicitly
+changes the original 500 MB floor; previous interrupted attempts remain failed.
+
+Third full-hook attempt respected the revised resource floors but failed the
+verified-recipe gate because its Doc Bridge subprocess ran before concurrent
+index regeneration finished. The subsequent standalone Doc Bridge gate passed
+all three criteria on the updated report. Fourth attempt must run only after
+report/index generation completes, with no concurrent source changes.
+The pnpm-normalized merged lockfile is semantically identical to the automatic
+merge for every importer, package and snapshot; only ordering changed.
+
+
+Final reconciliation (2026-10-08): fourth full pre-push exited 0 with all 52
+quality gates, 60/60 lint tasks and 44/44 build tasks passing. These include
+cached tasks (package declaration precondition: 27/27 cached); they are not a
+claim that every repository test or UI acceptance flow ran. Turbo concurrency
+was 2 and Vitest workers 1, with CI unset. Ten-second resource samples had
+minima 28% memory free and 328.25 MB swap free: valid against the coordinator's
+revised 200 MB floor, not the original 500 MB requirement. No other process
+was terminated. Prior interrupted/stale-index attempts remain discarded.
+
+The implementation input digest above is unchanged. After the passing hook,
+only this evidence report changes; its required Doc Bridge freshness/link/
+conformance checks are regenerated and rerun before commit. Build-created
+tracked deterministic-knowledge outputs were restored from the index and the
+single new content-addressed artifact removed. The task-owned PG16 container,
+Drizzle tarball/extraction and temporary logs are removed; standard ignored
+build/dependency caches remain for the coordinator. No push or hosted CI run.
+Final diff/status and main ancestry are checked after the local merge commit;
+its SHA is supplied in the worker receipt. Next human action: coordinator
+reviews the evidence/diff and performs the authorized push, which runs CI.
diff --git a/docs/memory-react-resolution-ch-c3.md b/docs/memory-react-resolution-ch-c3.md
new file mode 100644
index 000000000..4cfd36d3e
--- /dev/null
+++ b/docs/memory-react-resolution-ch-c3.md
@@ -0,0 +1,125 @@
+# CH-C3: remove the global React type workaround
+
+State: AWAITING_HUMAN_APPROVAL; worker implementation and checks are validated,
+with coordinator review outstanding. No current blocker remains.
+
+## Contract and budget
+
+Approved intent: fix dependency resolution in this worktree without a global
+hoisting workaround. Scope: revert CH-C2's `.npmrc` and root `package.json`
+additions, keep the lockfile minimal, investigate memory's Drizzle/pg metadata,
+run docs-next type-check/build, memory build/test (242), ratchets, global tests,
+quality gates and doc-bridge freshness, make small local commits and report here.
+No push, PR, publication, deployment, real credentials, unrelated process cleanup
+or changes to other packages. No UI implementation or public contract changes;
+UI visual approval and a structural ADR are not applicable. This dispatch is
+goal authorization; final approval belongs to the coordinator.
+
+Budget: local/offline dependency installs, existing repository checks and cached
+Turbo evidence, `--concurrency=2`, `VITEST_MAX_WORKERS=1`; no CI. One task-owned
+trust-auth PostgreSQL 16 container bound to 127.0.0.1:55440 provides the required
+real database test. An isolated manifest-only install tests fresh hoisting;
+its directory is task-owned and is removed after inspection.
+
+## Findings and smallest repair
+
+- Reverted the two hoist-pattern lines and root `@types/react` dev dependency.
+ The lockfile differs by only the three corresponding importer lines; no
+ dependency versions or peer snapshots change. Frozen offline installation
+ accepts this lockfile. An initial unfrozen install refreshed unrelated
+ Cloudflare snapshots; that churn was discarded before validation.
+- Memory already declares Drizzle and pg optional peers, with both present as
+ dev dependencies and `@types/pg` available for development. Their metadata
+ needs no additional change. Adding a React dev dependency to memory would
+ introduce an unrelated dependency with no supporting evidence.
+- Drizzle 0.45.3 declares `@types/react` ^18.2.45 only in its own devDependencies,
+ **not** in peerDependencies or dependencies. Published dependency installation
+ does not install a library's devDependencies. `pnpm --filter @agentskit/memory
+ why @types/react` has no result. pg likewise has no React dependency.
+- `pnpm why -r @types/react` identifies the React 18 path as:
+
+ ```text
+ @types/react@18.3.31
+ └─┬ braintrust@3.33.0
+ ├── @agentskit/eval (devDependencies)
+ └── @agentskit/eval-braintrust (devDependencies)
+ ```
+
+ React 19.2.17 remains declared by docs-next and React workspace consumers.
+ The before/after tree diff contains exactly one removed line:
+ `├── agentskit@0.3.0 (devDependencies)` under React 19; all other paths match.
+- A clean manifest-only install (all workspace package manifests, root lockfile,
+ workspace config and reverted .npmrc) using `pnpm install --offline
+ --frozen-lockfile --ignore-scripts` exits 0 and selects private-hoisted React
+ 19.2.17. Root `node_modules/@types/react` is absent. The existing worktree
+ reinstallation selects the same version and docs-next type-check passes.
+ Thus no memory-origin React conflict reproduces on the current locked tree.
+- CH-C2 reported an installation that privately hoisted React 18; that old
+ installation's hoist map was not retained. Its exact historical selection
+ cause is **partially validated**, not reconstructed or attributed to Drizzle.
+ The evidence establishes the React 18 dependency origin and validates that
+ the current source needs no global or package-local React workaround.
+
+## Evidence binding
+
+Starting revision: `1d0fc5b9d3c73e70c1fa54456cf057db4f725d06`.
+Implementation input SHA-256 (ordered path, NUL, bytes, NUL for `.npmrc`,
+`package.json`, `pnpm-lock.yaml`, `packages/memory/package.json`):
+`4741232b735738502a3628458899b06cbd5e42cc64036942a49ed9944a1f90b8`. Implementation commit: `7a665a8d`. Later report/index commits do not alter
+those inputs; their exact commit is included in the worker receipt.
+
+## Criterion results
+
+| ID | Criterion | Evidence | Current result |
+|---|---|---|---|
+| C1 | No global workaround; minimal lock | diff: .npmrc -2, root manifest -1, lock -3; frozen offline install exit 0 | validated |
+| C2 | Memory metadata and dependency origin | installed manifests; package-local why; recursive tree diff; clean offline installation React 19.2.17 | validated current resolution; historical hoist choice partially validated |
+| C3 | docs-next type-check and build | direct tsc --noEmit exit 0; forced Turbo build --filter=@agentskit/docs-next --only --force --concurrency=2: 1/1 success, zero cached; Next TypeScript passed, 518 pages generated | validated with real build |
+| C4 | memory build/test (242) | package test with AK_POSTGRES_TEST_PORT=55440 and VITEST_MAX_WORKERS=1: 33 files / 242 passed; package lint exit 0 | validated |
+| C5 | Ratchets | cross-platform 148, core 75, net 111 baseline findings, no new issues | validated |
+| C6 | pnpm test | VITEST_MAX_WORKERS=1 pnpm test: 77/77 tasks, 77 cached | validated cached test evidence; memory separately executed |
+| C7 | check:quality-gates | VITEST_MAX_WORKERS=1 TURBO_CONCURRENCY=2 pnpm check:quality-gates, built-in Turbo concurrency 2: all 52 gates passed on rerun, exit 0 | validated |
+| C8 | doc-bridge freshness | index regeneration and standalone freshness, exit 0; regenerate once more with this final report before committing | validated; final-index check required before receipt |
+| C9 | local commits and task-owned cleanup | repair commit 7a665a8d; isolated install removed; docker rm --force ak-ch-c3-postgres exit 0; final diff/status and evidence commit | validated; final commit recorded in receipt |
+
+## Attempts and limits
+
+The initial memory run without a database skipped one test (241 passed, 1
+skipped). The first database attempt hit PostgreSQL container startup and
+failed at its initial query; after pg_isready confirmed readiness the full
+242-test run passed. No application code was changed for the startup race.
+
+An initial direct docs build invoked the documented prebuild's recursive
+package builds outside Turbo's explicit concurrency budget. Its generator
+then encountered low disk space during the isolated install; that attempt was
+stopped using only its own process tree and is **not accepted build evidence**.
+Task-owned temporary dependency files were removed to reclaim disk; the
+accepted build command is the forced Turbo concurrency-2 run stated above.
+The prior 15-task fully cached build did not restore the generated memory/rag
+API pages removed by the interrupted generator. The forced build regenerated
+all API pages and completed Next compilation, TypeScript and 518 static pages.
+The global Turbo output configuration does not cover these generated docs
+outputs; this report uses the real build rather than treating cache replay
+as proof of the current artifact. Global Turbo configuration was not changed.
+
+Not analyzed: changes to braintrust/eval, React UI behavior, historical module
+layout not retained by CH-C2. Not applicable: deployment, publication, external
+accounts, new public behavior, changeset, contract ADR and human visual review.
+No statement here establishes broader enterprise readiness. Required next
+human action: coordinator review of this evidence and final diff.
+
+The initial quality-gate run finished with 51 of 52 gates passing; verified
+recipe factory failed because its doc-bridge index-freshness check preceded
+the index regeneration. No structural/application check failed. The index
+was regenerated and the complete command rerun: all 52 gates passed. Container
+cleanup briefly failed because the Docker socket disappeared; escalation and
+a coordinator question were sent. After the socket returned, removal of only
+`ak-ch-c3-postgres` succeeded; the coordinator was told the question was obsolete
+and its local waiting process was stopped. No unrelated container was touched.
+
+Final classification: **validated** C1 and the current-resolution part of C2,
+C3–C9; **partially validated** historical CH-C2 hoist selection; **blocked**
+none; **not analyzed** and **not applicable** are listed above. The task is
+submitted for coordinator evidence review, not self-approved or parent-complete.
+Task-owned raw temporary logs are removed after their outcomes are recorded
+here; build outputs remain as the real artifact.
diff --git a/docs/stability/public-api-v1.json b/docs/stability/public-api-v1.json
index de9e9b762..c6f0e02eb 100644
--- a/docs/stability/public-api-v1.json
+++ b/docs/stability/public-api-v1.json
@@ -7019,6 +7019,39 @@
}
]
},
+ "./postgres": {
+ "conditions": [
+ "import",
+ "require",
+ "types"
+ ],
+ "symbols": [
+ {
+ "name": "postgresChatMemory",
+ "kinds": [
+ "value"
+ ]
+ },
+ {
+ "name": "PostgresChatMemoryOptions",
+ "kinds": [
+ "type"
+ ]
+ },
+ {
+ "name": "postgresChatMigrationSql",
+ "kinds": [
+ "value"
+ ]
+ },
+ {
+ "name": "postgresChatTable",
+ "kinds": [
+ "value"
+ ]
+ }
+ ]
+ },
"./web-storage": {
"conditions": [
"import",
diff --git a/ecosystem-claims.json b/ecosystem-claims.json
index 4e98c6dd1..137a87dfc 100644
--- a/ecosystem-claims.json
+++ b/ecosystem-claims.json
@@ -95,7 +95,7 @@
},
{
"id": "memory-backends",
- "value": 18,
+ "value": 19,
"noun": "memory backends",
"evidence": {
"type": "repository-derivation",
diff --git a/packages/memory/README.md b/packages/memory/README.md
index ac31db379..4a4de1714 100644
--- a/packages/memory/README.md
+++ b/packages/memory/README.md
@@ -171,3 +171,91 @@ MIT — see [LICENSE](../../LICENSE).
## Contributing
See [CONTRIBUTING.md](../../CONTRIBUTING.md) and the monorepo [LICENSE](../../LICENSE).
+
+### PostgreSQL chat memory (Node and Workers)
+
+Install `drizzle-orm` and `pg` alongside this package. The optional
+`@agentskit/memory/postgres` subpath exports `postgresChatMemory`,
+`postgresChatTable` (Drizzle schema), and `postgresChatMigrationSql`.
+Neither peer is imported by the main entry.
+
+```ts
+import { Pool } from 'pg'
+import { drizzle } from 'drizzle-orm/node-postgres'
+import { sql } from 'drizzle-orm'
+import { postgresChatMemory, postgresChatMigrationSql } from '@agentskit/memory/postgres'
+
+const pool = new Pool() // host owns connection configuration and shutdown
+const db = drizzle(pool)
+// Run once in your migration tooling, not on every request:
+await db.execute(sql.raw(postgresChatMigrationSql))
+const memory = postgresChatMemory({ db, tenantId: 'tenant-a', sessionId: 'session-a' })
+await memory.save([])
+await pool.end()
+```
+
+In Workers, enable `nodejs_compat`; create and connect a `pg.Client` inside each
+request, pass `drizzle(client)`, and close it with `ctx.waitUntil(client.end())`
+after all memory operations (and any stream using them) have finished. The
+package never connects, migrates, or closes your client. A Node `Pool` can be
+shared across requests. No Neon, Hyperdrive, or Cloudflare dependency is needed;
+the host can supply their connection configuration when appropriate.
+
+Every query uses both tenant and session, which form the primary key. Derive
+these identifiers from trusted authorization context: caller-supplied tenant
+names alone are not authorization. Saves atomically replace a versioned JSONB
+snapshot, preserving parts, tools, metadata, dates, and message order. Concurrent
+saves use last-writer-wins; this ChatMemory does not implement session CAS or
+turn leases. Schema migration is explicit; SQL/connection errors propagate and
+invalid records fail rather than silently discarding history.
+
+No truncation is performed by default (CM1–CM6). Opt into `maxMessages: N` to
+keep roughly the newest N messages on each save, in their original order.
+Retention cuts only at a user turn boundary: the kept window always starts at a
+`user` message, so a user question is never separated from its assistant answer
+and a tool call is never separated from its results. When the N-newest cutoff
+falls inside the latest (possibly in-progress) turn, that whole turn is kept, so
+the result can exceed N. Leading `system` messages are always kept. A history
+with no user message is stored unchanged rather than emptied. This permanently
+removes older turns and counts messages, not tokens or bytes. For semantic
+summarization, prepare the history in the host
+instead. A positive safe integer is required; empty saves still persist `[]`.
+
+The supported Drizzle peer range is `^0.44.0 || ^0.45.3`. Both lower bounds
+passed the real PostgreSQL contract suite and the package typecheck.
+
+`signal` rejects already-aborted operations before any SQL is issued. Loads
+also check after SQL returns. Drizzle/pg does not cancel in-flight SQL here:
+a save/clear already submitted can commit after an abort and will report its
+actual SQL outcome. Configure query/statement timeouts on the host connection.
+
+Optional defense-in-depth RLS (run as migration owner, access through a
+non-owner role without BYPASSRLS; set tenant inside a host-managed transaction):
+
+```sql
+ALTER TABLE agentskit_chat_memory ENABLE ROW LEVEL SECURITY;
+ALTER TABLE agentskit_chat_memory FORCE ROW LEVEL SECURITY;
+CREATE POLICY tenant_isolation ON agentskit_chat_memory
+ USING (tenant_id = current_setting('app.tenant_id', true))
+ WITH CHECK (tenant_id = current_setting('app.tenant_id', true));
+```
+
+Do not set a tenant on a shared pool connection outside a transaction. The host
+must enforce role permissions and set its trusted tenant with transaction-local
+`set_config('app.tenant_id', tenant, true)`.
+
+Real acceptance checks (local disposable PostgreSQL 16, trust auth on loopback;
+no production accounts):
+
+```sh
+docker run -d --name ak-memory-test -p 127.0.0.1:55439:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:16
+AK_POSTGRES_TEST_PORT=55439 pnpm --filter @agentskit/memory test:postgres
+AK_POSTGRES_TEST_PORT=55439 pnpm --filter @agentskit/memory test:workerd
+docker rm -f ak-memory-test
+```
+
+CI runs `test:postgres` against a PostgreSQL 16 service with trust authentication
+and an explicit test port; no secrets are required. Locally it is skipped
+without its explicit test port. `test:workerd`
+runs `wrangler dev --local`, uses a Client per request and `waitUntil` shutdown,
+and exercises the same synthetic contract suite as the Node Pool test.
diff --git a/packages/memory/package.json b/packages/memory/package.json
index 110851bea..d0e7f9da4 100644
--- a/packages/memory/package.json
+++ b/packages/memory/package.json
@@ -42,6 +42,11 @@
"types": "./dist/web-storage.d.ts",
"import": "./dist/web-storage.js",
"require": "./dist/web-storage.cjs"
+ },
+ "./postgres": {
+ "types": "./dist/postgres.d.ts",
+ "import": "./dist/postgres.js",
+ "require": "./dist/postgres.cjs"
}
},
"files": [
@@ -56,21 +61,32 @@
"test": "pnpm exec turbo run build --filter=@agentskit/memory --concurrency=2 && vitest run",
"test:coverage": "pnpm exec turbo run build --filter=@agentskit/memory --concurrency=2 && vitest run --coverage",
"lint": "tsc --noEmit",
- "dev": "tsup --watch"
+ "dev": "tsup --watch",
+ "test:postgres": "pnpm exec turbo run build --filter=@agentskit/memory --concurrency=2 && vitest run tests/postgres.integration.test.ts",
+ "test:workerd": "pnpm exec turbo run build --filter=@agentskit/memory --concurrency=2 && node tests/postgres-workerd.mjs"
},
"dependencies": {
"@agentskit/core": "workspace:*",
"@agentskit/net": "workspace:*"
},
"peerDependencies": {
- "vectra": "^0.15.0"
+ "vectra": "^0.15.0",
+ "drizzle-orm": "^0.44.0 || ^0.45.3",
+ "pg": "^8.23.1"
},
"peerDependenciesMeta": {
"vectra": {
"optional": true
+ },
+ "drizzle-orm": {
+ "optional": true
+ },
+ "pg": {
+ "optional": true
}
},
"devDependencies": {
+ "@agentskit/cross-platform": "workspace:*",
"@types/better-sqlite3": "^7.6.13",
"@types/node": "^25.9.5",
"better-sqlite3": "^13.0.3",
@@ -78,11 +94,15 @@
"tsup": "^8.5.1",
"typescript": "^6.0.3",
"vectra": "^0.15.0",
- "vitest": "^4.1.11"
+ "vitest": "^4.1.11",
+ "drizzle-orm": "^0.45.3",
+ "pg": "^8.23.1",
+ "@types/pg": "^8.15.6",
+ "wrangler": "^4.148.0"
},
"agentskit": {
"stability": "beta",
- "stabilityNote": "File/SQLite/Redis backends — Memory contract v1."
+ "stabilityNote": "File/SQLite/Redis backends \u2014 Memory contract v1."
},
"license": "MIT",
"homepage": "https://www.agentskit.io/docs/reference/packages/memory",
diff --git a/packages/memory/src/postgres.ts b/packages/memory/src/postgres.ts
new file mode 100644
index 000000000..26e1f9cdc
--- /dev/null
+++ b/packages/memory/src/postgres.ts
@@ -0,0 +1,87 @@
+import type { ChatMemory, MemoryRecord } from '@agentskit/core'
+import { serializeMessages } from '@agentskit/core'
+import { validateMemoryRecord } from '@agentskit/core/memory-validation'
+import { and, eq } from 'drizzle-orm'
+import type { NodePgDatabase } from 'drizzle-orm/node-postgres'
+import { jsonb, pgTable, primaryKey, text } from 'drizzle-orm/pg-core'
+import { decodeStoredMessages } from './decode'
+
+/** Drizzle schema with one replace-all snapshot per tenant/session primary key. */
+export const postgresChatTable = pgTable('agentskit_chat_memory', {
+ tenantId: text('tenant_id').notNull(),
+ sessionId: text('session_id').notNull(),
+ record: jsonb('record').$type().notNull(),
+}, table => [primaryKey({ columns: [table.tenantId, table.sessionId] })])
+
+/** Idempotent PostgreSQL DDL; execute with the host's migration connection before use. */
+export const postgresChatMigrationSql = `CREATE TABLE IF NOT EXISTS agentskit_chat_memory (
+ tenant_id text NOT NULL,
+ session_id text NOT NULL,
+ record jsonb NOT NULL,
+ PRIMARY KEY (tenant_id, session_id)
+);`
+
+/** Host-owned Drizzle connection, isolation keys, and optional history retention. */
+export interface PostgresChatMemoryOptions {
+ db: Pick
+ tenantId: string
+ sessionId: string
+ /**
+ * Keep roughly the N newest messages, cut only at a user turn boundary and
+ * always keeping the leading system prompt. Default: no truncation.
+ */
+ maxMessages?: number
+}
+
+/**
+ * Index where bounded retention starts. The kept window always begins at a
+ * `user` message, so no user/assistant pair or tool call/result group is split.
+ * Moves forward from the N-newest cutoff to the next user turn; if the cutoff is
+ * inside the last turn, moves back to that turn's user message instead, so the
+ * in-progress turn is kept whole (and may exceed N). Without any user message
+ * the history is kept unchanged rather than emptied.
+ */
+function retentionStart(roles: readonly string[], maxMessages: number): number {
+ const cutoff = Math.max(0, roles.length - maxMessages)
+ for (let i = cutoff; i < roles.length; i++) if (roles[i] === 'user') return i
+ for (let i = cutoff - 1; i >= 0; i--) if (roles[i] === 'user') return i
+ return 0
+}
+
+/** BYO Drizzle/pg connection; the caller owns migration and connection lifetime. */
+export function postgresChatMemory({ db, tenantId, sessionId, maxMessages }: PostgresChatMemoryOptions): ChatMemory {
+ if (typeof tenantId !== 'string' || !tenantId.trim()
+ || typeof sessionId !== 'string' || !sessionId.trim()) {
+ throw new TypeError('tenantId and sessionId must be non-empty strings')
+ }
+ if (maxMessages !== undefined && (!Number.isSafeInteger(maxMessages) || maxMessages < 1)) {
+ throw new RangeError('maxMessages must be a positive safe integer')
+ }
+ const key = and(eq(postgresChatTable.tenantId, tenantId), eq(postgresChatTable.sessionId, sessionId))
+ return {
+ async load(options) {
+ options?.signal?.throwIfAborted()
+ const [row] = await db.select({ record: postgresChatTable.record }).from(postgresChatTable).where(key)
+ options?.signal?.throwIfAborted()
+ return row ? decodeStoredMessages(JSON.stringify(row.record), 'postgresChatMemory') : []
+ },
+ async save(messages, options) {
+ options?.signal?.throwIfAborted()
+ const record = validateMemoryRecord(serializeMessages(messages))
+ if (maxMessages !== undefined) {
+ const roles = record.messages.map(message => message.role)
+ const start = retentionStart(roles, maxMessages)
+ let systemPrefix = 0
+ while (systemPrefix < start && roles[systemPrefix] === 'system') systemPrefix++
+ record.messages = [...record.messages.slice(0, systemPrefix), ...record.messages.slice(start)]
+ }
+ options?.signal?.throwIfAborted()
+ await db.insert(postgresChatTable).values({ tenantId, sessionId, record })
+ .onConflictDoUpdate({ target: [postgresChatTable.tenantId, postgresChatTable.sessionId], set: { record } })
+ },
+ async clear(options) {
+ options?.signal?.throwIfAborted()
+ await db.delete(postgresChatTable).where(key)
+ },
+ }
+}
diff --git a/packages/memory/tests/postgres-contract.ts b/packages/memory/tests/postgres-contract.ts
new file mode 100644
index 000000000..71d198257
--- /dev/null
+++ b/packages/memory/tests/postgres-contract.ts
@@ -0,0 +1,118 @@
+import { deepStrictEqual } from 'node:assert/strict'
+import type { Message } from '@agentskit/core'
+import { sql } from 'drizzle-orm'
+import type { NodePgDatabase } from 'drizzle-orm/node-postgres'
+import { postgresChatMemory, postgresChatMigrationSql, postgresChatTable } from '@agentskit/memory/postgres'
+
+function check(value: unknown, label: string): asserts value {
+ if (!value) throw new Error(label)
+}
+function equal(a: unknown, b: unknown, label: string) {
+ deepStrictEqual(a, b, label)
+}
+async function rejects(run: () => unknown, label: string) {
+ try { await run() } catch { return }
+ throw new Error(label)
+}
+
+export async function postgresContract(db: NodePgDatabase, prefix: string) {
+ await db.execute(sql.raw(postgresChatMigrationSql))
+ const options = { db, tenantId: prefix, sessionId: 'shared' }
+ const memory = postgresChatMemory(options)
+ const otherTenant = postgresChatMemory({ ...options, tenantId: `${prefix}-other` })
+ const otherSession = postgresChatMemory({ ...options, sessionId: 'other' })
+ const message: Message = {
+ id: 'one', role: 'user', content: 'synthetic', status: 'complete', createdAt: new Date('2026-01-01Z'),
+ parts: [
+ { type: 'text', text: 'synthetic' },
+ { type: 'image', source: 'https://example.test/image', detail: 'high' },
+ { type: 'file', source: 's3://synthetic/file', filename: 'test.pdf', mimeType: 'application/pdf' },
+ { type: 'audio', source: 'https://example.test/audio', durationSec: 2 },
+ { type: 'video', source: 'https://example.test/video', durationSec: 3 },
+ ],
+ metadata: { synthetic: { nested: true } },
+ toolCalls: [{ id: 'call', name: 'synthetic', args: {}, status: 'complete' }],
+ }
+ const second: Message = { ...message, id: 'two', role: 'assistant' }
+ try {
+ await memory.clear!(); await otherTenant.clear!(); await otherSession.clear!()
+ equal(await memory.load(), [], 'CM5 empty')
+ await memory.save([second, message])
+ equal(await memory.load(), [second, message], 'CM3 parts/order/metadata roundtrip')
+ check((await memory.load())[0]!.createdAt instanceof Date, 'Date restored')
+ const snapshot = await memory.load()
+ snapshot[0]!.parts![0] = { type: 'text', text: 'mutated' }
+ equal(await memory.load(), [second, message], 'CM1 independent snapshot')
+ equal(await otherTenant.load(), [], 'tenant read isolation')
+ equal(await otherSession.load(), [], 'session read isolation')
+ await otherTenant.save([second]); await otherSession.save([second])
+ await memory.save([message])
+ equal(await memory.load(), [message], 'CM2 replace-all')
+ equal(await otherTenant.load(), [second], 'tenant write isolation')
+ equal(await otherSession.load(), [second], 'session write isolation')
+ await memory.clear!()
+ equal(await memory.load(), [], 'CM6 clear')
+ equal(await otherTenant.load(), [second], 'tenant clear isolation')
+ equal(await otherSession.load(), [second], 'session clear isolation')
+ await Promise.all([memory.save([message]), memory.save([second, message])])
+ const concurrent = await memory.load()
+ check(concurrent.length === 1 || concurrent.length === 2, 'CM4 complete concurrent snapshot')
+ equal(concurrent, concurrent.length === 1 ? [message] : [second, message], 'CM4 no partial writes')
+ await memory.save([])
+ equal(await memory.load(), [], 'CM2 empty replace')
+ const bounded = postgresChatMemory({ ...options, maxMessages: 1 })
+ await bounded.save([message, second])
+ equal(await bounded.load(), [message, second], 'retention never splits a user/assistant turn')
+ const user2: Message = { ...message, id: 'user-2' }
+ const answer2: Message = { ...second, id: 'answer-2' }
+ const system: Message = { ...message, id: 'system', role: 'system' }
+ for (const [maxMessages, expected] of [
+ [1, [system, user2, answer2]], [2, [system, user2, answer2]], [3, [system, user2, answer2]],
+ [4, [system, message, second, user2, answer2]], [5, [system, message, second, user2, answer2]],
+ ] as const) {
+ const retained = postgresChatMemory({ ...options, maxMessages })
+ await retained.save([system, message, second, user2, answer2])
+ equal(await retained.load(), expected, `turn boundary retention N=${maxMessages}`)
+ }
+ const call: Message = { ...second, id: 'calls', toolCalls: [
+ { id: 'a', name: 'synthetic', args: {}, status: 'complete' },
+ { id: 'b', name: 'synthetic', args: {}, status: 'complete' },
+ ] }
+ const result: Message = { id: 'result-a', role: 'tool', content: 'result', status: 'complete', createdAt: message.createdAt, toolCallId: 'a' }
+ const resultB: Message = { ...result, id: 'result-b', toolCallId: 'b' }
+ const answer: Message = { id: 'answer', role: 'assistant', content: 'answer', status: 'complete', createdAt: message.createdAt }
+ const history = [message, call, result, resultB, answer]
+ for (const [maxMessages, expected] of [
+ [1, history], [2, history], [3, history], [4, history], [5, history],
+ ] as const) {
+ const retained = postgresChatMemory({ ...options, maxMessages })
+ await retained.save(history)
+ equal(await retained.load(), expected, `tool boundary retention N=${maxMessages}`)
+ }
+ await bounded.save([call, result, resultB])
+ equal(await bounded.load(), [call, result, resultB], 'history without a user turn is never emptied')
+ await bounded.save([message, call, result])
+ equal(await bounded.load(), [message, call, result], 'in-progress tool turn kept whole')
+ await bounded.save([second])
+ const controller = new AbortController(); controller.abort()
+ await rejects(() => memory.load({ signal: controller.signal }), 'aborted load')
+ await rejects(() => memory.save([message], { signal: controller.signal }), 'aborted save')
+ await rejects(() => memory.clear!({ signal: controller.signal }), 'aborted clear')
+ equal(await memory.load(), [second], 'aborted mutations preserved state')
+ await rejects(() => memory.save([{ ...message, role: 'invalid' } as unknown as Message]), 'invalid save rejected')
+ equal(await memory.load(), [second], 'invalid save preserved state')
+ await db.insert(postgresChatTable).values({ tenantId: options.tenantId, sessionId: options.sessionId, record: { version: 1, messages: [] } })
+ .onConflictDoUpdate({ target: [postgresChatTable.tenantId, postgresChatTable.sessionId], set: { record: sql`'{"version":2}'::jsonb` } })
+ await rejects(() => memory.load(), 'corrupt record rejected')
+ await memory.save([message])
+ equal(await memory.load(), [message], 'recovery by replace')
+ for (const maxMessages of [0, -1, 1.5, Infinity]) {
+ await rejects(() => postgresChatMemory({ ...options, maxMessages }), 'invalid retention config')
+ }
+ await rejects(() => postgresChatMemory({ ...options, tenantId: '' }), 'empty tenant rejected')
+ await rejects(() => postgresChatMemory({ ...options, sessionId: '' }), 'empty session rejected')
+ return { contract: 'CM1-CM6', isolation: 'tenant/session', parts: 'all five kinds', retention: 'newest N', abort: 'pre-query', recovery: 'passed' }
+ } finally {
+ await memory.clear!(); await otherTenant.clear!(); await otherSession.clear!()
+ }
+}
diff --git a/packages/memory/tests/postgres-worker.ts b/packages/memory/tests/postgres-worker.ts
new file mode 100644
index 000000000..479cb6a1c
--- /dev/null
+++ b/packages/memory/tests/postgres-worker.ts
@@ -0,0 +1,18 @@
+import { Client } from 'pg'
+import { drizzle } from 'drizzle-orm/node-postgres'
+import { postgresContract } from './postgres-contract'
+
+const worker = {
+ async fetch(_request: Request, env: { AK_POSTGRES_TEST_PORT: string }, ctx: { waitUntil(promise: Promise): void }) {
+ const client = new Client({ host: '127.0.0.1', port: Number(env.AK_POSTGRES_TEST_PORT), user: 'postgres', database: 'postgres' })
+ try {
+ await client.connect()
+ const result = await postgresContract(drizzle(client), `worker-${crypto.randomUUID()}`)
+ return Response.json(result)
+ } catch {
+ return Response.json({ error: 'Postgres workerd contract failed' }, { status: 500 })
+ } finally { ctx.waitUntil(client.end()) }
+ },
+}
+// Wrangler's module entry requires a default export; this is a test-only fixture.
+export { worker as default }
diff --git a/packages/memory/tests/postgres-workerd.mjs b/packages/memory/tests/postgres-workerd.mjs
new file mode 100644
index 000000000..ecbcb055d
--- /dev/null
+++ b/packages/memory/tests/postgres-workerd.mjs
@@ -0,0 +1,25 @@
+import { spawnProcess } from '@agentskit/cross-platform'
+import { mkdtemp, rm } from 'node:fs/promises'
+import { tmpdir } from 'node:os'
+import { join } from 'node:path'
+import assert from 'node:assert/strict'
+import { readJson, retry } from '@agentskit/net'
+
+assert(process.env.AK_POSTGRES_TEST_PORT, 'Set AK_POSTGRES_TEST_PORT to a local trust-auth PostgreSQL 16 port')
+const state = await mkdtemp(join(tmpdir(), 'ak-memory-workerd-'))
+const child = spawnProcess('pnpm', ['exec', 'wrangler', 'dev', '--config', 'tests/wrangler.postgres.jsonc', '--local', '--port', '8799', '--persist-to', state, '--var', `AK_POSTGRES_TEST_PORT:${process.env.AK_POSTGRES_TEST_PORT}`], { stdin: 'ignore', stdout: 'ignore', stderr: 'ignore', env: { ...process.env, WRANGLER_SEND_METRICS: 'false' } })
+let running = true
+void child.exited.then(() => { running = false }, () => { running = false })
+try {
+ const response = await retry(async () => {
+ assert(running, 'wrangler exited before acceptance')
+ return fetch('http://127.0.0.1:8799', { signal: AbortSignal.timeout(15000) })
+ }, { retries: 239, minDelayMs: 500, maxDelayMs: 500, jitter: 'none', shouldRetry: () => running })
+ assert.equal(response.status, 200, 'real workerd/Postgres request')
+ assert.deepEqual(await readJson(response, { maxBytes: 4096 }), { contract: 'CM1-CM6', isolation: 'tenant/session', parts: 'all five kinds', retention: 'newest N', abort: 'pre-query', recovery: 'passed' })
+ console.log('workerd + PostgreSQL: CM1-CM6, isolation, parts, retention, abort and recovery passed')
+} finally {
+ await child.kill('SIGTERM')
+ await child.exited.catch(() => {})
+ await rm(state, { recursive: true, force: true })
+}
diff --git a/packages/memory/tests/postgres.integration.test.ts b/packages/memory/tests/postgres.integration.test.ts
new file mode 100644
index 000000000..e53447522
--- /dev/null
+++ b/packages/memory/tests/postgres.integration.test.ts
@@ -0,0 +1,12 @@
+import { expect, it } from 'vitest'
+import { Pool } from 'pg'
+import { drizzle } from 'drizzle-orm/node-postgres'
+import { postgresContract } from './postgres-contract'
+
+it.skipIf(!process.env.AK_POSTGRES_TEST_PORT)('ChatMemory contract on real PostgreSQL', async () => {
+ const pool = new Pool({ host: '127.0.0.1', port: Number(process.env.AK_POSTGRES_TEST_PORT), user: 'postgres', database: 'postgres' })
+ try {
+ expect((await pool.query('SHOW server_version')).rows[0].server_version).toMatch(/^16\./)
+ expect(await postgresContract(drizzle(pool), `test-${crypto.randomUUID()}`)).toMatchObject({ recovery: 'passed' })
+ } finally { await pool.end() }
+}, 30_000)
diff --git a/packages/memory/tests/wrangler.postgres.jsonc b/packages/memory/tests/wrangler.postgres.jsonc
new file mode 100644
index 000000000..52f7e6f0d
--- /dev/null
+++ b/packages/memory/tests/wrangler.postgres.jsonc
@@ -0,0 +1,6 @@
+{
+ "name": "agentskit-memory-postgres-test",
+ "main": "postgres-worker.ts",
+ "compatibility_date": "2026-10-01",
+ "compatibility_flags": ["nodejs_compat"]
+}
diff --git a/packages/memory/tsup.config.ts b/packages/memory/tsup.config.ts
index 0ecf98fc1..6af78b90f 100644
--- a/packages/memory/tsup.config.ts
+++ b/packages/memory/tsup.config.ts
@@ -5,9 +5,10 @@ export default defineConfig({
...sharedTsupOptions,
entry: {
index: 'src/index.ts',
+ postgres: 'src/postgres.ts',
personalization: 'src/personalization.ts',
'web-storage': 'src/web-storage.ts',
},
clean: false,
- external: ['better-sqlite3', 'redis', 'vectra', '@lancedb/lancedb'],
+ external: ['drizzle-orm', 'pg', 'better-sqlite3', 'redis', 'vectra', '@lancedb/lancedb'],
})
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9a5216a29..d8dfe9d06 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1223,15 +1223,27 @@ importers:
specifier: workspace:*
version: link:../net
devDependencies:
+ '@agentskit/cross-platform':
+ specifier: workspace:*
+ version: link:../cross-platform
'@types/better-sqlite3':
specifier: ^7.6.13
version: 7.6.13
'@types/node':
specifier: ^25.9.5
version: 25.9.5
+ '@types/pg':
+ specifier: ^8.15.6
+ version: 8.23.1
better-sqlite3:
specifier: ^13.0.3
version: 13.0.3
+ drizzle-orm:
+ specifier: ^0.45.3
+ version: 0.45.3(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.23.1)(@upstash/redis@1.38.4)(better-sqlite3@13.0.3)(pg@8.23.1)
+ pg:
+ specifier: ^8.23.1
+ version: 8.23.1
redis:
specifier: ^6.2.1
version: 6.2.1(@opentelemetry/api@1.9.1)
@@ -1247,6 +1259,9 @@ importers:
vitest:
specifier: ^4.1.11
version: 4.1.11(@opentelemetry/api@1.9.1)(@types/node@25.9.5)(@vitest/coverage-v8@4.1.11)(happy-dom@20.14.5)(jsdom@30.0.1(@noble/hashes@2.2.0))(msw@2.15.0(@types/node@25.9.5)(typescript@6.0.3))(vite@8.3.0(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))
+ wrangler:
+ specifier: ^4.148.0
+ version: 4.148.0(@types/node@25.9.5)
packages/net:
dependencies:
@@ -2322,6 +2337,10 @@ packages:
'@cloudflare/config@0.22.0':
resolution: {integrity: sha512-6FoqVlQicGs6DcUn5zbWUbcXomqtqIe+dFKwYJGKTJI/3W1dNQ2sKzxttNthiQG9RJhrENki4BNrpZtZuHwvXw==}
+ '@cloudflare/kv-asset-handler@0.5.0':
+ resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==}
+ engines: {node: '>=22.0.0'}
+
'@cloudflare/runtime-types@0.1.6':
resolution: {integrity: sha512-sXsT4U4r9uSHzbN6fVio6mhtaBa4B0TwQHpeatD13e6LYnTG1I7tvjC8dYtfvoKSaazpxXdH49MiU+nqQaEDRA==}
@@ -2346,30 +2365,60 @@ packages:
cpu: [x64]
os: [darwin]
+ '@cloudflare/workerd-darwin-64@1.20261006.1':
+ resolution: {integrity: sha512-lCX6avJO2It9AyDEYitjmOtJRVp/xmaW0TziyoLAnfxlzozyyRbSFfIIMMCiDx/sTP1++E4VLbV+7BHSD33f0Q==}
+ engines: {node: '>=16'}
+ cpu: [x64]
+ os: [darwin]
+
'@cloudflare/workerd-darwin-arm64@1.20260930.2':
resolution: {integrity: sha512-cviPpheZGQ2H5X+Ctxd3wfxhksNrdyoNprjSgg3br2+psetKacjdEvK8CILdN/2GF+u1KOExvr45amSL6lgzGA==}
engines: {node: '>=16'}
cpu: [arm64]
os: [darwin]
+ '@cloudflare/workerd-darwin-arm64@1.20261006.1':
+ resolution: {integrity: sha512-PyFGjOaldtppnLuKsdkoYWXfLVpDjuf8u+uoykX+1Xvxo2EPmCVViq0iDKm+U7c7PRno85ehS3/MPVXyk2HwHw==}
+ engines: {node: '>=16'}
+ cpu: [arm64]
+ os: [darwin]
+
'@cloudflare/workerd-linux-64@1.20260930.2':
resolution: {integrity: sha512-cwrJAC5y/avPd1OzGyhc5OvUUfPXBFc065TY5CjXp7Hb3dhiTx6JeB5Pc8L3G8L8M44HyAfRHSpoLtRr+SR3cQ==}
engines: {node: '>=16'}
cpu: [x64]
os: [linux]
+ '@cloudflare/workerd-linux-64@1.20261006.1':
+ resolution: {integrity: sha512-Ntf9S8eesmVufdjaT2kzWlz6Ng9XGYTc6cHQVRKAg59lFufwsIabGeMT6U4KkrpEeSIxgHq8aPtuLbZXE19tCA==}
+ engines: {node: '>=16'}
+ cpu: [x64]
+ os: [linux]
+
'@cloudflare/workerd-linux-arm64@1.20260930.2':
resolution: {integrity: sha512-FHucB4gak1IuT+IxLx3KbtMBMapZhcqD9EdhHvBxk1FpHwD2QU5x26MRRVN53jIKG/O25HUmE9yffb3cMANQgw==}
engines: {node: '>=16'}
cpu: [arm64]
os: [linux]
+ '@cloudflare/workerd-linux-arm64@1.20261006.1':
+ resolution: {integrity: sha512-JyeDBymVWw5tVRebSsVE8ojDYxd6UlZrAseHU8G+NpIyd5wF61tXlF/axLeCUqu0pOhBFHb8I5QKi0jwrCK41Q==}
+ engines: {node: '>=16'}
+ cpu: [arm64]
+ os: [linux]
+
'@cloudflare/workerd-windows-64@1.20260930.2':
resolution: {integrity: sha512-JHFMdGFMqP+M2QiVzZq1S8Ie66Gvxo7Og5EYz/KtmDvGCqge5L3lK+ksZxAhF3j/tpSLqdvlUvcTKoR9PkwTTQ==}
engines: {node: '>=16'}
cpu: [x64]
os: [win32]
+ '@cloudflare/workerd-windows-64@1.20261006.1':
+ resolution: {integrity: sha512-nWP0URNqOBN9fa/gZ7eh/w051DwjOXN8j4lDZDYVXyQPsux6sV3DfyYZT+CjR/rt9nKBSmJT9QE9/bWT18+84w==}
+ engines: {node: '>=16'}
+ cpu: [x64]
+ os: [win32]
+
'@cloudflare/workers-response-store@1.0.1':
resolution: {integrity: sha512-rZdrveppNHye0CCvup2BUcx+/OIJyaIPUWeAqXICASM/60Fc9EK0aVFjLz7SrHIj8rgFRynshlI24yQIO7P1Ug==}
engines: {node: '>=22'}
@@ -4908,6 +4957,9 @@ packages:
'@types/node@26.6.1':
resolution: {integrity: sha512-VqGJBMCtdhqkBUCcBLvywI0NJ+KLuVzgNnlBUNFOQjqVxzo2lxLUNg1DSey8+u2u6ktswSAxg+s68QLzWHNOuA==}
+ '@types/pg@8.23.1':
+ resolution: {integrity: sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==}
+
'@types/prop-types@15.7.15':
resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
@@ -6203,6 +6255,101 @@ packages:
resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==}
engines: {node: '>=12'}
+ drizzle-orm@0.45.3:
+ resolution: {integrity: sha512-CAloER21cDdcgZ1OmjrZX82EeRNsdP+y0onX/eyoYDaYzki/adrAa91lzM5jWh7zZPK4qUbw/6LGv9J+A+uizA==}
+ peerDependencies:
+ '@aws-sdk/client-rds-data': '>=3'
+ '@cloudflare/workers-types': '>=4'
+ '@electric-sql/pglite': '>=0.2.0'
+ '@libsql/client': '>=0.10.0'
+ '@libsql/client-wasm': '>=0.10.0'
+ '@neondatabase/serverless': '>=0.10.0'
+ '@netlify/db': '>=0.4.0'
+ '@op-engineering/op-sqlite': '>=2'
+ '@opentelemetry/api': ^1.4.1
+ '@planetscale/database': '>=1.13'
+ '@prisma/client': '*'
+ '@tidbcloud/serverless': '*'
+ '@types/better-sqlite3': '*'
+ '@types/pg': '*'
+ '@types/sql.js': '*'
+ '@upstash/redis': '>=1.34.7'
+ '@vercel/postgres': '>=0.8.0'
+ '@xata.io/client': '*'
+ better-sqlite3: '>=7'
+ bun-types: '*'
+ expo-sqlite: '>=14.0.0'
+ gel: '>=2'
+ knex: '*'
+ kysely: '*'
+ mysql2: '>=2'
+ pg: '>=8'
+ postgres: '>=3'
+ prisma: '*'
+ sql.js: '>=1'
+ sqlite3: '>=5'
+ peerDependenciesMeta:
+ '@aws-sdk/client-rds-data':
+ optional: true
+ '@cloudflare/workers-types':
+ optional: true
+ '@electric-sql/pglite':
+ optional: true
+ '@libsql/client':
+ optional: true
+ '@libsql/client-wasm':
+ optional: true
+ '@neondatabase/serverless':
+ optional: true
+ '@netlify/db':
+ optional: true
+ '@op-engineering/op-sqlite':
+ optional: true
+ '@opentelemetry/api':
+ optional: true
+ '@planetscale/database':
+ optional: true
+ '@prisma/client':
+ optional: true
+ '@tidbcloud/serverless':
+ optional: true
+ '@types/better-sqlite3':
+ optional: true
+ '@types/pg':
+ optional: true
+ '@types/sql.js':
+ optional: true
+ '@upstash/redis':
+ optional: true
+ '@vercel/postgres':
+ optional: true
+ '@xata.io/client':
+ optional: true
+ better-sqlite3:
+ optional: true
+ bun-types:
+ optional: true
+ expo-sqlite:
+ optional: true
+ gel:
+ optional: true
+ knex:
+ optional: true
+ kysely:
+ optional: true
+ mysql2:
+ optional: true
+ pg:
+ optional: true
+ postgres:
+ optional: true
+ prisma:
+ optional: true
+ sql.js:
+ optional: true
+ sqlite3:
+ optional: true
+
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
@@ -7997,6 +8144,10 @@ packages:
resolution: {integrity: sha512-vZljfRtOEeynbhJtuvYsnCU8t6zF5wIUm9ql4YFHB7zvYw2+F2tpT0BzXjzaa++eiUIml1gsODCf02qShBmJdg==}
engines: {node: '>=22.0.0'}
+ miniflare@5.20261006.0-alpha:
+ resolution: {integrity: sha512-UP3qIeQKHba59GHxBqD8H2GateacluT4vrjIpqEgH78kCSUxdu8jA0f7MH7ftRSAnnB1oOvEsDtav3xevQDbpQ==}
+ engines: {node: '>=22.0.0'}
+
minimatch@10.2.5:
resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
engines: {node: 18 || 20 || >=22}
@@ -8484,6 +8635,40 @@ packages:
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+ pg-cloudflare@1.4.1:
+ resolution: {integrity: sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ==}
+
+ pg-connection-string@2.14.1:
+ resolution: {integrity: sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==}
+
+ pg-int8@1.0.1:
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+ engines: {node: '>=4.0.0'}
+
+ pg-pool@3.14.0:
+ resolution: {integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==}
+ peerDependencies:
+ pg: '>=8.0'
+
+ pg-protocol@1.16.1:
+ resolution: {integrity: sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==}
+
+ pg-types@2.2.0:
+ resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+ engines: {node: '>=4'}
+
+ pg@8.23.1:
+ resolution: {integrity: sha512-aL96AHANtWjPLDOLqnhx+ngp9+UK7ETEU8VJrDCGvsSSi/mGLcWYsS6Herg7lmaBJe4uwrfqsa7gTEFaSizDoQ==}
+ engines: {node: '>= 16.0.0'}
+ peerDependencies:
+ pg-native: '>=3.0.1'
+ peerDependenciesMeta:
+ pg-native:
+ optional: true
+
+ pgpass@1.0.5:
+ resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -8558,6 +8743,22 @@ packages:
resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==}
engines: {node: ^10 || ^12 || >=14}
+ postgres-array@2.0.0:
+ resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
+ engines: {node: '>=4'}
+
+ postgres-bytea@1.0.1:
+ resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-date@1.0.7:
+ resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-interval@1.2.0:
+ resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+ engines: {node: '>=0.10.0'}
+
posthog-js@1.433.6:
resolution: {integrity: sha512-wGCGLHTDxwwWefyJ02tZaw3zVOURqidzGL9Ytv4MTbNuCo12X511TvLV1k+QLiohsB+aZ0c84K5o0clGqn0qgA==}
peerDependencies:
@@ -9088,6 +9289,10 @@ packages:
spawndamnit@3.0.1:
resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==}
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
srvx@0.12.8:
resolution: {integrity: sha512-7k9HoDhluTlD7UJ+F+OopZoPZXB2J8f/5nW2VMLaB8KsSlZlRQxyyoX0hWEQCxB+F+3ZvB5QX3LqB6xSBRfxQQ==}
engines: {node: '>=20.16.0'}
@@ -9842,6 +10047,21 @@ packages:
engines: {node: '>=16'}
hasBin: true
+ workerd@1.20261006.1:
+ resolution: {integrity: sha512-8MadBuffZ5NdpLwZjUmsqT5QlaKXq4gjgT6wzcKeynZTICNXyePhc+5QVoKiK7+MMhFTLNrRO2KXLlpk8Q6BkA==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ wrangler@4.148.0:
+ resolution: {integrity: sha512-wgbll8cA/7qOMJSoYQuJrw9M9lmedGzYtg6wvUK2p/7G1KaE88jFmQ/CvtQzVUF9C8PQtC4Y5p9vbpAsJGAlpA==}
+ engines: {node: '>=22.0.0'}
+ hasBin: true
+ peerDependencies:
+ '@cloudflare/workers-types': ^5.20261006.1
+ peerDependenciesMeta:
+ '@cloudflare/workers-types':
+ optional: true
+
wrap-ansi@10.0.0:
resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==}
engines: {node: '>=20'}
@@ -9900,6 +10120,10 @@ packages:
xmlchars@2.2.0:
resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@@ -10934,6 +11158,8 @@ snapshots:
dependencies:
zod: 4.4.3
+ '@cloudflare/kv-asset-handler@0.5.0': {}
+
'@cloudflare/runtime-types@0.1.6(@types/node@26.2.0)':
dependencies:
miniflare: 5.20260930.0-alpha(@types/node@26.2.0)
@@ -10949,6 +11175,12 @@ snapshots:
optionalDependencies:
workerd: 1.20260930.2
+ '@cloudflare/unenv-preset@2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261006.1)':
+ dependencies:
+ unenv: 2.0.0-rc.24
+ optionalDependencies:
+ workerd: 1.20261006.1
+
'@cloudflare/vite-plugin@2.0.0-beta.sha-52b0dc0e9(@types/node@26.2.0)(vite@8.3.0(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))(workerd@1.20260930.2)':
dependencies:
'@cloudflare/build-output-utils': 0.8.4
@@ -10968,18 +11200,33 @@ snapshots:
'@cloudflare/workerd-darwin-64@1.20260930.2':
optional: true
+ '@cloudflare/workerd-darwin-64@1.20261006.1':
+ optional: true
+
'@cloudflare/workerd-darwin-arm64@1.20260930.2':
optional: true
+ '@cloudflare/workerd-darwin-arm64@1.20261006.1':
+ optional: true
+
'@cloudflare/workerd-linux-64@1.20260930.2':
optional: true
+ '@cloudflare/workerd-linux-64@1.20261006.1':
+ optional: true
+
'@cloudflare/workerd-linux-arm64@1.20260930.2':
optional: true
+ '@cloudflare/workerd-linux-arm64@1.20261006.1':
+ optional: true
+
'@cloudflare/workerd-windows-64@1.20260930.2':
optional: true
+ '@cloudflare/workerd-windows-64@1.20261006.1':
+ optional: true
+
'@cloudflare/workers-response-store@1.0.1': {}
'@cloudflare/workers-types@4.20260702.1': {}
@@ -13792,6 +14039,12 @@ snapshots:
dependencies:
undici-types: 8.9.0
+ '@types/pg@8.23.1':
+ dependencies:
+ '@types/node': 26.6.1
+ pg-protocol: 1.16.1
+ pg-types: 2.2.0
+
'@types/prop-types@15.7.15': {}
'@types/react-dom@19.2.3(@types/react@19.2.17)':
@@ -15124,6 +15377,15 @@ snapshots:
dotenv@17.4.2: {}
+ drizzle-orm@0.45.3(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.23.1)(@upstash/redis@1.38.4)(better-sqlite3@13.0.3)(pg@8.23.1):
+ optionalDependencies:
+ '@opentelemetry/api': 1.9.1
+ '@types/better-sqlite3': 7.6.13
+ '@types/pg': 8.23.1
+ '@upstash/redis': 1.38.4
+ better-sqlite3: 13.0.3
+ pg: 8.23.1
+
dunder-proto@1.0.1:
dependencies:
call-bind-apply-helpers: 1.0.2
@@ -17681,6 +17943,19 @@ snapshots:
- bufferutil
- utf-8-validate
+ miniflare@5.20261006.0-alpha(@types/node@25.9.5):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ sharp: 0.35.5(@types/node@25.9.5)
+ undici: 7.29.1
+ workerd: 1.20261006.1
+ ws: 8.21.0
+ youch: 4.1.0-beta.10
+ transitivePeerDependencies:
+ - '@types/node'
+ - bufferutil
+ - utf-8-validate
+
minimatch@10.2.5:
dependencies:
brace-expansion: 5.0.9
@@ -18254,6 +18529,41 @@ snapshots:
pathe@2.0.3: {}
+ pg-cloudflare@1.4.1:
+ optional: true
+
+ pg-connection-string@2.14.1: {}
+
+ pg-int8@1.0.1: {}
+
+ pg-pool@3.14.0(pg@8.23.1):
+ dependencies:
+ pg: 8.23.1
+
+ pg-protocol@1.16.1: {}
+
+ pg-types@2.2.0:
+ dependencies:
+ pg-int8: 1.0.1
+ postgres-array: 2.0.0
+ postgres-bytea: 1.0.1
+ postgres-date: 1.0.7
+ postgres-interval: 1.2.0
+
+ pg@8.23.1:
+ dependencies:
+ pg-connection-string: 2.14.1
+ pg-pool: 3.14.0(pg@8.23.1)
+ pg-protocol: 1.16.1
+ pg-types: 2.2.0
+ pgpass: 1.0.5
+ optionalDependencies:
+ pg-cloudflare: 1.4.1
+
+ pgpass@1.0.5:
+ dependencies:
+ split2: 4.2.0
+
picocolors@1.1.1: {}
picomatch@2.3.2: {}
@@ -18310,6 +18620,16 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.2
+ postgres-array@2.0.0: {}
+
+ postgres-bytea@1.0.1: {}
+
+ postgres-date@1.0.7: {}
+
+ postgres-interval@1.2.0:
+ dependencies:
+ xtend: 4.0.2
+
posthog-js@1.433.6(@types/react@19.2.17)(react@19.2.7):
dependencies:
'@posthog/browser-common': 0.8.3
@@ -19230,6 +19550,8 @@ snapshots:
cross-spawn: 7.0.6
signal-exit: 4.1.0
+ split2@4.2.0: {}
+
srvx@0.12.8: {}
stack-utils@2.0.6:
@@ -20177,6 +20499,31 @@ snapshots:
'@cloudflare/workerd-linux-arm64': 1.20260930.2
'@cloudflare/workerd-windows-64': 1.20260930.2
+ workerd@1.20261006.1:
+ optionalDependencies:
+ '@cloudflare/workerd-darwin-64': 1.20261006.1
+ '@cloudflare/workerd-darwin-arm64': 1.20261006.1
+ '@cloudflare/workerd-linux-64': 1.20261006.1
+ '@cloudflare/workerd-linux-arm64': 1.20261006.1
+ '@cloudflare/workerd-windows-64': 1.20261006.1
+
+ wrangler@4.148.0(@types/node@25.9.5):
+ dependencies:
+ '@cloudflare/kv-asset-handler': 0.5.0
+ '@cloudflare/unenv-preset': 2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261006.1)
+ blake3-wasm: 2.1.5
+ esbuild: 0.28.1
+ miniflare: 5.20261006.0-alpha(@types/node@25.9.5)
+ path-to-regexp: 6.3.0
+ unenv: 2.0.0-rc.24
+ workerd: 1.20261006.1
+ optionalDependencies:
+ fsevents: 2.3.3
+ transitivePeerDependencies:
+ - '@types/node'
+ - bufferutil
+ - utf-8-validate
+
wrap-ansi@10.0.0:
dependencies:
ansi-styles: 6.2.3
@@ -20207,6 +20554,8 @@ snapshots:
xmlchars@2.2.0: {}
+ xtend@4.0.2: {}
+
y18n@5.0.8: {}
yallist@3.1.1: {}
diff --git a/readme-standard-v1.json b/readme-standard-v1.json
index d08726b44..d108a10c8 100644
--- a/readme-standard-v1.json
+++ b/readme-standard-v1.json
@@ -197,8 +197,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-09-25",
- "reviewDueOn": "2026-12-24",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-01-06",
"sources": [
"README.md",
"apps/docs-next/fixtures/first-agent/agent.ts",
@@ -207,7 +207,7 @@
"ecosystem.json",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:3a5921eaaf01df895ff645c1a6e2cb95252d3cd2ee9b1c807957619098d191c7"
+ "sourceHash": "sha256:f61a3673d449f8e36416e938f37447c6dda698b989ca5bd6ee2962223753e266"
},
"exceptions": []
},
@@ -276,8 +276,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/adapters/README.md",
"packages/adapters/package.json",
@@ -354,8 +354,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-04-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/angular/README.md",
"packages/angular/package.json",
@@ -432,8 +432,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/cli/README.md",
"packages/cli/package.json",
@@ -510,8 +510,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/core/README.md",
"packages/core/package.json",
@@ -588,8 +588,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-04-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/eval/README.md",
"packages/eval/package.json",
@@ -666,8 +666,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-04-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/eval-braintrust/README.md",
"packages/eval-braintrust/package.json",
@@ -744,8 +744,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-04-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/ink/README.md",
"packages/ink/package.json",
@@ -822,8 +822,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/integrations/README.md",
"packages/integrations/package.json",
@@ -900,8 +900,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-09-25",
- "reviewDueOn": "2027-01-23",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/mcp/README.md",
"packages/mcp/package.json",
@@ -978,8 +978,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/memory/README.md",
"packages/memory/package.json",
@@ -987,7 +987,7 @@
"docs/STABILITY.md",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:e93bb599c99d5faf5c8b6f15137b1407933bd9c1e56650fa7313b6abaa677ad8"
+ "sourceHash": "sha256:0820eaa7069c0604769119af5d4c70111cef751f4cbba6f6acfe28d5e0236a10"
},
"exceptions": []
},
@@ -1056,8 +1056,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/observability/README.md",
"packages/observability/package.json",
@@ -1134,8 +1134,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-09-25",
- "reviewDueOn": "2027-03-24",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/observability-langfuse/README.md",
"packages/observability-langfuse/package.json",
@@ -1212,8 +1212,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/rag/README.md",
"packages/rag/package.json",
@@ -1290,8 +1290,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/react/README.md",
"packages/react/package.json",
@@ -1368,8 +1368,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-04-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/react-native/README.md",
"packages/react-native/package.json",
@@ -1446,8 +1446,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/runtime/README.md",
"packages/runtime/package.json",
@@ -1524,8 +1524,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-04-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/sandbox/README.md",
"packages/sandbox/package.json",
@@ -1602,8 +1602,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-09-25",
- "reviewDueOn": "2027-03-24",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/cross-platform/README.md",
"packages/cross-platform/package.json",
@@ -1680,8 +1680,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-09-28",
- "reviewDueOn": "2027-03-27",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/net/README.md",
"packages/net/package.json",
@@ -1758,8 +1758,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-09-25",
- "reviewDueOn": "2027-01-23",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/skills/README.md",
"packages/skills/package.json",
@@ -1836,8 +1836,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-04-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/solid/README.md",
"packages/solid/package.json",
@@ -1914,8 +1914,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-09-25",
- "reviewDueOn": "2027-03-24",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/statechart/README.md",
"packages/statechart/package.json",
@@ -1992,8 +1992,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-04-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/svelte/README.md",
"packages/svelte/package.json",
@@ -2070,8 +2070,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-04-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/templates/README.md",
"packages/templates/package.json",
@@ -2148,8 +2148,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-02-05",
"sources": [
"packages/tools/README.md",
"packages/tools/package.json",
@@ -2226,8 +2226,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-09-25",
- "reviewDueOn": "2027-03-24",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/validation/README.md",
"packages/validation/package.json",
@@ -2304,8 +2304,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-04-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-04-06",
"sources": [
"packages/vue/README.md",
"packages/vue/package.json",
@@ -2373,8 +2373,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-01-06",
"sources": [
"apps/docs-next/README.md",
"apps/docs-next/package.json",
@@ -2382,7 +2382,7 @@
"ecosystem-claims.json",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:1e69ab8fd2fc64d2549d288bd07d1222aff23b9dd76c5a04d6e1fc705b6f4b65"
+ "sourceHash": "sha256:df76152229929e336618335e0ce421b98f83958bbb8151edeb28f07873e77cbd"
},
"exceptions": [
{
@@ -2457,8 +2457,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-09-25",
- "reviewDueOn": "2026-12-24",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-01-06",
"sources": [
"apps/landing/README.md",
"apps/landing/package.json",
@@ -2466,7 +2466,7 @@
"ecosystem-claims.json",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:d0cb36c6b27cc4a081192e7b38efb149acda80cd28c155d5ade9fc24b8c46176"
+ "sourceHash": "sha256:ce98d8947c32cde8e390cbea73188c70f44a03411124886e36a18953b2d776bf"
},
"exceptions": [
{
@@ -2541,8 +2541,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-02",
- "reviewDueOn": "2026-12-31",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-01-06",
"sources": [
"apps/registry/README.md",
"apps/registry/package.json",
@@ -2550,7 +2550,7 @@
"ecosystem-claims.json",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:34f6b0851407cf08a39c0746f9937d05258098c445e16675f0b1e26151bd4a97"
+ "sourceHash": "sha256:600ae7a10307a6fd323d088ef9408841f4defa5b7fb70647d7d991d9d07f9ee7"
},
"exceptions": [
{
@@ -2625,8 +2625,8 @@
}
],
"freshness": {
- "reviewedOn": "2026-10-03",
- "reviewDueOn": "2027-01-01",
+ "reviewedOn": "2026-10-08",
+ "reviewDueOn": "2027-01-06",
"sources": [
"apps/ask-backend/README.md",
"apps/ask-backend/package.json",
@@ -2634,7 +2634,7 @@
"ecosystem-claims.json",
"scripts/readme-fixtures.test.mjs"
],
- "sourceHash": "sha256:260d8b8e8631d8f46c5d3920206b664962a74600ae104ec21bae8be369bdb725"
+ "sourceHash": "sha256:d7060be9c4c307fe39004dc49392c0ac011747804a3056bda6476afc9f585a89"
},
"exceptions": [
{