@handy_wote/pi-storage-sqlite-node 0.81.1
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.
- package/CHANGELOG.md +15 -0
- package/README.md +5 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/sqlite/index.d.ts +5 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +5 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/migrations/001_initial.sql +59 -0
- package/dist/sqlite/migrations.d.ts +9 -0
- package/dist/sqlite/migrations.d.ts.map +1 -0
- package/dist/sqlite/migrations.js +40 -0
- package/dist/sqlite/migrations.js.map +1 -0
- package/dist/sqlite/repo.d.ts +26 -0
- package/dist/sqlite/repo.d.ts.map +1 -0
- package/dist/sqlite/repo.js +158 -0
- package/dist/sqlite/repo.js.map +1 -0
- package/dist/sqlite/storage/branch-entries.d.ts +8 -0
- package/dist/sqlite/storage/branch-entries.d.ts.map +1 -0
- package/dist/sqlite/storage/branch-entries.js +43 -0
- package/dist/sqlite/storage/branch-entries.js.map +1 -0
- package/dist/sqlite/storage/index.d.ts +38 -0
- package/dist/sqlite/storage/index.d.ts.map +1 -0
- package/dist/sqlite/storage/index.js +347 -0
- package/dist/sqlite/storage/index.js.map +1 -0
- package/dist/sqlite/storage/session-entries.d.ts +17 -0
- package/dist/sqlite/storage/session-entries.d.ts.map +1 -0
- package/dist/sqlite/storage/session-entries.js +173 -0
- package/dist/sqlite/storage/session-entries.js.map +1 -0
- package/dist/sqlite/storage/session-materialized.d.ts +43 -0
- package/dist/sqlite/storage/session-materialized.d.ts.map +1 -0
- package/dist/sqlite/storage/session-materialized.js +282 -0
- package/dist/sqlite/storage/session-materialized.js.map +1 -0
- package/dist/sqlite/storage/session-sequences.d.ts +4 -0
- package/dist/sqlite/storage/session-sequences.d.ts.map +1 -0
- package/dist/sqlite/storage/session-sequences.js +14 -0
- package/dist/sqlite/storage/session-sequences.js.map +1 -0
- package/dist/sqlite/storage/sessions.d.ts +11 -0
- package/dist/sqlite/storage/sessions.d.ts.map +1 -0
- package/dist/sqlite/storage/sessions.js +27 -0
- package/dist/sqlite/storage/sessions.js.map +1 -0
- package/dist/sqlite/storage/shared.d.ts +10 -0
- package/dist/sqlite/storage/shared.d.ts.map +1 -0
- package/dist/sqlite/storage/shared.js +25 -0
- package/dist/sqlite/storage/shared.js.map +1 -0
- package/dist/sqlite/types.d.ts +46 -0
- package/dist/sqlite/types.d.ts.map +1 -0
- package/dist/sqlite/types.js +2 -0
- package/dist/sqlite/types.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-sequences.js","sourceRoot":"","sources":["../../../src/sqlite/storage/session-sequences.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAkB,EAAE,SAAiB,EAAmB;IAC7F,MAAM,WAAW,GAAG,MAAM,EAAE;SAC1B,OAAO,CAAC,6DAA6D,CAAC;SACtE,GAAG,CAAuB,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,cAAc,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,WAAW,CAAC,QAAQ,CAAC;AAAA,CAC5B;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAkB,EAAE,SAAiB,EAAE,OAAe,EAAiB;IAC5G,MAAM,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;AAAA,CAC/G","sourcesContent":["import type { SqliteDatabase } from \"../types.ts\";\nimport { invalidSession } from \"./shared.ts\";\n\nexport async function getNextSequence(db: SqliteDatabase, sessionId: string): Promise<number> {\n\tconst sequenceRow = await db\n\t\t.prepare(\"SELECT next_seq FROM session_sequences WHERE session_id = ?\")\n\t\t.get<{ next_seq: number }>(sessionId);\n\tif (!sequenceRow) {\n\t\tthrow invalidSession(`missing sequence row for session ${sessionId}`);\n\t}\n\treturn sequenceRow.next_seq;\n}\n\nexport async function advanceSequence(db: SqliteDatabase, sessionId: string, nextSeq: number): Promise<void> {\n\tawait db.prepare(\"UPDATE session_sequences SET next_seq = ? WHERE session_id = ?\").run(nextSeq + 1, sessionId);\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SqliteSessionMetadata } from "../types.ts";
|
|
2
|
+
export interface SessionRow {
|
|
3
|
+
id: string;
|
|
4
|
+
created_at: string;
|
|
5
|
+
metadata: string | null;
|
|
6
|
+
cwd: string;
|
|
7
|
+
parent_session_id: string | null;
|
|
8
|
+
active_leaf_id: string | null;
|
|
9
|
+
}
|
|
10
|
+
export declare function rowToMetadata(row: SessionRow, path: string): SqliteSessionMetadata;
|
|
11
|
+
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/sqlite/storage/sessions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAoBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,qBAAqB,CASlF","sourcesContent":["import { SessionError } from \"@handy_wote/pi-agent-core\";\nimport type { SqliteSessionMetadata } from \"../types.ts\";\n\nexport interface SessionRow {\n\tid: string;\n\tcreated_at: string;\n\tmetadata: string | null;\n\tcwd: string;\n\tparent_session_id: string | null;\n\tactive_leaf_id: string | null;\n}\n\nfunction parseMetadata(metadata: string | null, sessionId: string): Record<string, unknown> | undefined {\n\tif (metadata === null) return undefined;\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(metadata);\n\t} catch (error) {\n\t\tthrow new SessionError(\n\t\t\t\"invalid_session\",\n\t\t\t`Invalid SQLite session ${sessionId}: metadata is not valid JSON`,\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\tthrow new SessionError(\"invalid_session\", `Invalid SQLite session ${sessionId}: metadata must be an object`);\n\t}\n\treturn parsed as Record<string, unknown>;\n}\n\nexport function rowToMetadata(row: SessionRow, path: string): SqliteSessionMetadata {\n\treturn {\n\t\tid: row.id,\n\t\tcreatedAt: row.created_at,\n\t\tcwd: row.cwd,\n\t\tpath,\n\t\tparentSessionId: row.parent_session_id ?? undefined,\n\t\tmetadata: parseMetadata(row.metadata, row.id),\n\t};\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SessionError } from "@handy_wote/pi-agent-core";
|
|
2
|
+
function parseMetadata(metadata, sessionId) {
|
|
3
|
+
if (metadata === null)
|
|
4
|
+
return undefined;
|
|
5
|
+
let parsed;
|
|
6
|
+
try {
|
|
7
|
+
parsed = JSON.parse(metadata);
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
throw new SessionError("invalid_session", `Invalid SQLite session ${sessionId}: metadata is not valid JSON`, error instanceof Error ? error : undefined);
|
|
11
|
+
}
|
|
12
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
13
|
+
throw new SessionError("invalid_session", `Invalid SQLite session ${sessionId}: metadata must be an object`);
|
|
14
|
+
}
|
|
15
|
+
return parsed;
|
|
16
|
+
}
|
|
17
|
+
export function rowToMetadata(row, path) {
|
|
18
|
+
return {
|
|
19
|
+
id: row.id,
|
|
20
|
+
createdAt: row.created_at,
|
|
21
|
+
cwd: row.cwd,
|
|
22
|
+
path,
|
|
23
|
+
parentSessionId: row.parent_session_id ?? undefined,
|
|
24
|
+
metadata: parseMetadata(row.metadata, row.id),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/sqlite/storage/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAYzD,SAAS,aAAa,CAAC,QAAuB,EAAE,SAAiB,EAAuC;IACvG,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,YAAY,CACrB,iBAAiB,EACjB,0BAA0B,SAAS,8BAA8B,EACjE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC1C,CAAC;IACH,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,0BAA0B,SAAS,8BAA8B,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,MAAiC,CAAC;AAAA,CACzC;AAED,MAAM,UAAU,aAAa,CAAC,GAAe,EAAE,IAAY,EAAyB;IACnF,OAAO;QACN,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,IAAI;QACJ,eAAe,EAAE,GAAG,CAAC,iBAAiB,IAAI,SAAS;QACnD,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;KAC7C,CAAC;AAAA,CACF","sourcesContent":["import { SessionError } from \"@handy_wote/pi-agent-core\";\nimport type { SqliteSessionMetadata } from \"../types.ts\";\n\nexport interface SessionRow {\n\tid: string;\n\tcreated_at: string;\n\tmetadata: string | null;\n\tcwd: string;\n\tparent_session_id: string | null;\n\tactive_leaf_id: string | null;\n}\n\nfunction parseMetadata(metadata: string | null, sessionId: string): Record<string, unknown> | undefined {\n\tif (metadata === null) return undefined;\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(metadata);\n\t} catch (error) {\n\t\tthrow new SessionError(\n\t\t\t\"invalid_session\",\n\t\t\t`Invalid SQLite session ${sessionId}: metadata is not valid JSON`,\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\tthrow new SessionError(\"invalid_session\", `Invalid SQLite session ${sessionId}: metadata must be an object`);\n\t}\n\treturn parsed as Record<string, unknown>;\n}\n\nexport function rowToMetadata(row: SessionRow, path: string): SqliteSessionMetadata {\n\treturn {\n\t\tid: row.id,\n\t\tcreatedAt: row.created_at,\n\t\tcwd: row.cwd,\n\t\tpath,\n\t\tparentSessionId: row.parent_session_id ?? undefined,\n\t\tmetadata: parseMetadata(row.metadata, row.id),\n\t};\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SessionTreeEntry } from "@handy_wote/pi-agent-core";
|
|
2
|
+
import { SessionError } from "@handy_wote/pi-agent-core";
|
|
3
|
+
export declare function generateEntryId(byId: {
|
|
4
|
+
has(id: string): boolean;
|
|
5
|
+
}): string;
|
|
6
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
7
|
+
export declare function invalidSession(message: string, cause?: Error): SessionError;
|
|
8
|
+
export declare function invalidEntry(message: string, cause?: Error): SessionError;
|
|
9
|
+
export declare function leafIdAfterEntry(entry: SessionTreeEntry): string | null;
|
|
10
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/sqlite/storage/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,MAAM,CAQ1E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,YAAY,CAE3E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,YAAY,CAEzE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAEvE","sourcesContent":["import type { SessionTreeEntry } from \"@handy_wote/pi-agent-core\";\nimport { SessionError } from \"@handy_wote/pi-agent-core\";\nimport { uuidv7 } from \"@handy_wote/pi-ai\";\n\nexport function generateEntryId(byId: { has(id: string): boolean }): string {\n\tfor (let i = 0; i < 100; i++) {\n\t\t// The uuidv7 prefix is timestamp-derived and nearly constant between calls,\n\t\t// so short ids must come from the random tail.\n\t\tconst id = uuidv7().slice(0, 8);\n\t\tif (!byId.has(id)) return id;\n\t}\n\treturn uuidv7();\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nexport function invalidSession(message: string, cause?: Error): SessionError {\n\treturn new SessionError(\"invalid_session\", `Invalid SQLite session: ${message}`, cause);\n}\n\nexport function invalidEntry(message: string, cause?: Error): SessionError {\n\treturn new SessionError(\"invalid_entry\", `Invalid SQLite session entry: ${message}`, cause);\n}\n\nexport function leafIdAfterEntry(entry: SessionTreeEntry): string | null {\n\treturn entry.type === \"leaf\" ? entry.targetId : entry.id;\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SessionError } from "@handy_wote/pi-agent-core";
|
|
2
|
+
import { uuidv7 } from "@handy_wote/pi-ai";
|
|
3
|
+
export function generateEntryId(byId) {
|
|
4
|
+
for (let i = 0; i < 100; i++) {
|
|
5
|
+
// The uuidv7 prefix is timestamp-derived and nearly constant between calls,
|
|
6
|
+
// so short ids must come from the random tail.
|
|
7
|
+
const id = uuidv7().slice(0, 8);
|
|
8
|
+
if (!byId.has(id))
|
|
9
|
+
return id;
|
|
10
|
+
}
|
|
11
|
+
return uuidv7();
|
|
12
|
+
}
|
|
13
|
+
export function isRecord(value) {
|
|
14
|
+
return typeof value === "object" && value !== null;
|
|
15
|
+
}
|
|
16
|
+
export function invalidSession(message, cause) {
|
|
17
|
+
return new SessionError("invalid_session", `Invalid SQLite session: ${message}`, cause);
|
|
18
|
+
}
|
|
19
|
+
export function invalidEntry(message, cause) {
|
|
20
|
+
return new SessionError("invalid_entry", `Invalid SQLite session entry: ${message}`, cause);
|
|
21
|
+
}
|
|
22
|
+
export function leafIdAfterEntry(entry) {
|
|
23
|
+
return entry.type === "leaf" ? entry.targetId : entry.id;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/sqlite/storage/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,UAAU,eAAe,CAAC,IAAkC,EAAU;IAC3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,4EAA4E;QAC5E,+CAA+C;QAC/C,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,EAAE,CAAC;AAAA,CAChB;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc,EAAoC;IAC1E,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAAA,CACnD;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,KAAa,EAAgB;IAC5E,OAAO,IAAI,YAAY,CAAC,iBAAiB,EAAE,2BAA2B,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AAAA,CACxF;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,KAAa,EAAgB;IAC1E,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,iCAAiC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AAAA,CAC5F;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAuB,EAAiB;IACxE,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;AAAA,CACzD","sourcesContent":["import type { SessionTreeEntry } from \"@handy_wote/pi-agent-core\";\nimport { SessionError } from \"@handy_wote/pi-agent-core\";\nimport { uuidv7 } from \"@handy_wote/pi-ai\";\n\nexport function generateEntryId(byId: { has(id: string): boolean }): string {\n\tfor (let i = 0; i < 100; i++) {\n\t\t// The uuidv7 prefix is timestamp-derived and nearly constant between calls,\n\t\t// so short ids must come from the random tail.\n\t\tconst id = uuidv7().slice(0, 8);\n\t\tif (!byId.has(id)) return id;\n\t}\n\treturn uuidv7();\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nexport function invalidSession(message: string, cause?: Error): SessionError {\n\treturn new SessionError(\"invalid_session\", `Invalid SQLite session: ${message}`, cause);\n}\n\nexport function invalidEntry(message: string, cause?: Error): SessionError {\n\treturn new SessionError(\"invalid_entry\", `Invalid SQLite session entry: ${message}`, cause);\n}\n\nexport function leafIdAfterEntry(entry: SessionTreeEntry): string | null {\n\treturn entry.type === \"leaf\" ? entry.targetId : entry.id;\n}\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { FileSystem, SessionCreateOptions, SessionMetadata, SessionRepo } from "@handy_wote/pi-agent-core";
|
|
2
|
+
/** Result of a prepared SQLite statement execution. */
|
|
3
|
+
export interface SqliteRunResult {
|
|
4
|
+
/** Number of rows changed by the statement. */
|
|
5
|
+
changes: number;
|
|
6
|
+
/** Inserted row id when the backend exposes one. */
|
|
7
|
+
lastInsertRowid?: number;
|
|
8
|
+
}
|
|
9
|
+
/** Prepared SQLite statement capability used by the SQLite session backend. */
|
|
10
|
+
export interface SqliteStatement {
|
|
11
|
+
run(...params: unknown[]): Promise<SqliteRunResult>;
|
|
12
|
+
get<TRow extends object>(...params: unknown[]): Promise<TRow | undefined>;
|
|
13
|
+
all<TRow extends object>(...params: unknown[]): Promise<TRow[]>;
|
|
14
|
+
}
|
|
15
|
+
/** SQLite database capability used by the SQLite session backend. */
|
|
16
|
+
export interface SqliteDatabase {
|
|
17
|
+
exec(sql: string): Promise<void>;
|
|
18
|
+
prepare(sql: string): SqliteStatement;
|
|
19
|
+
transaction<T>(fn: () => Promise<T>): Promise<T>;
|
|
20
|
+
close(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export interface SqliteDatabaseFactory {
|
|
23
|
+
open(path: string): Promise<SqliteDatabase>;
|
|
24
|
+
}
|
|
25
|
+
export interface SqliteSessionMetadata extends SessionMetadata {
|
|
26
|
+
cwd: string;
|
|
27
|
+
path: string;
|
|
28
|
+
parentSessionId?: string;
|
|
29
|
+
metadata?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
export interface SqliteSessionCreateOptions extends SessionCreateOptions {
|
|
32
|
+
cwd: string;
|
|
33
|
+
parentSessionId?: string;
|
|
34
|
+
metadata?: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
export interface SqliteSessionListOptions {
|
|
37
|
+
cwd?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface SqliteSessionBackendOptions {
|
|
40
|
+
kind: "sqlite";
|
|
41
|
+
databasePath: string;
|
|
42
|
+
}
|
|
43
|
+
export interface SqliteSessionRepoApi extends SessionRepo<SqliteSessionMetadata, SqliteSessionCreateOptions, SqliteSessionListOptions> {
|
|
44
|
+
}
|
|
45
|
+
export type SqliteSessionRepoEnv = Pick<FileSystem, "absolutePath" | "createDir" | "exists">;
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sqlite/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAEhH,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC/B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC/B,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACpD,GAAG,CAAC,IAAI,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;IAC1E,GAAG,CAAC,IAAI,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CAChE;AAED,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC9B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;IACtC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;IACvE,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,2BAA2B;IAC3C,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAChB,SAAQ,WAAW,CAAC,qBAAqB,EAAE,0BAA0B,EAAE,wBAAwB,CAAC;CAAG;AAEpG,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,GAAG,WAAW,GAAG,QAAQ,CAAC,CAAC","sourcesContent":["import type { FileSystem, SessionCreateOptions, SessionMetadata, SessionRepo } from \"@handy_wote/pi-agent-core\";\n\n/** Result of a prepared SQLite statement execution. */\nexport interface SqliteRunResult {\n\t/** Number of rows changed by the statement. */\n\tchanges: number;\n\t/** Inserted row id when the backend exposes one. */\n\tlastInsertRowid?: number;\n}\n\n/** Prepared SQLite statement capability used by the SQLite session backend. */\nexport interface SqliteStatement {\n\trun(...params: unknown[]): Promise<SqliteRunResult>;\n\tget<TRow extends object>(...params: unknown[]): Promise<TRow | undefined>;\n\tall<TRow extends object>(...params: unknown[]): Promise<TRow[]>;\n}\n\n/** SQLite database capability used by the SQLite session backend. */\nexport interface SqliteDatabase {\n\texec(sql: string): Promise<void>;\n\tprepare(sql: string): SqliteStatement;\n\ttransaction<T>(fn: () => Promise<T>): Promise<T>;\n\tclose(): Promise<void>;\n}\n\nexport interface SqliteDatabaseFactory {\n\topen(path: string): Promise<SqliteDatabase>;\n}\n\nexport interface SqliteSessionMetadata extends SessionMetadata {\n\tcwd: string;\n\tpath: string;\n\tparentSessionId?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface SqliteSessionCreateOptions extends SessionCreateOptions {\n\tcwd: string;\n\tparentSessionId?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface SqliteSessionListOptions {\n\tcwd?: string;\n}\n\nexport interface SqliteSessionBackendOptions {\n\tkind: \"sqlite\";\n\tdatabasePath: string;\n}\n\nexport interface SqliteSessionRepoApi\n\textends SessionRepo<SqliteSessionMetadata, SqliteSessionCreateOptions, SqliteSessionListOptions> {}\n\nexport type SqliteSessionRepoEnv = Pick<FileSystem, \"absolutePath\" | \"createDir\" | \"exists\">;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sqlite/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { FileSystem, SessionCreateOptions, SessionMetadata, SessionRepo } from \"@handy_wote/pi-agent-core\";\n\n/** Result of a prepared SQLite statement execution. */\nexport interface SqliteRunResult {\n\t/** Number of rows changed by the statement. */\n\tchanges: number;\n\t/** Inserted row id when the backend exposes one. */\n\tlastInsertRowid?: number;\n}\n\n/** Prepared SQLite statement capability used by the SQLite session backend. */\nexport interface SqliteStatement {\n\trun(...params: unknown[]): Promise<SqliteRunResult>;\n\tget<TRow extends object>(...params: unknown[]): Promise<TRow | undefined>;\n\tall<TRow extends object>(...params: unknown[]): Promise<TRow[]>;\n}\n\n/** SQLite database capability used by the SQLite session backend. */\nexport interface SqliteDatabase {\n\texec(sql: string): Promise<void>;\n\tprepare(sql: string): SqliteStatement;\n\ttransaction<T>(fn: () => Promise<T>): Promise<T>;\n\tclose(): Promise<void>;\n}\n\nexport interface SqliteDatabaseFactory {\n\topen(path: string): Promise<SqliteDatabase>;\n}\n\nexport interface SqliteSessionMetadata extends SessionMetadata {\n\tcwd: string;\n\tpath: string;\n\tparentSessionId?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface SqliteSessionCreateOptions extends SessionCreateOptions {\n\tcwd: string;\n\tparentSessionId?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface SqliteSessionListOptions {\n\tcwd?: string;\n}\n\nexport interface SqliteSessionBackendOptions {\n\tkind: \"sqlite\";\n\tdatabasePath: string;\n}\n\nexport interface SqliteSessionRepoApi\n\textends SessionRepo<SqliteSessionMetadata, SqliteSessionCreateOptions, SqliteSessionListOptions> {}\n\nexport type SqliteSessionRepoEnv = Pick<FileSystem, \"absolutePath\" | \"createDir\" | \"exists\">;\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@handy_wote/pi-storage-sqlite-node",
|
|
3
|
+
"version": "0.81.1",
|
|
4
|
+
"description": "Node sqlite storage backend for @handy_wote/pi-agent-core sessions",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md",
|
|
17
|
+
"CHANGELOG.md"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"clean": "node -e \"import('node:fs/promises').then(fs=>fs.rm('dist',{recursive:true,force:true}))\"",
|
|
21
|
+
"build": "tsgo -p tsconfig.build.json && node ./scripts/prepare-dist.mjs copy-sqlite-migrations",
|
|
22
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
23
|
+
},
|
|
24
|
+
"author": "Earendil Works",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "git+https://github.com/earendil-works/pi.git",
|
|
29
|
+
"directory": "packages/storage/sqlite-node"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=22.19.0"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@handy_wote/pi-ai": "^0.81.1",
|
|
36
|
+
"@handy_wote/pi-agent-core": "^0.81.1"
|
|
37
|
+
}
|
|
38
|
+
}
|