@tanstack/ai-persistence
Version:
Composable state persistence for TanStack AI messages, runs, interrupts, metadata, and locks.
103 lines (102 loc) • 4.25 kB
JavaScript
import { defineRunStore, isTerminalRunStatus } from "@tanstack/ai";
//#region src/types.ts
/** Type a {@link MessageStore} implementation inline. */
function defineMessageStore(store) {
return store;
}
/** Type an {@link InterruptStore} implementation inline. */
function defineInterruptStore(store) {
return store;
}
/** Type a {@link MetadataStore} implementation inline. */
function defineMetadataStore(store) {
return store;
}
/** Type a {@link GenerationRunStore} implementation inline. */
function defineGenerationRunStore(store) {
return store;
}
/** Type an {@link ArtifactStore} implementation inline. */
function defineArtifactStore(store) {
return store;
}
/** Type a {@link BlobStore} implementation inline. */
function defineBlobStore(store) {
return store;
}
var storeKeys = [
"messages",
"runs",
"generationRuns",
"interrupts",
"metadata",
"artifacts",
"blobs"
];
var storeKeySet = new Set(storeKeys);
function assertKnownStoreKeys(stores, location) {
for (const key of Object.keys(stores)) if (!storeKeySet.has(key)) throw new Error(`Unknown AIPersistence ${location} key: ${key}`);
}
function validatePersistenceStoreKeys(persistence) {
assertKnownStoreKeys(persistence.stores, "store");
}
/**
* Chat middleware entrypoint rules:
* - `messages` is required (chat persistence means a durable transcript)
* - `interrupts` requires `runs` (interrupt records are run-scoped)
*/
function validateChatPersistenceStores(persistence) {
validatePersistenceStoreKeys(persistence);
if (!persistence.stores.messages) throw new Error("Chat persistence requires stores.messages.");
if (persistence.stores.interrupts && !persistence.stores.runs) throw new Error("Chat persistence stores.interrupts requires stores.runs.");
}
/**
* Generation middleware entrypoint rule: `generationRuns` is required (the
* generation run lifecycle is keyed on its own `runId`, not a chat conversation
* `threadId`). When artifact persistence is used, `artifacts` and `blobs` must
* be provided together.
*/
function validateGenerationPersistenceStores(persistence) {
validatePersistenceStoreKeys(persistence);
if (persistence.stores.artifacts !== void 0 !== (persistence.stores.blobs !== void 0)) throw new Error("Generation artifact persistence requires both stores.artifacts and stores.blobs.");
if (!persistence.stores.generationRuns) throw new Error("Generation persistence requires stores.generationRuns.");
}
/**
* Server hydrate entrypoint rule: `messages` is required.
*/
function validateReconstructChatStores(persistence) {
validatePersistenceStoreKeys(persistence);
if (!persistence.stores.messages) throw new Error("reconstructChat requires stores.messages.");
}
/**
* Server hydrate entrypoint rule for generation: `generationRuns` is required.
* The run store resolves the latest generation for a thread (or a specific run
* id), so a server-authoritative client can hydrate the last generation's
* status, result, and artifact refs on load.
*/
function validateReconstructGenerationStores(persistence) {
validatePersistenceStoreKeys(persistence);
if (!persistence.stores.generationRuns) throw new Error("reconstructGeneration requires stores.generationRuns.");
}
function defineAIPersistence(persistence) {
validatePersistenceStoreKeys(persistence);
return persistence;
}
function composePersistence(base, config) {
validatePersistenceStoreKeys(base);
assertKnownStoreKeys(config.overrides, "override");
const stores = { ...base.stores };
for (const key of storeKeys) {
if (!Object.prototype.hasOwnProperty.call(config.overrides, key)) continue;
const override = config.overrides[key];
if (override === false) delete stores[key];
else if (override !== void 0) setStore(stores, key, override);
}
return { stores };
}
function setStore(stores, key, value) {
stores[key] = value;
}
//#endregion
export { composePersistence, defineAIPersistence, defineArtifactStore, defineBlobStore, defineGenerationRunStore, defineInterruptStore, defineMessageStore, defineMetadataStore, defineRunStore, isTerminalRunStatus, validateChatPersistenceStores, validateGenerationPersistenceStores, validatePersistenceStoreKeys, validateReconstructChatStores, validateReconstructGenerationStores };
//# sourceMappingURL=types.js.map