@hmbown/kytchen-storage 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,35 @@
1
+ import type { CompactionSnapshot, RunEvent } from "@hmbown/kytchen-protocol";
2
+ import type { SessionStore, ThreadRecord, TurnRecord } from "./types.js";
3
+ /**
4
+ * File-based session store using JSON files for durability.
5
+ * Structure:
6
+ * <root>/
7
+ * threads/<threadId>.json — ThreadRecord
8
+ * turns/<threadId>/<runId>.json — TurnRecord
9
+ * events/<runId>.jsonl — Append-only event log (one JSON per line)
10
+ * compactions/<threadId>.json — CompactionSnapshot[]
11
+ */
12
+ export declare class FileSessionStore implements SessionStore {
13
+ private readonly rootDir;
14
+ constructor(rootDir: string);
15
+ private threadsDir;
16
+ private turnsDir;
17
+ private eventsDir;
18
+ private compactionsDir;
19
+ private ensureDir;
20
+ createThread(thread: ThreadRecord): Promise<void>;
21
+ getThread(threadId: string): Promise<ThreadRecord | null>;
22
+ updateThread(threadId: string, patch: Partial<ThreadRecord>): Promise<void>;
23
+ listThreads(): Promise<ThreadRecord[]>;
24
+ deleteThread(threadId: string): Promise<void>;
25
+ upsertTurn(turn: TurnRecord): Promise<void>;
26
+ getTurn(runId: string): Promise<TurnRecord | null>;
27
+ getTurnsForThread(threadId: string): Promise<TurnRecord[]>;
28
+ deleteTurn(threadId: string, runId: string): Promise<void>;
29
+ appendEvent(runId: string, event: RunEvent): Promise<void>;
30
+ getEvents(runId: string): Promise<RunEvent[]>;
31
+ saveCompaction(snapshot: CompactionSnapshot): Promise<void>;
32
+ getLatestCompaction(threadId: string): Promise<CompactionSnapshot | null>;
33
+ getCompactionHistory(threadId: string): Promise<CompactionSnapshot[]>;
34
+ }
35
+ //# sourceMappingURL=file-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../src/file-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzE;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAE5C,OAAO,CAAC,UAAU;IAGlB,OAAO,CAAC,QAAQ;IAGhB,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,cAAc;YAIR,SAAS;IAMjB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IASzD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3E,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAetC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB7C,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAkBlD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAe1D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1D,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAc7C,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKzE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAQ5E"}
@@ -0,0 +1,171 @@
1
+ import { readFile, writeFile, mkdir, readdir, rm } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ /**
4
+ * File-based session store using JSON files for durability.
5
+ * Structure:
6
+ * <root>/
7
+ * threads/<threadId>.json — ThreadRecord
8
+ * turns/<threadId>/<runId>.json — TurnRecord
9
+ * events/<runId>.jsonl — Append-only event log (one JSON per line)
10
+ * compactions/<threadId>.json — CompactionSnapshot[]
11
+ */
12
+ export class FileSessionStore {
13
+ rootDir;
14
+ constructor(rootDir) {
15
+ this.rootDir = rootDir;
16
+ }
17
+ threadsDir() {
18
+ return join(this.rootDir, "threads");
19
+ }
20
+ turnsDir(threadId) {
21
+ return join(this.rootDir, "turns", threadId);
22
+ }
23
+ eventsDir() {
24
+ return join(this.rootDir, "events");
25
+ }
26
+ compactionsDir() {
27
+ return join(this.rootDir, "compactions");
28
+ }
29
+ async ensureDir(dir) {
30
+ await mkdir(dir, { recursive: true });
31
+ }
32
+ // --- Threads ---
33
+ async createThread(thread) {
34
+ await this.ensureDir(this.threadsDir());
35
+ const path = join(this.threadsDir(), `${thread.id}.json`);
36
+ await writeFile(path, JSON.stringify(thread, null, 2));
37
+ }
38
+ async getThread(threadId) {
39
+ try {
40
+ const raw = await readFile(join(this.threadsDir(), `${threadId}.json`), "utf-8");
41
+ return JSON.parse(raw);
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ async updateThread(threadId, patch) {
48
+ const existing = await this.getThread(threadId);
49
+ if (!existing)
50
+ throw new Error(`Thread not found: ${threadId}`);
51
+ const updated = { ...existing, ...patch, updatedAt: new Date().toISOString() };
52
+ await writeFile(join(this.threadsDir(), `${threadId}.json`), JSON.stringify(updated, null, 2));
53
+ }
54
+ async listThreads() {
55
+ try {
56
+ const files = await readdir(this.threadsDir());
57
+ const threads = [];
58
+ for (const file of files) {
59
+ if (!file.endsWith(".json"))
60
+ continue;
61
+ const raw = await readFile(join(this.threadsDir(), file), "utf-8");
62
+ threads.push(JSON.parse(raw));
63
+ }
64
+ return threads.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
65
+ }
66
+ catch {
67
+ return [];
68
+ }
69
+ }
70
+ async deleteThread(threadId) {
71
+ try {
72
+ const turns = await this.getTurnsForThread(threadId);
73
+ await rm(join(this.threadsDir(), `${threadId}.json`), { force: true });
74
+ // Clean up events for this thread's turns
75
+ for (const turn of turns) {
76
+ await rm(join(this.eventsDir(), `${turn.runId}.jsonl`), { force: true });
77
+ }
78
+ await rm(this.turnsDir(threadId), { recursive: true, force: true });
79
+ await rm(join(this.compactionsDir(), `${threadId}.json`), { force: true });
80
+ }
81
+ catch {
82
+ // Ignore cleanup errors
83
+ }
84
+ }
85
+ // --- Turns ---
86
+ async upsertTurn(turn) {
87
+ await this.ensureDir(this.turnsDir(turn.threadId));
88
+ const path = join(this.turnsDir(turn.threadId), `${turn.runId}.json`);
89
+ await writeFile(path, JSON.stringify(turn, null, 2));
90
+ }
91
+ async getTurn(runId) {
92
+ // Need to scan turn directories since we index by runId
93
+ try {
94
+ const threadDirs = await readdir(join(this.rootDir, "turns"));
95
+ for (const threadId of threadDirs) {
96
+ try {
97
+ const raw = await readFile(join(this.turnsDir(threadId), `${runId}.json`), "utf-8");
98
+ return JSON.parse(raw);
99
+ }
100
+ catch {
101
+ continue;
102
+ }
103
+ }
104
+ }
105
+ catch {
106
+ // turns directory doesn't exist yet
107
+ }
108
+ return null;
109
+ }
110
+ async getTurnsForThread(threadId) {
111
+ try {
112
+ const files = await readdir(this.turnsDir(threadId));
113
+ const turns = [];
114
+ for (const file of files) {
115
+ if (!file.endsWith(".json"))
116
+ continue;
117
+ const raw = await readFile(join(this.turnsDir(threadId), file), "utf-8");
118
+ turns.push(JSON.parse(raw));
119
+ }
120
+ return turns.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
121
+ }
122
+ catch {
123
+ return [];
124
+ }
125
+ }
126
+ async deleteTurn(threadId, runId) {
127
+ await rm(join(this.turnsDir(threadId), `${runId}.json`), { force: true });
128
+ await rm(join(this.eventsDir(), `${runId}.jsonl`), { force: true });
129
+ }
130
+ // --- Events (append-only JSONL) ---
131
+ async appendEvent(runId, event) {
132
+ await this.ensureDir(this.eventsDir());
133
+ const path = join(this.eventsDir(), `${runId}.jsonl`);
134
+ const line = JSON.stringify(event) + "\n";
135
+ await writeFile(path, line, { flag: "a" });
136
+ }
137
+ async getEvents(runId) {
138
+ try {
139
+ const raw = await readFile(join(this.eventsDir(), `${runId}.jsonl`), "utf-8");
140
+ return raw
141
+ .split("\n")
142
+ .filter((line) => line.trim().length > 0)
143
+ .map((line) => JSON.parse(line));
144
+ }
145
+ catch {
146
+ return [];
147
+ }
148
+ }
149
+ // --- Compaction ---
150
+ async saveCompaction(snapshot) {
151
+ await this.ensureDir(this.compactionsDir());
152
+ const path = join(this.compactionsDir(), `${snapshot.threadId}.json`);
153
+ const history = await this.getCompactionHistory(snapshot.threadId);
154
+ history.push(snapshot);
155
+ await writeFile(path, JSON.stringify(history, null, 2));
156
+ }
157
+ async getLatestCompaction(threadId) {
158
+ const history = await this.getCompactionHistory(threadId);
159
+ return history.length > 0 ? history[history.length - 1] : null;
160
+ }
161
+ async getCompactionHistory(threadId) {
162
+ try {
163
+ const raw = await readFile(join(this.compactionsDir(), `${threadId}.json`), "utf-8");
164
+ return JSON.parse(raw);
165
+ }
166
+ catch {
167
+ return [];
168
+ }
169
+ }
170
+ }
171
+ //# sourceMappingURL=file-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../src/file-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./types.js";
2
+ export * from "./memory-store.js";
3
+ export * from "./file-store.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./types.js";
2
+ export * from "./memory-store.js";
3
+ export * from "./file-store.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { CompactionSnapshot, RunEvent } from "@hmbown/kytchen-protocol";
2
+ import type { SessionStore, ThreadRecord, TurnRecord } from "./types.js";
3
+ /** In-memory session store for development and testing. */
4
+ export declare class InMemorySessionStore implements SessionStore {
5
+ private threads;
6
+ private turnsByRunId;
7
+ private turnsByThread;
8
+ private eventsByRunId;
9
+ private compactionsByThread;
10
+ createThread(thread: ThreadRecord): Promise<void>;
11
+ getThread(threadId: string): Promise<ThreadRecord | null>;
12
+ updateThread(threadId: string, patch: Partial<ThreadRecord>): Promise<void>;
13
+ listThreads(): Promise<ThreadRecord[]>;
14
+ deleteThread(threadId: string): Promise<void>;
15
+ upsertTurn(turn: TurnRecord): Promise<void>;
16
+ getTurn(runId: string): Promise<TurnRecord | null>;
17
+ getTurnsForThread(threadId: string): Promise<TurnRecord[]>;
18
+ deleteTurn(threadId: string, runId: string): Promise<void>;
19
+ appendEvent(runId: string, event: RunEvent): Promise<void>;
20
+ getEvents(runId: string): Promise<RunEvent[]>;
21
+ saveCompaction(snapshot: CompactionSnapshot): Promise<void>;
22
+ getLatestCompaction(threadId: string): Promise<CompactionSnapshot | null>;
23
+ getCompactionHistory(threadId: string): Promise<CompactionSnapshot[]>;
24
+ }
25
+ //# sourceMappingURL=memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzE,2DAA2D;AAC3D,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,mBAAmB,CAA2C;IAEhE,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKzD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAMtC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7C,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3C,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAKlD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAI1D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1D,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI7C,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKzE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAG5E"}
@@ -0,0 +1,87 @@
1
+ /** In-memory session store for development and testing. */
2
+ export class InMemorySessionStore {
3
+ threads = new Map();
4
+ turnsByRunId = new Map();
5
+ turnsByThread = new Map();
6
+ eventsByRunId = new Map();
7
+ compactionsByThread = new Map();
8
+ async createThread(thread) {
9
+ this.threads.set(thread.id, structuredClone(thread));
10
+ if (!this.turnsByThread.has(thread.id)) {
11
+ this.turnsByThread.set(thread.id, []);
12
+ }
13
+ }
14
+ async getThread(threadId) {
15
+ const t = this.threads.get(threadId);
16
+ return t ? structuredClone(t) : null;
17
+ }
18
+ async updateThread(threadId, patch) {
19
+ const existing = this.threads.get(threadId);
20
+ if (!existing)
21
+ throw new Error(`Thread not found: ${threadId}`);
22
+ Object.assign(existing, patch, { updatedAt: new Date().toISOString() });
23
+ }
24
+ async listThreads() {
25
+ return [...this.threads.values()]
26
+ .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))
27
+ .map((t) => structuredClone(t));
28
+ }
29
+ async deleteThread(threadId) {
30
+ this.threads.delete(threadId);
31
+ const turns = this.turnsByThread.get(threadId) ?? [];
32
+ for (const turn of turns) {
33
+ this.turnsByRunId.delete(turn.runId);
34
+ this.eventsByRunId.delete(turn.runId);
35
+ }
36
+ this.turnsByThread.delete(threadId);
37
+ this.compactionsByThread.delete(threadId);
38
+ }
39
+ async upsertTurn(turn) {
40
+ const cloned = structuredClone(turn);
41
+ this.turnsByRunId.set(turn.runId, cloned);
42
+ const threadTurns = this.turnsByThread.get(turn.threadId) ?? [];
43
+ const idx = threadTurns.findIndex((t) => t.runId === turn.runId);
44
+ if (idx >= 0) {
45
+ threadTurns[idx] = cloned;
46
+ }
47
+ else {
48
+ threadTurns.push(cloned);
49
+ }
50
+ this.turnsByThread.set(turn.threadId, threadTurns);
51
+ }
52
+ async getTurn(runId) {
53
+ const t = this.turnsByRunId.get(runId);
54
+ return t ? structuredClone(t) : null;
55
+ }
56
+ async getTurnsForThread(threadId) {
57
+ return (this.turnsByThread.get(threadId) ?? []).map((t) => structuredClone(t));
58
+ }
59
+ async deleteTurn(threadId, runId) {
60
+ const turns = this.turnsByThread.get(threadId) ?? [];
61
+ const filtered = turns.filter((turn) => turn.runId !== runId);
62
+ this.turnsByThread.set(threadId, filtered);
63
+ this.turnsByRunId.delete(runId);
64
+ this.eventsByRunId.delete(runId);
65
+ }
66
+ async appendEvent(runId, event) {
67
+ const current = this.eventsByRunId.get(runId) ?? [];
68
+ current.push(structuredClone(event));
69
+ this.eventsByRunId.set(runId, current);
70
+ }
71
+ async getEvents(runId) {
72
+ return (this.eventsByRunId.get(runId) ?? []).map((e) => structuredClone(e));
73
+ }
74
+ async saveCompaction(snapshot) {
75
+ const history = this.compactionsByThread.get(snapshot.threadId) ?? [];
76
+ history.push(structuredClone(snapshot));
77
+ this.compactionsByThread.set(snapshot.threadId, history);
78
+ }
79
+ async getLatestCompaction(threadId) {
80
+ const history = this.compactionsByThread.get(threadId) ?? [];
81
+ return history.length > 0 ? structuredClone(history[history.length - 1]) : null;
82
+ }
83
+ async getCompactionHistory(threadId) {
84
+ return (this.compactionsByThread.get(threadId) ?? []).map((s) => structuredClone(s));
85
+ }
86
+ }
87
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { CompactionSnapshot, RunEvent } from "@hmbown/kytchen-protocol";
2
+ export interface ThreadRecord {
3
+ id: string;
4
+ createdAt: string;
5
+ updatedAt: string;
6
+ model: string;
7
+ provider: "openai" | "openai-compatible";
8
+ /** IDs of messages pinned through compaction. */
9
+ pinnedEventIds?: string[];
10
+ /** Optional parent thread ID when created from branch/fork workflow. */
11
+ branchedFromThreadId?: string;
12
+ /** Optional source run ID for branch origin traceability. */
13
+ branchedFromRunId?: string;
14
+ /** Optional retention period in days. Undefined means keep all history. */
15
+ retentionPolicyDays?: number;
16
+ /** Last time retention cleanup was executed. */
17
+ lastCleanupAt?: string;
18
+ }
19
+ export interface TurnRecord {
20
+ id: string;
21
+ threadId: string;
22
+ runId: string;
23
+ mode: string;
24
+ input: string;
25
+ outputText: string;
26
+ createdAt: string;
27
+ completedAt?: string;
28
+ /** If true, this turn is a compaction summary. */
29
+ isSummary?: boolean;
30
+ /** Source run ID when this turn was copied from another thread. */
31
+ sourceRunId?: string;
32
+ }
33
+ export interface SessionStore {
34
+ createThread(thread: ThreadRecord): Promise<void>;
35
+ getThread(threadId: string): Promise<ThreadRecord | null>;
36
+ updateThread(threadId: string, patch: Partial<ThreadRecord>): Promise<void>;
37
+ listThreads(): Promise<ThreadRecord[]>;
38
+ deleteThread(threadId: string): Promise<void>;
39
+ upsertTurn(turn: TurnRecord): Promise<void>;
40
+ getTurn(runId: string): Promise<TurnRecord | null>;
41
+ getTurnsForThread(threadId: string): Promise<TurnRecord[]>;
42
+ deleteTurn(threadId: string, runId: string): Promise<void>;
43
+ appendEvent(runId: string, event: RunEvent): Promise<void>;
44
+ getEvents(runId: string): Promise<RunEvent[]>;
45
+ saveCompaction(snapshot: CompactionSnapshot): Promise<void>;
46
+ getLatestCompaction(threadId: string): Promise<CompactionSnapshot | null>;
47
+ getCompactionHistory(threadId: string): Promise<CompactionSnapshot[]>;
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE7E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,GAAG,mBAAmB,CAAC;IACzC,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2EAA2E;IAC3E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAE3B,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACvC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG9C,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG3D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAG9C,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAC1E,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CACvE"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@hmbown/kytchen-storage",
3
+ "version": "0.1.0",
4
+ "description": "Session persistence for Kytchen: file-based and in-memory stores with compaction support.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "LICENSE",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "typecheck": "tsc -p tsconfig.json --noEmit"
22
+ },
23
+ "dependencies": {
24
+ "@hmbown/kytchen-protocol": "workspace:*"
25
+ },
26
+ "keywords": ["kytchen", "storage", "session", "persistence", "agent"],
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/Hmbown/Kytchen.git",
31
+ "directory": "packages/storage"
32
+ },
33
+ "engines": {
34
+ "node": ">=20.0.0"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ }
39
+ }