@better-agent/prisma 0.2.0-beta.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/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +146 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/index.d.mts +15 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +228 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +64 -0
package/dist/cli.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/cli.mjs
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolveSchemaDomains, selectBetterAgentSchema } from "@better-agent/schema";
|
|
3
|
+
import { renderPrismaSchema } from "@farming-labs/orm";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import process$1 from "node:process";
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
8
|
+
import { cancel, isCancel, multiselect } from "@clack/prompts";
|
|
9
|
+
|
|
10
|
+
//#region src/generate.ts
|
|
11
|
+
const PRISMA_START_MARKER = "// @better-agent/prisma:start";
|
|
12
|
+
const PRISMA_END_MARKER = "// @better-agent/prisma:end";
|
|
13
|
+
function stripPrismaSchemaPreamble(schema) {
|
|
14
|
+
return schema.replace(/^\s*generator\s+\w+\s*\{[\s\S]*?\}\s*/gm, "").replace(/^\s*datasource\s+\w+\s*\{[\s\S]*?\}\s*/gm, "").trim();
|
|
15
|
+
}
|
|
16
|
+
function upsertManagedPrismaBlock(existing, schema) {
|
|
17
|
+
const block = `${PRISMA_START_MARKER}\n${schema.trim()}\n${PRISMA_END_MARKER}\n`;
|
|
18
|
+
const start = existing.indexOf(PRISMA_START_MARKER);
|
|
19
|
+
const end = existing.indexOf(PRISMA_END_MARKER);
|
|
20
|
+
if (start >= 0 && end > start) return `${existing.slice(0, start).replace(/\s*$/, "\n\n")}${block}${existing.slice(end + 27).replace(/^\s*/, "\n\n")}`.replace(/\n{3,}/g, "\n\n");
|
|
21
|
+
return existing.trim().length === 0 ? block : `${existing.trim()}\n\n${block}`;
|
|
22
|
+
}
|
|
23
|
+
async function readExistingSchema(out) {
|
|
24
|
+
try {
|
|
25
|
+
return await readFile(out, "utf8");
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function generatePrismaSchemaFile(options) {
|
|
31
|
+
const { out, provider, mode, only } = options;
|
|
32
|
+
const schema = renderPrismaSchema(selectBetterAgentSchema(only), { provider });
|
|
33
|
+
const resultBase = {
|
|
34
|
+
out,
|
|
35
|
+
provider,
|
|
36
|
+
mode,
|
|
37
|
+
...only ? { only } : {}
|
|
38
|
+
};
|
|
39
|
+
await mkdir(path.dirname(out), { recursive: true });
|
|
40
|
+
if (mode === "replace") {
|
|
41
|
+
await writeFile(out, `${schema.trim()}\n`, "utf8");
|
|
42
|
+
return {
|
|
43
|
+
...resultBase,
|
|
44
|
+
operation: "replaced"
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const existing = await readExistingSchema(out);
|
|
48
|
+
await writeFile(out, upsertManagedPrismaBlock(existing ?? "", stripPrismaSchemaPreamble(schema)), "utf8");
|
|
49
|
+
return {
|
|
50
|
+
...resultBase,
|
|
51
|
+
operation: existing === null ? "created" : "updated"
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/interactive.ts
|
|
57
|
+
const prismaDomains = [
|
|
58
|
+
"memory",
|
|
59
|
+
"runs",
|
|
60
|
+
"streams"
|
|
61
|
+
];
|
|
62
|
+
const domainOptions = {
|
|
63
|
+
memory: {
|
|
64
|
+
label: "Memory",
|
|
65
|
+
hint: "threads/messages"
|
|
66
|
+
},
|
|
67
|
+
runs: {
|
|
68
|
+
label: "Runs",
|
|
69
|
+
hint: "history"
|
|
70
|
+
},
|
|
71
|
+
streams: {
|
|
72
|
+
label: "Streams",
|
|
73
|
+
hint: "resume"
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
async function promptPrismaDomains() {
|
|
77
|
+
const selected = await multiselect({
|
|
78
|
+
message: "Select schema domains",
|
|
79
|
+
required: false,
|
|
80
|
+
initialValues: [...prismaDomains],
|
|
81
|
+
options: prismaDomains.map((domain) => ({
|
|
82
|
+
value: domain,
|
|
83
|
+
label: domainOptions[domain].label,
|
|
84
|
+
hint: domainOptions[domain].hint
|
|
85
|
+
}))
|
|
86
|
+
});
|
|
87
|
+
if (isCancel(selected)) {
|
|
88
|
+
cancel("Generation cancelled.");
|
|
89
|
+
process.exit(0);
|
|
90
|
+
}
|
|
91
|
+
return selected.length === prismaDomains.length ? void 0 : resolveSchemaDomains(selected);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
//#endregion
|
|
95
|
+
//#region src/cli.ts
|
|
96
|
+
const program = new Command();
|
|
97
|
+
const providers = [
|
|
98
|
+
"postgresql",
|
|
99
|
+
"mysql",
|
|
100
|
+
"sqlite"
|
|
101
|
+
];
|
|
102
|
+
const modes = ["block", "replace"];
|
|
103
|
+
const green = (value) => process$1.stdout.isTTY ? `\x1b[32m${value}\x1b[0m` : value;
|
|
104
|
+
const dim = (value) => process$1.stdout.isTTY ? `\x1b[2m${value}\x1b[0m` : value;
|
|
105
|
+
const successMark = green("✓");
|
|
106
|
+
function printHeader() {
|
|
107
|
+
console.log(green("BETTER-AGENT"));
|
|
108
|
+
console.log(dim("Prisma adapter"));
|
|
109
|
+
console.log("");
|
|
110
|
+
}
|
|
111
|
+
function parseDomains(input) {
|
|
112
|
+
if (!input) return;
|
|
113
|
+
const only = input.split(",").map((domain) => domain.trim()).filter(Boolean);
|
|
114
|
+
if (only.some((domain) => !prismaDomains.includes(domain))) throw new Error(`Unsupported domain list '${input}'.`);
|
|
115
|
+
return resolveSchemaDomains(only);
|
|
116
|
+
}
|
|
117
|
+
function parseProvider(input) {
|
|
118
|
+
if (!providers.includes(input)) throw new Error(`Unsupported provider '${input}'.`);
|
|
119
|
+
return input;
|
|
120
|
+
}
|
|
121
|
+
function parseMode(input) {
|
|
122
|
+
if (!modes.includes(input)) throw new Error(`Unsupported mode '${input}'.`);
|
|
123
|
+
return input;
|
|
124
|
+
}
|
|
125
|
+
program.name("better-agent-prisma").description("Better Agent Prisma helpers");
|
|
126
|
+
program.command("generate").description("Generate Better Agent Prisma schema into your project").option("--out <path>", "Prisma schema file path", "prisma/schema.prisma").option("--provider <provider>", "postgresql | mysql | sqlite", "postgresql").option("--mode <mode>", "block | replace", "block").option("--only <domains>", "memory | runs | streams", "").action(async (options) => {
|
|
127
|
+
const only = !options.only && process$1.stdin.isTTY ? await promptPrismaDomains() : parseDomains(options.only);
|
|
128
|
+
const result = await generatePrismaSchemaFile({
|
|
129
|
+
out: path.resolve(process$1.cwd(), options.out),
|
|
130
|
+
provider: parseProvider(options.provider),
|
|
131
|
+
mode: parseMode(options.mode),
|
|
132
|
+
only
|
|
133
|
+
});
|
|
134
|
+
console.log(`${successMark} updated Better Agent Prisma schema: ${result.operation} ${result.out}`);
|
|
135
|
+
console.log("");
|
|
136
|
+
});
|
|
137
|
+
printHeader();
|
|
138
|
+
program.parseAsync().catch((error) => {
|
|
139
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
140
|
+
console.error(message);
|
|
141
|
+
process$1.exitCode = 1;
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
//#endregion
|
|
145
|
+
export { };
|
|
146
|
+
//# sourceMappingURL=cli.mjs.map
|
package/dist/cli.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["process"],"sources":["../src/generate.ts","../src/interactive.ts","../src/cli.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { selectBetterAgentSchema } from \"@better-agent/schema\";\nimport type { SchemaDomain } from \"@better-agent/schema\";\nimport { renderPrismaSchema } from \"@farming-labs/orm\";\n\nexport const PRISMA_START_MARKER = \"// @better-agent/prisma:start\";\nexport const PRISMA_END_MARKER = \"// @better-agent/prisma:end\";\n\nexport type PrismaProvider = \"postgresql\" | \"mysql\" | \"sqlite\";\nexport type GenerateMode = \"block\" | \"replace\";\n\nexport interface GeneratePrismaSchemaOptions {\n out: string;\n provider: PrismaProvider;\n mode: GenerateMode;\n only?: readonly SchemaDomain[];\n}\n\nexport interface GeneratePrismaSchemaResult {\n out: string;\n provider: PrismaProvider;\n mode: GenerateMode;\n only?: readonly SchemaDomain[];\n operation: \"created\" | \"updated\" | \"replaced\";\n}\n\nexport function stripPrismaSchemaPreamble(schema: string): string {\n return schema\n .replace(/^\\s*generator\\s+\\w+\\s*\\{[\\s\\S]*?\\}\\s*/gm, \"\")\n .replace(/^\\s*datasource\\s+\\w+\\s*\\{[\\s\\S]*?\\}\\s*/gm, \"\")\n .trim();\n}\n\nexport function upsertManagedPrismaBlock(existing: string, schema: string): string {\n const block = `${PRISMA_START_MARKER}\\n${schema.trim()}\\n${PRISMA_END_MARKER}\\n`;\n const start = existing.indexOf(PRISMA_START_MARKER);\n const end = existing.indexOf(PRISMA_END_MARKER);\n\n if (start >= 0 && end > start) {\n const before = existing.slice(0, start).replace(/\\s*$/, \"\\n\\n\");\n const after = existing.slice(end + PRISMA_END_MARKER.length).replace(/^\\s*/, \"\\n\\n\");\n return `${before}${block}${after}`.replace(/\\n{3,}/g, \"\\n\\n\");\n }\n\n return existing.trim().length === 0 ? block : `${existing.trim()}\\n\\n${block}`;\n}\n\nasync function readExistingSchema(out: string): Promise<string | null> {\n try {\n return await readFile(out, \"utf8\");\n } catch {\n return null;\n }\n}\n\nexport async function generatePrismaSchemaFile(\n options: GeneratePrismaSchemaOptions,\n): Promise<GeneratePrismaSchemaResult> {\n const { out, provider, mode, only } = options;\n const schema = renderPrismaSchema(selectBetterAgentSchema(only), { provider });\n const resultBase = {\n out,\n provider,\n mode,\n ...(only ? { only } : {}),\n };\n await mkdir(path.dirname(out), { recursive: true });\n\n if (mode === \"replace\") {\n await writeFile(out, `${schema.trim()}\\n`, \"utf8\");\n return {\n ...resultBase,\n operation: \"replaced\",\n };\n }\n\n const existing = await readExistingSchema(out);\n const next = upsertManagedPrismaBlock(existing ?? \"\", stripPrismaSchemaPreamble(schema));\n await writeFile(out, next, \"utf8\");\n\n return {\n ...resultBase,\n operation: existing === null ? \"created\" : \"updated\",\n };\n}\n","import { resolveSchemaDomains } from \"@better-agent/schema\";\nimport type { SchemaDomain } from \"@better-agent/schema\";\nimport { cancel, isCancel, multiselect } from \"@clack/prompts\";\n\nexport const prismaDomains = [\n \"memory\",\n \"runs\",\n \"streams\",\n] as const satisfies readonly SchemaDomain[];\nexport type PrismaDomain = (typeof prismaDomains)[number];\n\nconst domainOptions = {\n memory: {\n label: \"Memory\",\n hint: \"threads/messages\",\n },\n runs: {\n label: \"Runs\",\n hint: \"history\",\n },\n streams: {\n label: \"Streams\",\n hint: \"resume\",\n },\n} as const satisfies Record<PrismaDomain, { label: string; hint: string }>;\n\nexport async function promptPrismaDomains(): Promise<readonly PrismaDomain[] | undefined> {\n const selected = await multiselect<PrismaDomain>({\n message: \"Select schema domains\",\n required: false,\n initialValues: [...prismaDomains],\n options: prismaDomains.map((domain) => ({\n value: domain,\n label: domainOptions[domain].label,\n hint: domainOptions[domain].hint,\n })),\n });\n\n if (isCancel(selected)) {\n cancel(\"Generation cancelled.\");\n process.exit(0);\n }\n\n return selected.length === prismaDomains.length ? undefined : resolveSchemaDomains(selected);\n}\n","#!/usr/bin/env node\n\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { resolveSchemaDomains } from \"@better-agent/schema\";\nimport type { SchemaDomain } from \"@better-agent/schema\";\nimport { Command } from \"commander\";\nimport { type GenerateMode, type PrismaProvider, generatePrismaSchemaFile } from \"./generate\";\nimport { prismaDomains, promptPrismaDomains } from \"./interactive\";\n\nconst program = new Command();\nconst providers = [\"postgresql\", \"mysql\", \"sqlite\"] as const;\nconst modes = [\"block\", \"replace\"] as const;\nconst green = (value: string) => (process.stdout.isTTY ? `\\x1b[32m${value}\\x1b[0m` : value);\nconst dim = (value: string) => (process.stdout.isTTY ? `\\x1b[2m${value}\\x1b[0m` : value);\nconst successMark = green(\"✓\");\n\nfunction printHeader() {\n console.log(green(\"BETTER-AGENT\"));\n console.log(dim(\"Prisma adapter\"));\n console.log(\"\");\n}\n\nfunction parseDomains(input?: string): readonly SchemaDomain[] | undefined {\n if (!input) {\n return undefined;\n }\n\n const only = input\n .split(\",\")\n .map((domain) => domain.trim())\n .filter(Boolean);\n\n if (only.some((domain) => !prismaDomains.includes(domain as SchemaDomain))) {\n throw new Error(`Unsupported domain list '${input}'.`);\n }\n\n return resolveSchemaDomains(only as SchemaDomain[]);\n}\n\nfunction parseProvider(input: string): PrismaProvider {\n if (!providers.includes(input as PrismaProvider)) {\n throw new Error(`Unsupported provider '${input}'.`);\n }\n\n return input as PrismaProvider;\n}\n\nfunction parseMode(input: string): GenerateMode {\n if (!modes.includes(input as GenerateMode)) {\n throw new Error(`Unsupported mode '${input}'.`);\n }\n\n return input as GenerateMode;\n}\n\nprogram.name(\"better-agent-prisma\").description(\"Better Agent Prisma helpers\");\n\nprogram\n .command(\"generate\")\n .description(\"Generate Better Agent Prisma schema into your project\")\n .option(\"--out <path>\", \"Prisma schema file path\", \"prisma/schema.prisma\")\n .option(\"--provider <provider>\", \"postgresql | mysql | sqlite\", \"postgresql\")\n .option(\"--mode <mode>\", \"block | replace\", \"block\")\n .option(\"--only <domains>\", \"memory | runs | streams\", \"\")\n .action(\n async (options: {\n out: string;\n provider: PrismaProvider;\n mode: GenerateMode;\n only?: string;\n }) => {\n const only =\n !options.only && process.stdin.isTTY\n ? await promptPrismaDomains()\n : parseDomains(options.only);\n const result = await generatePrismaSchemaFile({\n out: path.resolve(process.cwd(), options.out),\n provider: parseProvider(options.provider),\n mode: parseMode(options.mode),\n only,\n });\n\n console.log(\n `${successMark} updated Better Agent Prisma schema: ${result.operation} ${result.out}`,\n );\n console.log(\"\");\n },\n );\n\nprintHeader();\n\nprogram.parseAsync().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n});\n"],"mappings":"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"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BetterAgentStorage } from "@better-agent/core";
|
|
2
|
+
import { PrismaClientLike as OrmPrismaClientLike } from "@farming-labs/orm-prisma";
|
|
3
|
+
|
|
4
|
+
//#region src/types.d.ts
|
|
5
|
+
type PrismaClientInput = object;
|
|
6
|
+
interface PrismaOptions {
|
|
7
|
+
client: PrismaClientInput;
|
|
8
|
+
}
|
|
9
|
+
type PrismaStorage = BetterAgentStorage;
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region src/storage/adapter.d.ts
|
|
12
|
+
declare function prismaStorage(input: PrismaOptions): BetterAgentStorage;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { PrismaClientInput, type OrmPrismaClientLike as PrismaClientLike, PrismaOptions, PrismaStorage, prismaStorage };
|
|
15
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/storage/adapter.ts"],"mappings":";;;;KAGY,iBAAA;AAAA,UAEK,aAAA;EACb,MAAA,EAAQ,iBAAA;AAAA;AAAA,KAGA,aAAA,GAAgB,kBAAA;;;iBCuGZ,aAAA,CAAc,KAAA,EAAO,aAAA,GAAgB,kBAAA"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { storageTables, throwUnsupportedStorageTable } from "@better-agent/core";
|
|
2
|
+
import { selectBetterAgentSchema, toBetterAgentOrmListQuery } from "@better-agent/schema";
|
|
3
|
+
import { createOrm } from "@farming-labs/orm";
|
|
4
|
+
import { createPrismaDriver } from "@farming-labs/orm-prisma";
|
|
5
|
+
|
|
6
|
+
//#region src/orm.ts
|
|
7
|
+
function createPrismaOrm(schema, options) {
|
|
8
|
+
return createOrm({
|
|
9
|
+
schema,
|
|
10
|
+
driver: createPrismaDriver({ client: options.client })
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
//#region src/storage/mappers.ts
|
|
16
|
+
function fromRunRow(row) {
|
|
17
|
+
return {
|
|
18
|
+
runId: row.runId,
|
|
19
|
+
agentName: row.agentName,
|
|
20
|
+
...row.threadId ? { threadId: row.threadId } : {},
|
|
21
|
+
...row.scope ? { scope: row.scope } : {},
|
|
22
|
+
status: row.status,
|
|
23
|
+
...row.abortRequestedAt ? { abortRequestedAt: row.abortRequestedAt.getTime() } : {},
|
|
24
|
+
...row.finalEvent ? { finalEvent: row.finalEvent } : {},
|
|
25
|
+
config: row.config ?? void 0,
|
|
26
|
+
startedAt: row.startedAt.getTime(),
|
|
27
|
+
updatedAt: row.updatedAt.getTime(),
|
|
28
|
+
...row.finishedAt ? { finishedAt: row.finishedAt.getTime() } : {}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function toRunRow(id, record) {
|
|
32
|
+
return {
|
|
33
|
+
runId: record.runId || id,
|
|
34
|
+
agentName: record.agentName,
|
|
35
|
+
threadId: record.threadId ?? null,
|
|
36
|
+
scope: record.scope ?? null,
|
|
37
|
+
status: record.status,
|
|
38
|
+
abortRequestedAt: record.abortRequestedAt === void 0 ? null : new Date(record.abortRequestedAt),
|
|
39
|
+
finalEvent: record.finalEvent ?? null,
|
|
40
|
+
config: record.config ?? null,
|
|
41
|
+
startedAt: new Date(record.startedAt),
|
|
42
|
+
updatedAt: new Date(record.updatedAt),
|
|
43
|
+
finishedAt: record.finishedAt === void 0 ? null : new Date(record.finishedAt)
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function fromThreadRow(row) {
|
|
47
|
+
return {
|
|
48
|
+
id: row.id,
|
|
49
|
+
agentName: row.agentName ?? "",
|
|
50
|
+
...row.scope ? { scope: row.scope } : {},
|
|
51
|
+
...row.title ? { title: row.title } : {},
|
|
52
|
+
...row.state !== null ? { state: row.state } : {},
|
|
53
|
+
...row.metadata && typeof row.metadata === "object" && !Array.isArray(row.metadata) ? { metadata: row.metadata } : {},
|
|
54
|
+
createdAt: row.createdAt.getTime(),
|
|
55
|
+
updatedAt: row.updatedAt.getTime()
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function toThreadRow(id, record) {
|
|
59
|
+
return {
|
|
60
|
+
id: record.id || id,
|
|
61
|
+
agentName: record.agentName,
|
|
62
|
+
scope: record.scope ?? null,
|
|
63
|
+
title: record.title ?? null,
|
|
64
|
+
state: record.state ?? null,
|
|
65
|
+
metadata: record.metadata ?? null,
|
|
66
|
+
createdAt: new Date(record.createdAt),
|
|
67
|
+
updatedAt: new Date(record.updatedAt)
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function fromMessageRow(row) {
|
|
71
|
+
return {
|
|
72
|
+
...row.message,
|
|
73
|
+
threadId: row.threadId,
|
|
74
|
+
...row.runId ? { runId: row.runId } : {},
|
|
75
|
+
createdAt: row.createdAt.getTime()
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function toMessageRow(id, record) {
|
|
79
|
+
const { threadId, runId, createdAt, ...message } = record;
|
|
80
|
+
return {
|
|
81
|
+
id,
|
|
82
|
+
threadId,
|
|
83
|
+
runId: runId ?? null,
|
|
84
|
+
message,
|
|
85
|
+
createdAt: new Date(createdAt)
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function fromStreamRow(row) {
|
|
89
|
+
return {
|
|
90
|
+
runId: row.runId,
|
|
91
|
+
status: row.status,
|
|
92
|
+
createdAt: row.createdAt.getTime(),
|
|
93
|
+
updatedAt: row.updatedAt.getTime(),
|
|
94
|
+
...row.closedAt ? { closedAt: row.closedAt.getTime() } : {}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function toStreamRow(id, record) {
|
|
98
|
+
return {
|
|
99
|
+
id,
|
|
100
|
+
runId: record.runId,
|
|
101
|
+
status: record.status,
|
|
102
|
+
createdAt: new Date(record.createdAt),
|
|
103
|
+
updatedAt: new Date(record.updatedAt),
|
|
104
|
+
closedAt: record.closedAt === void 0 ? null : new Date(record.closedAt)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function fromStreamEventRow(row) {
|
|
108
|
+
return {
|
|
109
|
+
id: row.id,
|
|
110
|
+
runId: row.runId,
|
|
111
|
+
seq: row.seq,
|
|
112
|
+
timestamp: row.timestamp.getTime(),
|
|
113
|
+
event: row.event
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function toStreamEventRow(id, record) {
|
|
117
|
+
return {
|
|
118
|
+
id: record.id || id,
|
|
119
|
+
runId: record.runId,
|
|
120
|
+
seq: record.seq,
|
|
121
|
+
timestamp: new Date(record.timestamp),
|
|
122
|
+
event: record.event
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
//#endregion
|
|
127
|
+
//#region src/storage/adapter.ts
|
|
128
|
+
const prismaSchema = selectBetterAgentSchema();
|
|
129
|
+
async function upsertRow(input) {
|
|
130
|
+
const where = { [input.keyField]: input.id };
|
|
131
|
+
if (!await input.model.findUnique({ where })) {
|
|
132
|
+
await input.model.upsert({
|
|
133
|
+
where,
|
|
134
|
+
create: input.row,
|
|
135
|
+
update: input.row
|
|
136
|
+
});
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
await input.model.update({
|
|
140
|
+
where,
|
|
141
|
+
data: input.row
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function createTableAdapter(input) {
|
|
145
|
+
return {
|
|
146
|
+
async get(id) {
|
|
147
|
+
const row = await input.model.findUnique({ where: { [input.keyField]: id } });
|
|
148
|
+
return row ? input.fromRow(row) : void 0;
|
|
149
|
+
},
|
|
150
|
+
async set(id, value) {
|
|
151
|
+
await upsertRow({
|
|
152
|
+
model: input.model,
|
|
153
|
+
keyField: input.keyField,
|
|
154
|
+
id,
|
|
155
|
+
row: input.toRow(id, value)
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
async delete(id) {
|
|
159
|
+
await input.model.deleteMany({ where: { [input.keyField]: id } });
|
|
160
|
+
},
|
|
161
|
+
async list(query) {
|
|
162
|
+
return { items: (await input.model.findMany(toBetterAgentOrmListQuery(query))).map(input.fromRow) };
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function resolveAdapter(adapters, table) {
|
|
167
|
+
return adapters.get(table) ?? throwUnsupportedStorageTable(table, "prisma storage");
|
|
168
|
+
}
|
|
169
|
+
function requireModel(orm, modelName) {
|
|
170
|
+
return orm[modelName];
|
|
171
|
+
}
|
|
172
|
+
function prismaStorage(input) {
|
|
173
|
+
const orm = createPrismaOrm(prismaSchema, input);
|
|
174
|
+
const adapters = /* @__PURE__ */ new Map();
|
|
175
|
+
const runModel = requireModel(orm, "run");
|
|
176
|
+
if (runModel) adapters.set(storageTables.runs, createTableAdapter({
|
|
177
|
+
model: runModel,
|
|
178
|
+
keyField: "runId",
|
|
179
|
+
fromRow: fromRunRow,
|
|
180
|
+
toRow: toRunRow
|
|
181
|
+
}));
|
|
182
|
+
const threadModel = requireModel(orm, "thread");
|
|
183
|
+
if (threadModel) adapters.set(storageTables.memoryThreads, createTableAdapter({
|
|
184
|
+
model: threadModel,
|
|
185
|
+
keyField: "id",
|
|
186
|
+
fromRow: fromThreadRow,
|
|
187
|
+
toRow: toThreadRow
|
|
188
|
+
}));
|
|
189
|
+
const messageModel = requireModel(orm, "message");
|
|
190
|
+
if (messageModel) adapters.set(storageTables.memoryMessages, createTableAdapter({
|
|
191
|
+
model: messageModel,
|
|
192
|
+
keyField: "id",
|
|
193
|
+
fromRow: fromMessageRow,
|
|
194
|
+
toRow: toMessageRow
|
|
195
|
+
}));
|
|
196
|
+
const streamModel = requireModel(orm, "stream");
|
|
197
|
+
if (streamModel) adapters.set(storageTables.streams, createTableAdapter({
|
|
198
|
+
model: streamModel,
|
|
199
|
+
keyField: "id",
|
|
200
|
+
fromRow: fromStreamRow,
|
|
201
|
+
toRow: toStreamRow
|
|
202
|
+
}));
|
|
203
|
+
const streamEventModel = requireModel(orm, "streamEvent");
|
|
204
|
+
if (streamEventModel) adapters.set(storageTables.streamEvents, createTableAdapter({
|
|
205
|
+
model: streamEventModel,
|
|
206
|
+
keyField: "id",
|
|
207
|
+
fromRow: fromStreamEventRow,
|
|
208
|
+
toRow: toStreamEventRow
|
|
209
|
+
}));
|
|
210
|
+
return {
|
|
211
|
+
get(table, id) {
|
|
212
|
+
return resolveAdapter(adapters, table).get(id);
|
|
213
|
+
},
|
|
214
|
+
set(table, id, value) {
|
|
215
|
+
return resolveAdapter(adapters, table).set(id, value);
|
|
216
|
+
},
|
|
217
|
+
delete(table, id) {
|
|
218
|
+
return resolveAdapter(adapters, table).delete(id);
|
|
219
|
+
},
|
|
220
|
+
list(table, query) {
|
|
221
|
+
return resolveAdapter(adapters, table).list(query);
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
//#endregion
|
|
227
|
+
export { prismaStorage };
|
|
228
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/orm.ts","../src/storage/mappers.ts","../src/storage/adapter.ts"],"sourcesContent":["import { createOrm } from \"@farming-labs/orm\";\nimport type { AnyModelDefinition, OrmClient, SchemaDefinition } from \"@farming-labs/orm\";\nimport { createPrismaDriver } from \"@farming-labs/orm-prisma\";\nimport type { PrismaClientLike } from \"@farming-labs/orm-prisma\";\nimport type { PrismaOptions } from \"./types\";\n\nexport function createPrismaOrm<\n TSchema extends SchemaDefinition<Record<string, AnyModelDefinition>>,\n>(schema: TSchema, options: PrismaOptions): OrmClient<TSchema> {\n return createOrm({\n schema,\n driver: createPrismaDriver({\n client: options.client as PrismaClientLike,\n }),\n });\n}\n","import type {\n MemoryMessage,\n MemoryThread,\n RunRecord,\n StreamEventRecord,\n StreamRecord,\n} from \"@better-agent/core\";\nimport type { memorySchema, runsSchema, streamsSchema } from \"@better-agent/schema\";\nimport type { JsonValue, ScalarRecord } from \"@farming-labs/orm\";\n\nexport type RunRow = ScalarRecord<typeof runsSchema, \"run\">;\nexport type MemoryThreadRow = ScalarRecord<typeof memorySchema, \"thread\">;\nexport type MemoryMessageRow = ScalarRecord<typeof memorySchema, \"message\">;\nexport type StreamRow = ScalarRecord<typeof streamsSchema, \"stream\">;\nexport type StreamEventRow = ScalarRecord<typeof streamsSchema, \"streamEvent\">;\n\nexport function fromRunRow(row: RunRow): RunRecord {\n return {\n runId: row.runId,\n agentName: row.agentName,\n ...(row.threadId ? { threadId: row.threadId } : {}),\n ...(row.scope ? { scope: row.scope } : {}),\n status: row.status,\n ...(row.abortRequestedAt ? { abortRequestedAt: row.abortRequestedAt.getTime() } : {}),\n ...(row.finalEvent\n ? { finalEvent: row.finalEvent as unknown as RunRecord[\"finalEvent\"] }\n : {}),\n config: row.config ?? undefined,\n startedAt: row.startedAt.getTime(),\n updatedAt: row.updatedAt.getTime(),\n ...(row.finishedAt ? { finishedAt: row.finishedAt.getTime() } : {}),\n };\n}\n\nexport function toRunRow(id: string, record: RunRecord): RunRow {\n return {\n runId: record.runId || id,\n agentName: record.agentName,\n threadId: record.threadId ?? null,\n scope: record.scope ?? null,\n status: record.status,\n abortRequestedAt:\n record.abortRequestedAt === undefined ? null : new Date(record.abortRequestedAt),\n finalEvent: (record.finalEvent ?? null) as JsonValue | null,\n config: (record.config ?? null) as JsonValue | null,\n startedAt: new Date(record.startedAt),\n updatedAt: new Date(record.updatedAt),\n finishedAt: record.finishedAt === undefined ? null : new Date(record.finishedAt),\n };\n}\n\nexport function fromThreadRow(row: MemoryThreadRow): MemoryThread {\n return {\n id: row.id,\n agentName: row.agentName ?? \"\",\n ...(row.scope ? { scope: row.scope } : {}),\n ...(row.title ? { title: row.title } : {}),\n ...(row.state !== null ? { state: row.state } : {}),\n ...(row.metadata && typeof row.metadata === \"object\" && !Array.isArray(row.metadata)\n ? { metadata: row.metadata as Record<string, unknown> }\n : {}),\n createdAt: row.createdAt.getTime(),\n updatedAt: row.updatedAt.getTime(),\n };\n}\n\nexport function toThreadRow(id: string, record: MemoryThread): MemoryThreadRow {\n return {\n id: record.id || id,\n agentName: record.agentName,\n scope: record.scope ?? null,\n title: record.title ?? null,\n state: (record.state ?? null) as JsonValue | null,\n metadata: (record.metadata ?? null) as JsonValue | null,\n createdAt: new Date(record.createdAt),\n updatedAt: new Date(record.updatedAt),\n };\n}\n\nexport function fromMessageRow(row: MemoryMessageRow): MemoryMessage {\n const message = {\n ...(row.message as unknown as Omit<MemoryMessage, \"threadId\" | \"runId\" | \"createdAt\">),\n threadId: row.threadId,\n ...(row.runId ? { runId: row.runId } : {}),\n createdAt: row.createdAt.getTime(),\n };\n\n return message as MemoryMessage;\n}\n\nexport function toMessageRow(id: string, record: MemoryMessage): MemoryMessageRow {\n const { threadId, runId, createdAt, ...message } = record;\n\n return {\n id,\n threadId,\n runId: runId ?? null,\n message: message as JsonValue,\n createdAt: new Date(createdAt),\n };\n}\n\nexport function fromStreamRow(row: StreamRow): StreamRecord {\n return {\n runId: row.runId,\n status: row.status,\n createdAt: row.createdAt.getTime(),\n updatedAt: row.updatedAt.getTime(),\n ...(row.closedAt ? { closedAt: row.closedAt.getTime() } : {}),\n };\n}\n\nexport function toStreamRow(id: string, record: StreamRecord): StreamRow {\n return {\n id,\n runId: record.runId,\n status: record.status,\n createdAt: new Date(record.createdAt),\n updatedAt: new Date(record.updatedAt),\n closedAt: record.closedAt === undefined ? null : new Date(record.closedAt),\n };\n}\n\nexport function fromStreamEventRow(row: StreamEventRow): StreamEventRecord {\n return {\n id: row.id,\n runId: row.runId,\n seq: row.seq,\n timestamp: row.timestamp.getTime(),\n event: row.event as unknown as StreamEventRecord[\"event\"],\n };\n}\n\nexport function toStreamEventRow(id: string, record: StreamEventRecord): StreamEventRow {\n return {\n id: record.id || id,\n runId: record.runId,\n seq: record.seq,\n timestamp: new Date(record.timestamp),\n event: record.event as unknown as JsonValue,\n };\n}\n","import type { BetterAgentStorage, StoreListQuery, StoreListResult } from \"@better-agent/core\";\nimport { storageTables, throwUnsupportedStorageTable } from \"@better-agent/core\";\nimport { selectBetterAgentSchema, toBetterAgentOrmListQuery } from \"@better-agent/schema\";\nimport type { ModelClient, ModelName, OrmClient } from \"@farming-labs/orm\";\nimport { createPrismaOrm } from \"../orm\";\nimport type { PrismaOptions } from \"../types\";\nimport {\n fromMessageRow,\n fromRunRow,\n fromStreamEventRow,\n fromStreamRow,\n fromThreadRow,\n toMessageRow,\n toRunRow,\n toStreamEventRow,\n toStreamRow,\n toThreadRow,\n} from \"./mappers\";\n\nconst prismaSchema = selectBetterAgentSchema();\n\ntype PrismaSchema = typeof prismaSchema;\ntype PrismaModelName = ModelName<PrismaSchema>;\ntype PrismaOrm = OrmClient<PrismaSchema>;\n\ntype TableAdapter = {\n get(id: string): Promise<unknown | undefined>;\n set(id: string, value: unknown): Promise<void>;\n delete(id: string): Promise<void>;\n list(query?: StoreListQuery): Promise<StoreListResult<unknown>>;\n};\n\nasync function upsertRow<TModelName extends PrismaModelName, TRow>(input: {\n model: ModelClient<PrismaSchema, TModelName>;\n keyField: string;\n id: string;\n row: TRow;\n}): Promise<void> {\n type FindUniqueArgs = Parameters<typeof input.model.findUnique>[0];\n type UpdateArgs = Parameters<typeof input.model.update>[0];\n type UpsertArgs = Parameters<typeof input.model.upsert>[0];\n\n const where = { [input.keyField]: input.id };\n const existing = await input.model.findUnique({ where } as FindUniqueArgs);\n\n if (!existing) {\n await input.model.upsert({\n where,\n create: input.row,\n update: input.row,\n } as UpsertArgs);\n return;\n }\n\n await input.model.update({\n where,\n data: input.row,\n } as UpdateArgs);\n}\n\nfunction createTableAdapter<TModelName extends PrismaModelName, TRecord, TRow>(input: {\n model: ModelClient<PrismaSchema, TModelName>;\n keyField: string;\n fromRow(row: TRow): TRecord;\n toRow(id: string, record: TRecord): TRow;\n}): TableAdapter {\n return {\n async get(id) {\n type FindUniqueArgs = Parameters<typeof input.model.findUnique>[0];\n\n const row = (await input.model.findUnique({\n where: { [input.keyField]: id },\n } as FindUniqueArgs)) as TRow | null;\n\n return row ? input.fromRow(row) : undefined;\n },\n async set(id, value) {\n await upsertRow({\n model: input.model,\n keyField: input.keyField,\n id,\n row: input.toRow(id, value as TRecord),\n });\n },\n async delete(id) {\n type DeleteManyArgs = Parameters<typeof input.model.deleteMany>[0];\n\n await input.model.deleteMany({\n where: { [input.keyField]: id },\n } as DeleteManyArgs);\n },\n async list(query) {\n const rows = (await input.model.findMany(toBetterAgentOrmListQuery(query))) as TRow[];\n return {\n items: rows.map(input.fromRow),\n };\n },\n };\n}\n\nfunction resolveAdapter(adapters: ReadonlyMap<string, TableAdapter>, table: string): TableAdapter {\n return adapters.get(table) ?? throwUnsupportedStorageTable(table, \"prisma storage\");\n}\n\nfunction requireModel<TModelName extends PrismaModelName>(\n orm: PrismaOrm,\n modelName: TModelName,\n): ModelClient<PrismaSchema, TModelName> | undefined {\n const model = orm[modelName];\n return model;\n}\n\nexport function prismaStorage(input: PrismaOptions): BetterAgentStorage {\n const orm = createPrismaOrm(prismaSchema, input) as PrismaOrm;\n const adapters = new Map<string, TableAdapter>();\n\n const runModel = requireModel(orm, \"run\");\n if (runModel) {\n adapters.set(\n storageTables.runs,\n createTableAdapter({\n model: runModel,\n keyField: \"runId\",\n fromRow: fromRunRow,\n toRow: toRunRow,\n }),\n );\n }\n\n const threadModel = requireModel(orm, \"thread\");\n if (threadModel) {\n adapters.set(\n storageTables.memoryThreads,\n createTableAdapter({\n model: threadModel,\n keyField: \"id\",\n fromRow: fromThreadRow,\n toRow: toThreadRow,\n }),\n );\n }\n\n const messageModel = requireModel(orm, \"message\");\n if (messageModel) {\n adapters.set(\n storageTables.memoryMessages,\n createTableAdapter({\n model: messageModel,\n keyField: \"id\",\n fromRow: fromMessageRow,\n toRow: toMessageRow,\n }),\n );\n }\n\n const streamModel = requireModel(orm, \"stream\");\n if (streamModel) {\n adapters.set(\n storageTables.streams,\n createTableAdapter({\n model: streamModel,\n keyField: \"id\",\n fromRow: fromStreamRow,\n toRow: toStreamRow,\n }),\n );\n }\n\n const streamEventModel = requireModel(orm, \"streamEvent\");\n if (streamEventModel) {\n adapters.set(\n storageTables.streamEvents,\n createTableAdapter({\n model: streamEventModel,\n keyField: \"id\",\n fromRow: fromStreamEventRow,\n toRow: toStreamEventRow,\n }),\n );\n }\n\n return {\n get<T = unknown>(table: string, id: string) {\n return resolveAdapter(adapters, table).get(id) as Promise<T | undefined>;\n },\n set<T = unknown>(table: string, id: string, value: T) {\n return resolveAdapter(adapters, table).set(id, value);\n },\n delete(table: string, id: string) {\n return resolveAdapter(adapters, table).delete(id);\n },\n list<T = unknown>(table: string, query?: StoreListQuery) {\n return resolveAdapter(adapters, table).list(query) as Promise<StoreListResult<T>>;\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@better-agent/prisma",
|
|
3
|
+
"version": "0.2.0-beta.1",
|
|
4
|
+
"description": "Better Agent Prisma adapter",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/better-agent/better-agent.git",
|
|
9
|
+
"directory": "packages/prisma"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/better-agent/better-agent/tree/main/packages/prisma",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/better-agent/better-agent/issues"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"bun": ">=1.3.3",
|
|
17
|
+
"node": ">=20"
|
|
18
|
+
},
|
|
19
|
+
"type": "module",
|
|
20
|
+
"types": "./dist/index.d.mts",
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/index.d.mts",
|
|
25
|
+
"import": "./dist/index.mjs",
|
|
26
|
+
"default": "./dist/index.mjs"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"bin": {
|
|
30
|
+
"better-agent-prisma": "./dist/cli.mjs"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "bunx tsdown",
|
|
34
|
+
"dev": "bunx tsdown --watch --no-clean",
|
|
35
|
+
"lint:package": "bunx publint run --strict",
|
|
36
|
+
"lint:types": "npm_config_cache=../../.npm-cache bunx attw --profile esm-only --pack .",
|
|
37
|
+
"lint": "bunx biome check .",
|
|
38
|
+
"typecheck": "bunx tsc -p tsconfig.json --noEmit",
|
|
39
|
+
"format": "bunx biome format --write .",
|
|
40
|
+
"clean": "bunx rimraf dist"
|
|
41
|
+
},
|
|
42
|
+
"files": ["dist"],
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public",
|
|
45
|
+
"executableFiles": ["./dist/cli.mjs"]
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@better-agent/schema": "0.2.0-beta.1",
|
|
49
|
+
"@clack/prompts": "^1.2.0",
|
|
50
|
+
"@farming-labs/orm": "*",
|
|
51
|
+
"@farming-labs/orm-prisma": "^0.0.61",
|
|
52
|
+
"commander": "^14.0.3"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@better-agent/core": "0.2.0-beta.1",
|
|
56
|
+
"@types/bun": "^1.3.12",
|
|
57
|
+
"@types/node": "^22.19.17"
|
|
58
|
+
},
|
|
59
|
+
"peerDependencies": {
|
|
60
|
+
"@better-agent/core": "0.2.0-beta.1",
|
|
61
|
+
"@prisma/client": "*",
|
|
62
|
+
"prisma": "*"
|
|
63
|
+
}
|
|
64
|
+
}
|