havensdk-store 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.
Files changed (57) hide show
  1. package/dist/cjs/index.d.ts +10 -0
  2. package/dist/cjs/index.d.ts.map +1 -0
  3. package/dist/cjs/index.js +18 -0
  4. package/dist/cjs/index.js.map +1 -0
  5. package/dist/cjs/memory.d.ts +53 -0
  6. package/dist/cjs/memory.d.ts.map +1 -0
  7. package/dist/cjs/memory.js +87 -0
  8. package/dist/cjs/memory.js.map +1 -0
  9. package/dist/cjs/schema.d.ts +5 -0
  10. package/dist/cjs/schema.d.ts.map +1 -0
  11. package/dist/cjs/schema.js +82 -0
  12. package/dist/cjs/schema.js.map +1 -0
  13. package/dist/cjs/session.d.ts +27 -0
  14. package/dist/cjs/session.d.ts.map +1 -0
  15. package/dist/cjs/session.js +105 -0
  16. package/dist/cjs/session.js.map +1 -0
  17. package/dist/cjs/sqlite-store.d.ts +15 -0
  18. package/dist/cjs/sqlite-store.d.ts.map +1 -0
  19. package/dist/cjs/sqlite-store.js +91 -0
  20. package/dist/cjs/sqlite-store.js.map +1 -0
  21. package/dist/cjs/types.d.ts +31 -0
  22. package/dist/cjs/types.d.ts.map +1 -0
  23. package/dist/cjs/types.js +3 -0
  24. package/dist/cjs/types.js.map +1 -0
  25. package/dist/cjs/vector.d.ts +36 -0
  26. package/dist/cjs/vector.d.ts.map +1 -0
  27. package/dist/cjs/vector.js +80 -0
  28. package/dist/cjs/vector.js.map +1 -0
  29. package/dist/index.d.ts +10 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +9 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/memory.d.ts +53 -0
  34. package/dist/memory.d.ts.map +1 -0
  35. package/dist/memory.js +83 -0
  36. package/dist/memory.js.map +1 -0
  37. package/dist/schema.d.ts +5 -0
  38. package/dist/schema.d.ts.map +1 -0
  39. package/dist/schema.js +79 -0
  40. package/dist/schema.js.map +1 -0
  41. package/dist/session.d.ts +27 -0
  42. package/dist/session.d.ts.map +1 -0
  43. package/dist/session.js +68 -0
  44. package/dist/session.js.map +1 -0
  45. package/dist/sqlite-store.d.ts +15 -0
  46. package/dist/sqlite-store.d.ts.map +1 -0
  47. package/dist/sqlite-store.js +87 -0
  48. package/dist/sqlite-store.js.map +1 -0
  49. package/dist/types.d.ts +31 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/dist/vector.d.ts +36 -0
  54. package/dist/vector.d.ts.map +1 -0
  55. package/dist/vector.js +76 -0
  56. package/dist/vector.js.map +1 -0
  57. package/package.json +57 -0
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HashVectorStore = void 0;
4
+ const crypto_1 = require("crypto");
5
+ /**
6
+ * Simple hash-based vector store for local-first operation.
7
+ * Uses SimHash-like approach for similarity scoring.
8
+ * No external API dependency - works entirely locally.
9
+ */
10
+ class HashVectorStore {
11
+ embeddings = new Map();
12
+ idCounter = 0;
13
+ /**
14
+ * Generate a simple hash-based embedding vector (128 dimensions)
15
+ */
16
+ generateEmbedding(text) {
17
+ const normalized = text.toLowerCase().trim();
18
+ const tokens = normalized.split(/\s+/).filter(t => t.length > 0);
19
+ // Create 128-dimensional vector from n-gram hashes
20
+ const dimensions = 128;
21
+ const vector = new Float32Array(dimensions);
22
+ for (let n = 1; n <= 3; n++) {
23
+ for (let i = 0; i <= tokens.length - n; i++) {
24
+ const ngram = tokens.slice(i, i + n).join(" ");
25
+ const hash = (0, crypto_1.createHash)("sha256").update(ngram).digest();
26
+ for (let j = 0; j < Math.min(32, dimensions); j++) {
27
+ vector[j * 4 % dimensions] += hash[j] / 255;
28
+ }
29
+ }
30
+ }
31
+ // Normalize
32
+ const magnitude = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
33
+ if (magnitude > 0) {
34
+ for (let i = 0; i < dimensions; i++) {
35
+ vector[i] /= magnitude;
36
+ }
37
+ }
38
+ return Buffer.from(vector.buffer);
39
+ }
40
+ /**
41
+ * Compute cosine similarity between two vectors
42
+ */
43
+ cosineSimilarity(a, b) {
44
+ const va = new Float32Array(a.buffer, a.byteOffset, a.byteLength / 4);
45
+ const vb = new Float32Array(b.buffer, b.byteOffset, b.byteLength / 4);
46
+ let dot = 0;
47
+ for (let i = 0; i < va.length; i++) {
48
+ dot += va[i] * vb[i];
49
+ }
50
+ return dot; // Already normalized, so dot = cosine
51
+ }
52
+ async save(content, metadata = {}) {
53
+ const id = `vec_${++this.idCounter}_${Date.now()}`;
54
+ const hash = this.generateEmbedding(content);
55
+ this.embeddings.set(id, { hash, metadata, content });
56
+ return id;
57
+ }
58
+ async search(query, options) {
59
+ const limit = options?.limit ?? 5;
60
+ const queryHash = this.generateEmbedding(query);
61
+ const results = [];
62
+ for (const [id, data] of this.embeddings) {
63
+ const score = this.cosineSimilarity(queryHash, data.hash);
64
+ results.push({
65
+ id,
66
+ score,
67
+ metadata: data.metadata,
68
+ content: data.content,
69
+ });
70
+ }
71
+ // Sort by score descending
72
+ results.sort((a, b) => b.score - a.score);
73
+ return results.slice(0, limit);
74
+ }
75
+ async delete(id) {
76
+ this.embeddings.delete(id);
77
+ }
78
+ }
79
+ exports.HashVectorStore = HashVectorStore;
80
+ //# sourceMappingURL=vector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector.js","sourceRoot":"","sources":["../../src/vector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type { HavenStore, RunRecord, MessageRecord } from "./types";
2
+ export { SqliteStore } from "./sqlite-store";
3
+ export { MIGRATIONS } from "./schema";
4
+ export { HashVectorStore } from "./vector";
5
+ export type { VectorStore, VectorSearchResult } from "./vector";
6
+ export { InMemoryGraph, SqliteMemoryGraph } from "./memory";
7
+ export type { Memory, MemoryEdge, MemoryGraph, MemoryType, EdgeType } from "./memory";
8
+ export { JsonlSessionStore } from "./session";
9
+ export type { SessionStore, SessionMessage } from "./session";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC5D,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { SqliteStore } from "./sqlite-store";
2
+ export { MIGRATIONS } from "./schema";
3
+ // Vector search
4
+ export { HashVectorStore } from "./vector";
5
+ // Memory graph
6
+ export { InMemoryGraph, SqliteMemoryGraph } from "./memory";
7
+ // Session store
8
+ export { JsonlSessionStore } from "./session";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,gBAAgB;AAChB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG5D,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { VectorStore } from "./vector";
2
+ export type MemoryType = "fact" | "preference" | "decision" | "identity" | "event" | "observation" | "goal" | "todo";
3
+ export type EdgeType = "related_to" | "updates" | "contradicts" | "caused_by" | "part_of";
4
+ export interface Memory {
5
+ id: string;
6
+ type: MemoryType;
7
+ content: string;
8
+ metadata?: Record<string, unknown>;
9
+ createdAt: string;
10
+ expiresAt?: string;
11
+ }
12
+ export interface MemoryEdge {
13
+ id: string;
14
+ sourceId: string;
15
+ targetId: string;
16
+ type: EdgeType;
17
+ createdAt: string;
18
+ }
19
+ export interface MemoryGraph {
20
+ save(memory: Omit<Memory, "id" | "createdAt">): Promise<Memory>;
21
+ recall(query: string, options?: {
22
+ limit?: number;
23
+ types?: MemoryType[];
24
+ }): Promise<Memory[]>;
25
+ get(id: string): Promise<Memory | null>;
26
+ link(sourceId: string, targetId: string, type: EdgeType): Promise<void>;
27
+ getLinks(memoryId: string): Promise<MemoryEdge[]>;
28
+ delete(id: string): Promise<void>;
29
+ }
30
+ /**
31
+ * In-memory typed memory graph with hybrid search.
32
+ * Stores memories and their relationships as a graph structure.
33
+ */
34
+ export declare class InMemoryGraph implements MemoryGraph {
35
+ private memories;
36
+ private edges;
37
+ private vectorStore;
38
+ constructor(vectorStore?: VectorStore);
39
+ save(memory: Omit<Memory, "id" | "createdAt">): Promise<Memory>;
40
+ recall(query: string, options?: {
41
+ limit?: number;
42
+ types?: MemoryType[];
43
+ }): Promise<Memory[]>;
44
+ get(id: string): Promise<Memory | null>;
45
+ link(sourceId: string, targetId: string, type: EdgeType): Promise<void>;
46
+ getLinks(memoryId: string): Promise<MemoryEdge[]>;
47
+ delete(id: string): Promise<void>;
48
+ }
49
+ /**
50
+ * @deprecated Use `InMemoryGraph` instead. This alias will be removed in a future version.
51
+ */
52
+ export declare const SqliteMemoryGraph: typeof InMemoryGraph;
53
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,YAAY,GACZ,UAAU,GACV,UAAU,GACV,OAAO,GACP,aAAa,GACb,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,SAAS,GACT,aAAa,GACb,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;KAAE,GACjD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAOD;;;GAGG;AACH,qBAAa,aAAc,YAAW,WAAW;IAC/C,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,WAAW,CAAc;gBAErB,WAAW,CAAC,EAAE,WAAW;IAI/B,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAe/D,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;KAAE,GACjD,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBd,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIvC,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC;IAYV,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAUjD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CASxC;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,sBAAgB,CAAC"}
package/dist/memory.js ADDED
@@ -0,0 +1,83 @@
1
+ import { randomUUID } from "crypto";
2
+ import { HashVectorStore } from "./vector";
3
+ /**
4
+ * In-memory typed memory graph with hybrid search.
5
+ * Stores memories and their relationships as a graph structure.
6
+ */
7
+ export class InMemoryGraph {
8
+ memories = new Map();
9
+ edges = new Map();
10
+ vectorStore;
11
+ constructor(vectorStore) {
12
+ this.vectorStore = vectorStore ?? new HashVectorStore();
13
+ }
14
+ async save(memory) {
15
+ const id = randomUUID();
16
+ const now = new Date().toISOString();
17
+ const mem = { ...memory, id, createdAt: now };
18
+ this.memories.set(id, mem);
19
+ await this.vectorStore.save(mem.content, {
20
+ memoryId: id,
21
+ type: mem.type,
22
+ metadata: mem.metadata,
23
+ });
24
+ return mem;
25
+ }
26
+ async recall(query, options) {
27
+ const limit = options?.limit ?? 10;
28
+ const types = options?.types;
29
+ const vectorResults = await this.vectorStore.search(query, {
30
+ limit: limit * 2,
31
+ });
32
+ const results = [];
33
+ for (const vr of vectorResults) {
34
+ const memId = vr.metadata?.memoryId;
35
+ if (!memId)
36
+ continue;
37
+ const mem = this.memories.get(memId);
38
+ if (!mem)
39
+ continue;
40
+ if (types && !types.includes(mem.type))
41
+ continue;
42
+ results.push({ memory: mem, score: vr.score });
43
+ }
44
+ results.sort((a, b) => b.score - a.score);
45
+ return results.slice(0, limit).map((r) => r.memory);
46
+ }
47
+ async get(id) {
48
+ return this.memories.get(id) ?? null;
49
+ }
50
+ async link(sourceId, targetId, type) {
51
+ const id = randomUUID();
52
+ const edge = {
53
+ id,
54
+ sourceId,
55
+ targetId,
56
+ type,
57
+ createdAt: new Date().toISOString(),
58
+ };
59
+ this.edges.set(id, edge);
60
+ }
61
+ async getLinks(memoryId) {
62
+ const links = [];
63
+ for (const edge of this.edges.values()) {
64
+ if (edge.sourceId === memoryId || edge.targetId === memoryId) {
65
+ links.push(edge);
66
+ }
67
+ }
68
+ return links;
69
+ }
70
+ async delete(id) {
71
+ this.memories.delete(id);
72
+ for (const [edgeId, edge] of this.edges) {
73
+ if (edge.sourceId === id || edge.targetId === id) {
74
+ this.edges.delete(edgeId);
75
+ }
76
+ }
77
+ }
78
+ }
79
+ /**
80
+ * @deprecated Use `InMemoryGraph` instead. This alias will be removed in a future version.
81
+ */
82
+ export const SqliteMemoryGraph = InMemoryGraph;
83
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const MIGRATIONS: {
2
+ version: number;
3
+ up: string;
4
+ }[];
5
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;GA6EtB,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,79 @@
1
+ export const MIGRATIONS = [
2
+ {
3
+ version: 1,
4
+ up: `
5
+ CREATE TABLE IF NOT EXISTS runs (
6
+ id TEXT PRIMARY KEY,
7
+ input TEXT NOT NULL,
8
+ agent_name TEXT NOT NULL,
9
+ status TEXT NOT NULL DEFAULT 'running',
10
+ started_at TEXT NOT NULL DEFAULT (datetime('now')),
11
+ finished_at TEXT,
12
+ metadata TEXT
13
+ );
14
+
15
+ CREATE TABLE IF NOT EXISTS messages (
16
+ id TEXT PRIMARY KEY,
17
+ run_id TEXT NOT NULL REFERENCES runs(id),
18
+ role TEXT NOT NULL,
19
+ content TEXT NOT NULL,
20
+ name TEXT,
21
+ tool_call_id TEXT,
22
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
23
+ );
24
+
25
+ CREATE INDEX IF NOT EXISTS idx_messages_run_id ON messages(run_id);
26
+
27
+ CREATE TABLE IF NOT EXISTS state (
28
+ key TEXT PRIMARY KEY,
29
+ value TEXT NOT NULL
30
+ );
31
+
32
+ CREATE TABLE IF NOT EXISTS _migrations (
33
+ version INTEGER PRIMARY KEY,
34
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
35
+ );
36
+
37
+ INSERT OR IGNORE INTO _migrations (version) VALUES (1);
38
+ `,
39
+ },
40
+ {
41
+ version: 2,
42
+ up: `
43
+ CREATE TABLE IF NOT EXISTS memories (
44
+ id TEXT PRIMARY KEY,
45
+ type TEXT NOT NULL,
46
+ content TEXT NOT NULL,
47
+ metadata TEXT,
48
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
49
+ expires_at TEXT
50
+ );
51
+
52
+ CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
53
+ CREATE INDEX IF NOT EXISTS idx_memories_created ON memories(created_at);
54
+
55
+ CREATE TABLE IF NOT EXISTS memory_edges (
56
+ id TEXT PRIMARY KEY,
57
+ source_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
58
+ target_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
59
+ type TEXT NOT NULL,
60
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
61
+ );
62
+
63
+ CREATE INDEX IF NOT EXISTS idx_edges_source ON memory_edges(source_id);
64
+ CREATE INDEX IF NOT EXISTS idx_edges_target ON memory_edges(target_id);
65
+
66
+ CREATE TABLE IF NOT EXISTS embeddings (
67
+ id TEXT PRIMARY KEY,
68
+ content TEXT NOT NULL,
69
+ metadata TEXT,
70
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
71
+ );
72
+
73
+ CREATE VIRTUAL TABLE IF NOT EXISTS embedding_search USING fts5(content);
74
+
75
+ INSERT OR IGNORE INTO _migrations (version) VALUES (2);
76
+ `,
77
+ },
78
+ ];
79
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;QACE,OAAO,EAAE,CAAC;QACV,EAAE,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkCH;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkCH;KACF;CACF,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface SessionMessage {
2
+ id: string;
3
+ role: "user" | "assistant" | "system" | "tool";
4
+ content: string;
5
+ timestamp: string;
6
+ metadata?: Record<string, unknown>;
7
+ }
8
+ export interface SessionStore {
9
+ append(sessionId: string, message: Omit<SessionMessage, "id" | "timestamp">): Promise<void>;
10
+ read(sessionId: string): Promise<SessionMessage[]>;
11
+ list(): Promise<string[]>;
12
+ delete(sessionId: string): Promise<void>;
13
+ }
14
+ /**
15
+ * Append-only JSONL session store for crash-safe persistence.
16
+ * Each message is written as a single line, making recovery simple.
17
+ */
18
+ export declare class JsonlSessionStore implements SessionStore {
19
+ private basePath;
20
+ constructor(basePath?: string);
21
+ private getSessionPath;
22
+ append(sessionId: string, message: Omit<SessionMessage, "id" | "timestamp">): Promise<void>;
23
+ read(sessionId: string): Promise<SessionMessage[]>;
24
+ list(): Promise<string[]>;
25
+ delete(sessionId: string): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACnD,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,SAAoB;IAOxC,OAAO,CAAC,cAAc;IAIhB,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,WAAW,CAAC,GAChD,OAAO,CAAC,IAAI,CAAC;IAYV,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAwBlD,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAazB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ/C"}
@@ -0,0 +1,68 @@
1
+ import { appendFileSync, existsSync, mkdirSync } from "fs";
2
+ import { join } from "path";
3
+ import { randomUUID } from "crypto";
4
+ /**
5
+ * Append-only JSONL session store for crash-safe persistence.
6
+ * Each message is written as a single line, making recovery simple.
7
+ */
8
+ export class JsonlSessionStore {
9
+ basePath;
10
+ constructor(basePath = ".haven/sessions") {
11
+ this.basePath = basePath;
12
+ if (!existsSync(basePath)) {
13
+ mkdirSync(basePath, { recursive: true });
14
+ }
15
+ }
16
+ getSessionPath(sessionId) {
17
+ return join(this.basePath, `${sessionId}.jsonl`);
18
+ }
19
+ async append(sessionId, message) {
20
+ const path = this.getSessionPath(sessionId);
21
+ const msg = {
22
+ ...message,
23
+ id: randomUUID(),
24
+ timestamp: new Date().toISOString(),
25
+ };
26
+ const line = JSON.stringify(msg) + "\n";
27
+ appendFileSync(path, line, "utf8");
28
+ }
29
+ async read(sessionId) {
30
+ const path = this.getSessionPath(sessionId);
31
+ if (!existsSync(path)) {
32
+ return [];
33
+ }
34
+ const { readFileSync } = await import("fs");
35
+ const content = readFileSync(path, "utf8");
36
+ const lines = content.trim().split("\n");
37
+ const messages = [];
38
+ for (const line of lines) {
39
+ if (!line.trim())
40
+ continue;
41
+ try {
42
+ messages.push(JSON.parse(line));
43
+ }
44
+ catch {
45
+ // Skip malformed lines
46
+ }
47
+ }
48
+ return messages;
49
+ }
50
+ async list() {
51
+ const { readdirSync } = await import("fs");
52
+ if (!existsSync(this.basePath)) {
53
+ return [];
54
+ }
55
+ const files = readdirSync(this.basePath);
56
+ return files
57
+ .filter((f) => f.endsWith(".jsonl"))
58
+ .map((f) => f.replace(/\.jsonl$/, ""));
59
+ }
60
+ async delete(sessionId) {
61
+ const { unlinkSync } = await import("fs");
62
+ const path = this.getSessionPath(sessionId);
63
+ if (existsSync(path)) {
64
+ unlinkSync(path);
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { HavenStore, RunRecord, MessageRecord } from "./types";
2
+ export declare class SqliteStore implements HavenStore {
3
+ private db;
4
+ constructor(path?: string);
5
+ init(): Promise<void>;
6
+ close(): Promise<void>;
7
+ createRun(input: string, agentName: string): Promise<RunRecord>;
8
+ finishRun(runId: string, status: RunRecord["status"]): Promise<void>;
9
+ getRun(runId: string): Promise<RunRecord | null>;
10
+ appendMessage(runId: string, msg: Omit<MessageRecord, "id" | "runId" | "createdAt">): Promise<void>;
11
+ getMessages(runId: string): Promise<MessageRecord[]>;
12
+ setState(key: string, value: unknown): Promise<void>;
13
+ getState<T = unknown>(key: string): Promise<T | null>;
14
+ }
15
+ //# sourceMappingURL=sqlite-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../src/sqlite-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AA0BpE,qBAAa,WAAY,YAAW,UAAU;IAC5C,OAAO,CAAC,EAAE,CAAW;gBAET,IAAI,SAAmB;IAS7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAW/D,SAAS,CACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC;IAOV,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAgBhD,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,OAAO,GAAG,WAAW,CAAC,GACrD,OAAO,CAAC,IAAI,CAAC;IAkBV,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAiBpD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;CAM5D"}
@@ -0,0 +1,87 @@
1
+ import { Database } from "bun:sqlite";
2
+ import { MIGRATIONS } from "./schema";
3
+ import { randomUUID } from "crypto";
4
+ import { mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ export class SqliteStore {
7
+ db;
8
+ constructor(path = ".haven/data.db") {
9
+ if (path !== ":memory:") {
10
+ mkdirSync(dirname(path), { recursive: true });
11
+ }
12
+ this.db = new Database(path, { create: true });
13
+ this.db.exec("PRAGMA journal_mode = WAL");
14
+ this.db.exec("PRAGMA foreign_keys = ON");
15
+ }
16
+ async init() {
17
+ for (const migration of MIGRATIONS) {
18
+ this.db.exec(migration.up);
19
+ }
20
+ }
21
+ async close() {
22
+ this.db.close();
23
+ }
24
+ async createRun(input, agentName) {
25
+ const id = randomUUID();
26
+ const now = new Date().toISOString();
27
+ this.db
28
+ .prepare("INSERT INTO runs (id, input, agent_name, status, started_at) VALUES (?, ?, ?, ?, ?)")
29
+ .run(id, input, agentName, "running", now);
30
+ return { id, input, agentName, status: "running", startedAt: now };
31
+ }
32
+ async finishRun(runId, status) {
33
+ const now = new Date().toISOString();
34
+ this.db
35
+ .prepare("UPDATE runs SET status = ?, finished_at = ? WHERE id = ?")
36
+ .run(status, now, runId);
37
+ }
38
+ async getRun(runId) {
39
+ const row = this.db
40
+ .prepare("SELECT * FROM runs WHERE id = ?")
41
+ .get(runId);
42
+ if (!row)
43
+ return null;
44
+ return {
45
+ id: row.id,
46
+ input: row.input,
47
+ agentName: row.agent_name,
48
+ status: row.status,
49
+ startedAt: row.started_at,
50
+ finishedAt: row.finished_at ?? undefined,
51
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
52
+ };
53
+ }
54
+ async appendMessage(runId, msg) {
55
+ const id = randomUUID();
56
+ const now = new Date().toISOString();
57
+ this.db
58
+ .prepare("INSERT INTO messages (id, run_id, role, content, name, tool_call_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)")
59
+ .run(id, runId, msg.role, msg.content, msg.name ?? null, msg.toolCallId ?? null, now);
60
+ }
61
+ async getMessages(runId) {
62
+ const rows = this.db
63
+ .prepare("SELECT * FROM messages WHERE run_id = ? ORDER BY created_at ASC")
64
+ .all(runId);
65
+ return rows.map((row) => ({
66
+ id: row.id,
67
+ runId: row.run_id,
68
+ role: row.role,
69
+ content: row.content,
70
+ name: row.name ?? undefined,
71
+ toolCallId: row.tool_call_id ?? undefined,
72
+ createdAt: row.created_at,
73
+ }));
74
+ }
75
+ async setState(key, value) {
76
+ this.db
77
+ .prepare("INSERT OR REPLACE INTO state (key, value) VALUES (?, ?)")
78
+ .run(key, JSON.stringify(value));
79
+ }
80
+ async getState(key) {
81
+ const row = this.db
82
+ .prepare("SELECT value FROM state WHERE key = ?")
83
+ .get(key);
84
+ return row ? JSON.parse(row.value) : null;
85
+ }
86
+ }
87
+ //# sourceMappingURL=sqlite-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../src/sqlite-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Role } from "havensdk";
2
+ export interface RunRecord {
3
+ id: string;
4
+ input: string;
5
+ agentName: string;
6
+ status: "running" | "completed" | "failed";
7
+ startedAt: string;
8
+ finishedAt?: string;
9
+ metadata?: Record<string, unknown>;
10
+ }
11
+ export interface MessageRecord {
12
+ id: string;
13
+ runId: string;
14
+ role: Role;
15
+ content: string;
16
+ name?: string;
17
+ toolCallId?: string;
18
+ createdAt: string;
19
+ }
20
+ export interface HavenStore {
21
+ init(): Promise<void>;
22
+ close(): Promise<void>;
23
+ createRun(input: string, agentName: string): Promise<RunRecord>;
24
+ finishRun(runId: string, status: RunRecord["status"]): Promise<void>;
25
+ getRun(runId: string): Promise<RunRecord | null>;
26
+ appendMessage(runId: string, message: Omit<MessageRecord, "id" | "runId" | "createdAt">): Promise<void>;
27
+ getMessages(runId: string): Promise<MessageRecord[]>;
28
+ setState(key: string, value: unknown): Promise<void>;
29
+ getState<T = unknown>(key: string): Promise<T | null>;
30
+ }
31
+ //# 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,IAAI,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChE,SAAS,CACP,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAEjD,aAAa,CACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,OAAO,GAAG,WAAW,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAErD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CACvD"}
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":""}