@better-agent/drizzle 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 +143 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/index.d.mts +21 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +231 -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,143 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { renderDrizzleSchema } from "@farming-labs/orm";
|
|
3
|
+
import { resolveSchemaDomains, selectBetterAgentSchema } from "@better-agent/schema";
|
|
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 DRIZZLE_START_MARKER = "// @better-agent/drizzle:start";
|
|
12
|
+
const DRIZZLE_END_MARKER = "// @better-agent/drizzle:end";
|
|
13
|
+
function upsertManagedDrizzleBlock(existing, schema) {
|
|
14
|
+
const block = `${DRIZZLE_START_MARKER}\n${schema.trim()}\n${DRIZZLE_END_MARKER}\n`;
|
|
15
|
+
const start = existing.indexOf(DRIZZLE_START_MARKER);
|
|
16
|
+
const end = existing.indexOf(DRIZZLE_END_MARKER);
|
|
17
|
+
if (start >= 0 && end > start) return `${existing.slice(0, start).replace(/\s*$/, "\n\n")}${block}${existing.slice(end + 28).replace(/^\s*/, "\n\n")}`.replace(/\n{3,}/g, "\n\n");
|
|
18
|
+
return existing.trim().length === 0 ? block : `${existing.trim()}\n\n${block}`;
|
|
19
|
+
}
|
|
20
|
+
async function readExistingSchema(out) {
|
|
21
|
+
try {
|
|
22
|
+
return await readFile(out, "utf8");
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function generateDrizzleSchemaFile(options) {
|
|
28
|
+
const { out, dialect, mode, only } = options;
|
|
29
|
+
const schema = renderDrizzleSchema(selectBetterAgentSchema(only), { dialect });
|
|
30
|
+
const resultBase = {
|
|
31
|
+
out,
|
|
32
|
+
dialect,
|
|
33
|
+
mode,
|
|
34
|
+
...only ? { only } : {}
|
|
35
|
+
};
|
|
36
|
+
await mkdir(path.dirname(out), { recursive: true });
|
|
37
|
+
if (mode === "replace") {
|
|
38
|
+
await writeFile(out, `${schema.trim()}\n`, "utf8");
|
|
39
|
+
return {
|
|
40
|
+
...resultBase,
|
|
41
|
+
operation: "replaced"
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const existing = await readExistingSchema(out);
|
|
45
|
+
await writeFile(out, upsertManagedDrizzleBlock(existing ?? "", schema), "utf8");
|
|
46
|
+
return {
|
|
47
|
+
...resultBase,
|
|
48
|
+
operation: existing === null ? "created" : "updated"
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/interactive.ts
|
|
54
|
+
const drizzleDomains = [
|
|
55
|
+
"memory",
|
|
56
|
+
"runs",
|
|
57
|
+
"streams"
|
|
58
|
+
];
|
|
59
|
+
const domainOptions = {
|
|
60
|
+
memory: {
|
|
61
|
+
label: "Memory",
|
|
62
|
+
hint: "threads/messages"
|
|
63
|
+
},
|
|
64
|
+
runs: {
|
|
65
|
+
label: "Runs",
|
|
66
|
+
hint: "history"
|
|
67
|
+
},
|
|
68
|
+
streams: {
|
|
69
|
+
label: "Streams",
|
|
70
|
+
hint: "resume"
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
async function promptDrizzleDomains() {
|
|
74
|
+
const selected = await multiselect({
|
|
75
|
+
message: "Select schema domains",
|
|
76
|
+
required: false,
|
|
77
|
+
initialValues: [...drizzleDomains],
|
|
78
|
+
options: drizzleDomains.map((domain) => ({
|
|
79
|
+
value: domain,
|
|
80
|
+
label: domainOptions[domain].label,
|
|
81
|
+
hint: domainOptions[domain].hint
|
|
82
|
+
}))
|
|
83
|
+
});
|
|
84
|
+
if (isCancel(selected)) {
|
|
85
|
+
cancel("Generation cancelled.");
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
return selected.length === drizzleDomains.length ? void 0 : resolveSchemaDomains(selected);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
//#endregion
|
|
92
|
+
//#region src/cli.ts
|
|
93
|
+
const program = new Command();
|
|
94
|
+
const dialects = [
|
|
95
|
+
"pg",
|
|
96
|
+
"mysql",
|
|
97
|
+
"sqlite"
|
|
98
|
+
];
|
|
99
|
+
const modes = ["block", "replace"];
|
|
100
|
+
const green = (value) => process$1.stdout.isTTY ? `\x1b[32m${value}\x1b[0m` : value;
|
|
101
|
+
const dim = (value) => process$1.stdout.isTTY ? `\x1b[2m${value}\x1b[0m` : value;
|
|
102
|
+
const successMark = green("✓");
|
|
103
|
+
function printHeader() {
|
|
104
|
+
console.log(green("BETTER-AGENT"));
|
|
105
|
+
console.log(dim("Drizzle adapter"));
|
|
106
|
+
console.log("");
|
|
107
|
+
}
|
|
108
|
+
function parseDomains(input) {
|
|
109
|
+
if (!input) return;
|
|
110
|
+
const only = input.split(",").map((domain) => domain.trim()).filter(Boolean);
|
|
111
|
+
if (only.some((domain) => !drizzleDomains.includes(domain))) throw new Error(`Unsupported domain list '${input}'.`);
|
|
112
|
+
return resolveSchemaDomains(only);
|
|
113
|
+
}
|
|
114
|
+
function parseDialect(input) {
|
|
115
|
+
if (!dialects.includes(input)) throw new Error(`Unsupported dialect '${input}'.`);
|
|
116
|
+
return input;
|
|
117
|
+
}
|
|
118
|
+
function parseMode(input) {
|
|
119
|
+
if (!modes.includes(input)) throw new Error(`Unsupported mode '${input}'.`);
|
|
120
|
+
return input;
|
|
121
|
+
}
|
|
122
|
+
program.name("better-agent-drizzle").description("Better Agent Drizzle helpers");
|
|
123
|
+
program.command("generate").description("Generate Better Agent Drizzle schema into your project").option("--out <path>", "Drizzle schema file path", "src/db/better-agent.schema.ts").option("--dialect <dialect>", "pg | mysql | sqlite", "pg").option("--mode <mode>", "block | replace", "block").option("--only <domains>", "memory | runs | streams", "").action(async (options) => {
|
|
124
|
+
const only = !options.only && process$1.stdin.isTTY ? await promptDrizzleDomains() : parseDomains(options.only);
|
|
125
|
+
const result = await generateDrizzleSchemaFile({
|
|
126
|
+
out: path.resolve(process$1.cwd(), options.out),
|
|
127
|
+
dialect: parseDialect(options.dialect),
|
|
128
|
+
mode: parseMode(options.mode),
|
|
129
|
+
only
|
|
130
|
+
});
|
|
131
|
+
console.log(`${successMark} updated Better Agent Drizzle schema: ${result.operation} ${result.out}`);
|
|
132
|
+
console.log("");
|
|
133
|
+
});
|
|
134
|
+
printHeader();
|
|
135
|
+
program.parseAsync().catch((error) => {
|
|
136
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
137
|
+
console.error(message);
|
|
138
|
+
process$1.exitCode = 1;
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
//#endregion
|
|
142
|
+
export { };
|
|
143
|
+
//# 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 { renderDrizzleSchema } from \"@farming-labs/orm\";\n\nexport const DRIZZLE_START_MARKER = \"// @better-agent/drizzle:start\";\nexport const DRIZZLE_END_MARKER = \"// @better-agent/drizzle:end\";\n\nexport type DrizzleDialect = \"pg\" | \"mysql\" | \"sqlite\";\nexport type GenerateMode = \"block\" | \"replace\";\n\nexport interface GenerateDrizzleSchemaOptions {\n out: string;\n dialect: DrizzleDialect;\n mode: GenerateMode;\n only?: readonly SchemaDomain[];\n}\n\nexport interface GenerateDrizzleSchemaResult {\n out: string;\n dialect: DrizzleDialect;\n mode: GenerateMode;\n only?: readonly SchemaDomain[];\n operation: \"created\" | \"updated\" | \"replaced\";\n}\n\nexport function upsertManagedDrizzleBlock(existing: string, schema: string): string {\n const block = `${DRIZZLE_START_MARKER}\\n${schema.trim()}\\n${DRIZZLE_END_MARKER}\\n`;\n const start = existing.indexOf(DRIZZLE_START_MARKER);\n const end = existing.indexOf(DRIZZLE_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 + DRIZZLE_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 generateDrizzleSchemaFile(\n options: GenerateDrizzleSchemaOptions,\n): Promise<GenerateDrizzleSchemaResult> {\n const { out, dialect, mode, only } = options;\n const schema = renderDrizzleSchema(selectBetterAgentSchema(only), { dialect });\n const resultBase = {\n out,\n dialect,\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 = upsertManagedDrizzleBlock(existing ?? \"\", 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 drizzleDomains = [\n \"memory\",\n \"runs\",\n \"streams\",\n] as const satisfies readonly SchemaDomain[];\nexport type DrizzleDomain = (typeof drizzleDomains)[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<DrizzleDomain, { label: string; hint: string }>;\n\nexport async function promptDrizzleDomains(): Promise<readonly DrizzleDomain[] | undefined> {\n const selected = await multiselect<DrizzleDomain>({\n message: \"Select schema domains\",\n required: false,\n initialValues: [...drizzleDomains],\n options: drizzleDomains.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 === drizzleDomains.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 DrizzleDialect, type GenerateMode, generateDrizzleSchemaFile } from \"./generate\";\nimport { drizzleDomains, promptDrizzleDomains } from \"./interactive\";\n\nconst program = new Command();\nconst dialects = [\"pg\", \"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(\"Drizzle 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) => !drizzleDomains.includes(domain as SchemaDomain))) {\n throw new Error(`Unsupported domain list '${input}'.`);\n }\n\n return resolveSchemaDomains(only as SchemaDomain[]);\n}\n\nfunction parseDialect(input: string): DrizzleDialect {\n if (!dialects.includes(input as DrizzleDialect)) {\n throw new Error(`Unsupported dialect '${input}'.`);\n }\n\n return input as DrizzleDialect;\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-drizzle\").description(\"Better Agent Drizzle helpers\");\n\nprogram\n .command(\"generate\")\n .description(\"Generate Better Agent Drizzle schema into your project\")\n .option(\"--out <path>\", \"Drizzle schema file path\", \"src/db/better-agent.schema.ts\")\n .option(\"--dialect <dialect>\", \"pg | mysql | sqlite\", \"pg\")\n .option(\"--mode <mode>\", \"block | replace\", \"block\")\n .option(\"--only <domains>\", \"memory | runs | streams\", \"\")\n .action(\n async (options: {\n out: string;\n dialect: DrizzleDialect;\n mode: GenerateMode;\n only?: string;\n }) => {\n const only =\n !options.only && process.stdin.isTTY\n ? await promptDrizzleDomains()\n : parseDomains(options.only);\n const result = await generateDrizzleSchemaFile({\n out: path.resolve(process.cwd(), options.out),\n dialect: parseDialect(options.dialect),\n mode: parseMode(options.mode),\n only,\n });\n\n console.log(\n `${successMark} updated Better Agent Drizzle 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,21 @@
|
|
|
1
|
+
import { AnyModelDefinition, OrmClient, SchemaDefinition } from "@farming-labs/orm";
|
|
2
|
+
import { DrizzleDriverConfig } from "@farming-labs/orm-drizzle";
|
|
3
|
+
import { BetterAgentStorage } from "@better-agent/core";
|
|
4
|
+
|
|
5
|
+
//#region src/types.d.ts
|
|
6
|
+
type DrizzleStorage = BetterAgentStorage;
|
|
7
|
+
type BetterAgentDrizzleDriverConfig = DrizzleDriverConfig<SchemaDefinition<any>>;
|
|
8
|
+
type DrizzleDialect = BetterAgentDrizzleDriverConfig["dialect"];
|
|
9
|
+
interface DrizzleOptions {
|
|
10
|
+
db: NonNullable<BetterAgentDrizzleDriverConfig["db"]>;
|
|
11
|
+
dialect: BetterAgentDrizzleDriverConfig["dialect"];
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/orm.d.ts
|
|
15
|
+
declare function createDrizzleOrm<TSchema extends SchemaDefinition<Record<string, AnyModelDefinition>>>(schema: TSchema, options: DrizzleOptions): OrmClient<TSchema>;
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/storage/adapter.d.ts
|
|
18
|
+
declare function drizzleStorage(options: DrizzleOptions): BetterAgentStorage;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { DrizzleDialect, DrizzleOptions, DrizzleStorage, createDrizzleOrm, drizzleStorage };
|
|
21
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/orm.ts","../src/storage/adapter.ts"],"mappings":";;;;;KAIY,cAAA,GAAiB,kBAAA;AAAA,KAGxB,8BAAA,GAAiC,mBAAA,CAAoB,gBAAA;AAAA,KAE9C,cAAA,GAAiB,8BAAA;AAAA,UAEZ,cAAA;EACb,EAAA,EAAI,WAAA,CAAY,8BAAA;EAChB,OAAA,EAAS,8BAAA;AAAA;;;iBCRG,gBAAA,iBACI,gBAAA,CAAiB,MAAA,SAAe,kBAAA,GAAA,CAClD,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,cAAA,GAAiB,SAAA,CAAU,OAAA;;;iBCwGvC,cAAA,CAAe,OAAA,EAAS,cAAA,GAAiB,kBAAA"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { createOrm } from "@farming-labs/orm";
|
|
2
|
+
import { createDrizzleDriver } from "@farming-labs/orm-drizzle";
|
|
3
|
+
import { storageTables, throwUnsupportedStorageTable } from "@better-agent/core";
|
|
4
|
+
import { selectBetterAgentSchema, toBetterAgentOrmListQuery } from "@better-agent/schema";
|
|
5
|
+
|
|
6
|
+
//#region src/orm.ts
|
|
7
|
+
function createDrizzleOrm(schema, options) {
|
|
8
|
+
return createOrm({
|
|
9
|
+
schema,
|
|
10
|
+
driver: createDrizzleDriver({
|
|
11
|
+
db: options.db,
|
|
12
|
+
dialect: options.dialect
|
|
13
|
+
})
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/storage/mappers.ts
|
|
19
|
+
function fromRunRow(row) {
|
|
20
|
+
return {
|
|
21
|
+
runId: row.runId,
|
|
22
|
+
agentName: row.agentName,
|
|
23
|
+
...row.threadId ? { threadId: row.threadId } : {},
|
|
24
|
+
...row.scope ? { scope: row.scope } : {},
|
|
25
|
+
status: row.status,
|
|
26
|
+
...row.abortRequestedAt ? { abortRequestedAt: row.abortRequestedAt.getTime() } : {},
|
|
27
|
+
...row.finalEvent ? { finalEvent: row.finalEvent } : {},
|
|
28
|
+
config: row.config ?? void 0,
|
|
29
|
+
startedAt: row.startedAt.getTime(),
|
|
30
|
+
updatedAt: row.updatedAt.getTime(),
|
|
31
|
+
...row.finishedAt ? { finishedAt: row.finishedAt.getTime() } : {}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function toRunRow(id, record) {
|
|
35
|
+
return {
|
|
36
|
+
runId: record.runId || id,
|
|
37
|
+
agentName: record.agentName,
|
|
38
|
+
threadId: record.threadId ?? null,
|
|
39
|
+
scope: record.scope ?? null,
|
|
40
|
+
status: record.status,
|
|
41
|
+
abortRequestedAt: record.abortRequestedAt === void 0 ? null : new Date(record.abortRequestedAt),
|
|
42
|
+
finalEvent: record.finalEvent ?? null,
|
|
43
|
+
config: record.config ?? null,
|
|
44
|
+
startedAt: new Date(record.startedAt),
|
|
45
|
+
updatedAt: new Date(record.updatedAt),
|
|
46
|
+
finishedAt: record.finishedAt === void 0 ? null : new Date(record.finishedAt)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function fromThreadRow(row) {
|
|
50
|
+
return {
|
|
51
|
+
id: row.id,
|
|
52
|
+
agentName: row.agentName ?? "",
|
|
53
|
+
...row.scope ? { scope: row.scope } : {},
|
|
54
|
+
...row.title ? { title: row.title } : {},
|
|
55
|
+
...row.state !== null ? { state: row.state } : {},
|
|
56
|
+
...row.metadata && typeof row.metadata === "object" && !Array.isArray(row.metadata) ? { metadata: row.metadata } : {},
|
|
57
|
+
createdAt: row.createdAt.getTime(),
|
|
58
|
+
updatedAt: row.updatedAt.getTime()
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function toThreadRow(id, record) {
|
|
62
|
+
return {
|
|
63
|
+
id: record.id || id,
|
|
64
|
+
agentName: record.agentName,
|
|
65
|
+
scope: record.scope ?? null,
|
|
66
|
+
title: record.title ?? null,
|
|
67
|
+
state: record.state ?? null,
|
|
68
|
+
metadata: record.metadata ?? null,
|
|
69
|
+
createdAt: new Date(record.createdAt),
|
|
70
|
+
updatedAt: new Date(record.updatedAt)
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function fromMessageRow(row) {
|
|
74
|
+
return {
|
|
75
|
+
...row.message,
|
|
76
|
+
threadId: row.threadId,
|
|
77
|
+
...row.runId ? { runId: row.runId } : {},
|
|
78
|
+
createdAt: row.createdAt.getTime()
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function toMessageRow(id, record) {
|
|
82
|
+
const { threadId, runId, createdAt, ...message } = record;
|
|
83
|
+
return {
|
|
84
|
+
id,
|
|
85
|
+
threadId,
|
|
86
|
+
runId: runId ?? null,
|
|
87
|
+
message,
|
|
88
|
+
createdAt: new Date(createdAt)
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function fromStreamRow(row) {
|
|
92
|
+
return {
|
|
93
|
+
runId: row.runId,
|
|
94
|
+
status: row.status,
|
|
95
|
+
createdAt: row.createdAt.getTime(),
|
|
96
|
+
updatedAt: row.updatedAt.getTime(),
|
|
97
|
+
...row.closedAt ? { closedAt: row.closedAt.getTime() } : {}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function toStreamRow(id, record) {
|
|
101
|
+
return {
|
|
102
|
+
id,
|
|
103
|
+
runId: record.runId,
|
|
104
|
+
status: record.status,
|
|
105
|
+
createdAt: new Date(record.createdAt),
|
|
106
|
+
updatedAt: new Date(record.updatedAt),
|
|
107
|
+
closedAt: record.closedAt === void 0 ? null : new Date(record.closedAt)
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function fromStreamEventRow(row) {
|
|
111
|
+
return {
|
|
112
|
+
id: row.id,
|
|
113
|
+
runId: row.runId,
|
|
114
|
+
seq: row.seq,
|
|
115
|
+
timestamp: row.timestamp.getTime(),
|
|
116
|
+
event: row.event
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function toStreamEventRow(id, record) {
|
|
120
|
+
return {
|
|
121
|
+
id: record.id || id,
|
|
122
|
+
runId: record.runId,
|
|
123
|
+
seq: record.seq,
|
|
124
|
+
timestamp: new Date(record.timestamp),
|
|
125
|
+
event: record.event
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
//#endregion
|
|
130
|
+
//#region src/storage/adapter.ts
|
|
131
|
+
const drizzleSchema = selectBetterAgentSchema();
|
|
132
|
+
async function upsertRow(input) {
|
|
133
|
+
const where = { [input.keyField]: input.id };
|
|
134
|
+
if (!await input.model.findUnique({ where })) {
|
|
135
|
+
await input.model.upsert({
|
|
136
|
+
where,
|
|
137
|
+
create: input.row,
|
|
138
|
+
update: input.row
|
|
139
|
+
});
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
await input.model.update({
|
|
143
|
+
where,
|
|
144
|
+
data: input.row
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function createTableAdapter(input) {
|
|
148
|
+
return {
|
|
149
|
+
async get(id) {
|
|
150
|
+
const row = await input.model.findUnique({ where: { [input.keyField]: id } });
|
|
151
|
+
return row ? input.fromRow(row) : void 0;
|
|
152
|
+
},
|
|
153
|
+
async set(id, value) {
|
|
154
|
+
await upsertRow({
|
|
155
|
+
model: input.model,
|
|
156
|
+
keyField: input.keyField,
|
|
157
|
+
id,
|
|
158
|
+
row: input.toRow(id, value)
|
|
159
|
+
});
|
|
160
|
+
},
|
|
161
|
+
async delete(id) {
|
|
162
|
+
await input.model.deleteMany({ where: { [input.keyField]: id } });
|
|
163
|
+
},
|
|
164
|
+
async list(query) {
|
|
165
|
+
return { items: (await input.model.findMany(toBetterAgentOrmListQuery(query))).map(input.fromRow) };
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function resolveAdapter(adapters, table) {
|
|
170
|
+
return adapters.get(table) ?? throwUnsupportedStorageTable(table, "drizzle storage");
|
|
171
|
+
}
|
|
172
|
+
function requireModel(orm, modelName) {
|
|
173
|
+
return orm[modelName];
|
|
174
|
+
}
|
|
175
|
+
function drizzleStorage(options) {
|
|
176
|
+
const orm = createDrizzleOrm(drizzleSchema, options);
|
|
177
|
+
const adapters = /* @__PURE__ */ new Map();
|
|
178
|
+
const runModel = requireModel(orm, "run");
|
|
179
|
+
if (runModel) adapters.set(storageTables.runs, createTableAdapter({
|
|
180
|
+
model: runModel,
|
|
181
|
+
keyField: "runId",
|
|
182
|
+
fromRow: fromRunRow,
|
|
183
|
+
toRow: toRunRow
|
|
184
|
+
}));
|
|
185
|
+
const threadModel = requireModel(orm, "thread");
|
|
186
|
+
if (threadModel) adapters.set(storageTables.memoryThreads, createTableAdapter({
|
|
187
|
+
model: threadModel,
|
|
188
|
+
keyField: "id",
|
|
189
|
+
fromRow: fromThreadRow,
|
|
190
|
+
toRow: toThreadRow
|
|
191
|
+
}));
|
|
192
|
+
const messageModel = requireModel(orm, "message");
|
|
193
|
+
if (messageModel) adapters.set(storageTables.memoryMessages, createTableAdapter({
|
|
194
|
+
model: messageModel,
|
|
195
|
+
keyField: "id",
|
|
196
|
+
fromRow: fromMessageRow,
|
|
197
|
+
toRow: toMessageRow
|
|
198
|
+
}));
|
|
199
|
+
const streamModel = requireModel(orm, "stream");
|
|
200
|
+
if (streamModel) adapters.set(storageTables.streams, createTableAdapter({
|
|
201
|
+
model: streamModel,
|
|
202
|
+
keyField: "id",
|
|
203
|
+
fromRow: fromStreamRow,
|
|
204
|
+
toRow: toStreamRow
|
|
205
|
+
}));
|
|
206
|
+
const streamEventModel = requireModel(orm, "streamEvent");
|
|
207
|
+
if (streamEventModel) adapters.set(storageTables.streamEvents, createTableAdapter({
|
|
208
|
+
model: streamEventModel,
|
|
209
|
+
keyField: "id",
|
|
210
|
+
fromRow: fromStreamEventRow,
|
|
211
|
+
toRow: toStreamEventRow
|
|
212
|
+
}));
|
|
213
|
+
return {
|
|
214
|
+
get(table, id) {
|
|
215
|
+
return resolveAdapter(adapters, table).get(id);
|
|
216
|
+
},
|
|
217
|
+
set(table, id, value) {
|
|
218
|
+
return resolveAdapter(adapters, table).set(id, value);
|
|
219
|
+
},
|
|
220
|
+
delete(table, id) {
|
|
221
|
+
return resolveAdapter(adapters, table).delete(id);
|
|
222
|
+
},
|
|
223
|
+
list(table, query) {
|
|
224
|
+
return resolveAdapter(adapters, table).list(query);
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
//#endregion
|
|
230
|
+
export { createDrizzleOrm, drizzleStorage };
|
|
231
|
+
//# 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 { createDrizzleDriver } from \"@farming-labs/orm-drizzle\";\nimport type { DrizzleOptions } from \"./types\";\n\nexport function createDrizzleOrm<\n TSchema extends SchemaDefinition<Record<string, AnyModelDefinition>>,\n>(schema: TSchema, options: DrizzleOptions): OrmClient<TSchema> {\n return createOrm({\n schema,\n driver: createDrizzleDriver({\n db: options.db,\n dialect: options.dialect,\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 { createDrizzleOrm } from \"../orm\";\nimport type { DrizzleOptions } 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 drizzleSchema = selectBetterAgentSchema();\n\ntype DrizzleSchema = typeof drizzleSchema;\ntype DrizzleModelName = ModelName<DrizzleSchema>;\ntype DrizzleOrm = OrmClient<DrizzleSchema>;\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 DrizzleModelName, TRow>(input: {\n model: ModelClient<DrizzleSchema, 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 DrizzleModelName, TRecord, TRow>(input: {\n model: ModelClient<DrizzleSchema, 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, \"drizzle storage\");\n}\n\nfunction requireModel<TModelName extends DrizzleModelName>(\n orm: DrizzleOrm,\n modelName: TModelName,\n): ModelClient<DrizzleSchema, TModelName> | undefined {\n return orm[modelName];\n}\n\nexport function drizzleStorage(options: DrizzleOptions): BetterAgentStorage {\n const orm = createDrizzleOrm(drizzleSchema, options) as DrizzleOrm;\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/drizzle",
|
|
3
|
+
"version": "0.2.0-beta.1",
|
|
4
|
+
"description": "Better Agent Drizzle adapter",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/better-agent/better-agent.git",
|
|
9
|
+
"directory": "packages/drizzle"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/better-agent/better-agent/tree/main/packages/drizzle",
|
|
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-drizzle": "./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-drizzle": "^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
|
+
"drizzle-orm": "*"
|
|
59
|
+
},
|
|
60
|
+
"peerDependencies": {
|
|
61
|
+
"@better-agent/core": "0.2.0-beta.1",
|
|
62
|
+
"drizzle-orm": "*"
|
|
63
|
+
}
|
|
64
|
+
}
|