@dudousxd/nestjs-agent-store-drizzle 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,11 +1,11 @@
1
1
  import * as drizzle_orm_sqlite_core from 'drizzle-orm/sqlite-core';
2
2
  import { BaseSQLiteDatabase } from 'drizzle-orm/sqlite-core';
3
- import { MessageRole, ToolCallRequest, ToolResult, MessageUsage, ToolKind, ToolCallStatus, UsagePurpose, AgentStore, CreateThreadInput, ThreadSummary, ThreadDetail, AppendMessageInput, StoredMessage, RecordToolCallInput, UpdateToolCallInput, RecordUsageInput, AgentGovernanceQueries, AgentPricingStore, GovernanceRange, ModelSpendRow, ActorSpendRow, ThreadSpendRow, UsageTrendPoint, ToolCallActivityRow, ThreadActivityRow, ModelPriceInput, CurrentModelPrice } from '@dudousxd/nestjs-agent-core';
3
+ import { MessageRole, ToolCallRequest, ToolResult, MessageUsage, ToolKind, ToolCallStatus, UsagePurpose, AgentStore, CreateThreadInput, ThreadSummary, ThreadDetail, AppendMessageInput, StoredMessage, RecordToolCallInput, UpdateToolCallInput, RecordUsageInput, AgentGovernanceQueries, AgentPricingStore, GovernanceRange, ModelSpendRow, ActorSpendRow, ThreadSpendRow, UsageTrendPoint, ToolCallActivityRow, ThreadActivityRow, RunMetrics, RunAgentBreakdownRow, RunErrorBreakdownRow, RunTrendPoint, RecentRunRow, ModelPriceInput, CurrentModelPrice } from '@dudousxd/nestjs-agent-core';
4
4
  import { Type, DynamicModule } from '@nestjs/common';
5
5
 
6
6
  /**
7
7
  * Drizzle schema mirroring the MikroORM agent entities (same logical columns/relations):
8
- * threads, messages, tool calls, token usage and model pricing. Targets the SQLite core so the
8
+ * threads, messages, tool calls, token usage, model pricing and run outcomes. Targets the SQLite core so the
9
9
  * db-test runs on an in-memory better-sqlite3; timestamps are stored as integer epoch-ms columns
10
10
  * (`{ mode: 'timestamp_ms' }`) which Drizzle round-trips to/from JS `Date`, and the model-facing
11
11
  * message extras (tool calls/results, follow-ups, usage) live in JSON `text` columns.
@@ -987,7 +987,226 @@ declare const agentModelPricing: drizzle_orm_sqlite_core.SQLiteTableWithColumns<
987
987
  };
988
988
  dialect: "sqlite";
989
989
  }>;
990
- /** The five agent tables as one schema object, ready for `drizzle(client, { schema })`. */
990
+ /** A run's lifecycle status. Not part of the core SPI (that surfaces `string`) — internal only. */
991
+ type AgentRunStatus = 'running' | 'completed' | 'failed';
992
+ /**
993
+ * One recorded run (turn) outcome — the durable half of what `aviary:agent:*` diagnostics report
994
+ * ephemerally. Written by {@link import('./drizzle-agent-store.js').DrizzleAgentStore.recordRunStart}/
995
+ * `recordRunEnd`/`bumpRunRetries`, read by
996
+ * {@link import('./drizzle-governance-queries.js').DrizzleGovernanceQueries} for the reliability
997
+ * surfaces (success rate, error breakdown, duration percentiles, trend, recent runs). `threadId`
998
+ * cascades on delete, like `agent_message`/`agent_token_usage`.
999
+ */
1000
+ declare const agentRun: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1001
+ name: "agent_run";
1002
+ schema: undefined;
1003
+ columns: {
1004
+ id: drizzle_orm_sqlite_core.SQLiteColumn<{
1005
+ name: "id";
1006
+ tableName: "agent_run";
1007
+ dataType: "string";
1008
+ columnType: "SQLiteText";
1009
+ data: string;
1010
+ driverParam: string;
1011
+ notNull: true;
1012
+ hasDefault: false;
1013
+ isPrimaryKey: true;
1014
+ isAutoincrement: false;
1015
+ hasRuntimeDefault: false;
1016
+ enumValues: [string, ...string[]];
1017
+ baseColumn: never;
1018
+ identity: undefined;
1019
+ generated: undefined;
1020
+ }, {}, {
1021
+ length: number | undefined;
1022
+ }>;
1023
+ threadId: drizzle_orm_sqlite_core.SQLiteColumn<{
1024
+ name: "thread_id";
1025
+ tableName: "agent_run";
1026
+ dataType: "string";
1027
+ columnType: "SQLiteText";
1028
+ data: string;
1029
+ driverParam: string;
1030
+ notNull: true;
1031
+ hasDefault: false;
1032
+ isPrimaryKey: false;
1033
+ isAutoincrement: false;
1034
+ hasRuntimeDefault: false;
1035
+ enumValues: [string, ...string[]];
1036
+ baseColumn: never;
1037
+ identity: undefined;
1038
+ generated: undefined;
1039
+ }, {}, {
1040
+ length: number | undefined;
1041
+ }>;
1042
+ actorRef: drizzle_orm_sqlite_core.SQLiteColumn<{
1043
+ name: "actor_ref";
1044
+ tableName: "agent_run";
1045
+ dataType: "string";
1046
+ columnType: "SQLiteText";
1047
+ data: string;
1048
+ driverParam: string;
1049
+ notNull: true;
1050
+ hasDefault: false;
1051
+ isPrimaryKey: false;
1052
+ isAutoincrement: false;
1053
+ hasRuntimeDefault: false;
1054
+ enumValues: [string, ...string[]];
1055
+ baseColumn: never;
1056
+ identity: undefined;
1057
+ generated: undefined;
1058
+ }, {}, {
1059
+ length: number | undefined;
1060
+ }>;
1061
+ agentName: drizzle_orm_sqlite_core.SQLiteColumn<{
1062
+ name: "agent_name";
1063
+ tableName: "agent_run";
1064
+ dataType: "string";
1065
+ columnType: "SQLiteText";
1066
+ data: string;
1067
+ driverParam: string;
1068
+ notNull: false;
1069
+ hasDefault: false;
1070
+ isPrimaryKey: false;
1071
+ isAutoincrement: false;
1072
+ hasRuntimeDefault: false;
1073
+ enumValues: [string, ...string[]];
1074
+ baseColumn: never;
1075
+ identity: undefined;
1076
+ generated: undefined;
1077
+ }, {}, {
1078
+ length: number | undefined;
1079
+ }>;
1080
+ status: drizzle_orm_sqlite_core.SQLiteColumn<{
1081
+ name: "status";
1082
+ tableName: "agent_run";
1083
+ dataType: "string";
1084
+ columnType: "SQLiteText";
1085
+ data: AgentRunStatus;
1086
+ driverParam: string;
1087
+ notNull: true;
1088
+ hasDefault: false;
1089
+ isPrimaryKey: false;
1090
+ isAutoincrement: false;
1091
+ hasRuntimeDefault: false;
1092
+ enumValues: [string, ...string[]];
1093
+ baseColumn: never;
1094
+ identity: undefined;
1095
+ generated: undefined;
1096
+ }, {}, {
1097
+ length: number | undefined;
1098
+ $type: AgentRunStatus;
1099
+ }>;
1100
+ durationMs: drizzle_orm_sqlite_core.SQLiteColumn<{
1101
+ name: "duration_ms";
1102
+ tableName: "agent_run";
1103
+ dataType: "number";
1104
+ columnType: "SQLiteInteger";
1105
+ data: number;
1106
+ driverParam: number;
1107
+ notNull: false;
1108
+ hasDefault: false;
1109
+ isPrimaryKey: false;
1110
+ isAutoincrement: false;
1111
+ hasRuntimeDefault: false;
1112
+ enumValues: undefined;
1113
+ baseColumn: never;
1114
+ identity: undefined;
1115
+ generated: undefined;
1116
+ }, {}, {}>;
1117
+ errorCode: drizzle_orm_sqlite_core.SQLiteColumn<{
1118
+ name: "error_code";
1119
+ tableName: "agent_run";
1120
+ dataType: "string";
1121
+ columnType: "SQLiteText";
1122
+ data: string;
1123
+ driverParam: string;
1124
+ notNull: false;
1125
+ hasDefault: false;
1126
+ isPrimaryKey: false;
1127
+ isAutoincrement: false;
1128
+ hasRuntimeDefault: false;
1129
+ enumValues: [string, ...string[]];
1130
+ baseColumn: never;
1131
+ identity: undefined;
1132
+ generated: undefined;
1133
+ }, {}, {
1134
+ length: number | undefined;
1135
+ }>;
1136
+ errorMessage: drizzle_orm_sqlite_core.SQLiteColumn<{
1137
+ name: "error_message";
1138
+ tableName: "agent_run";
1139
+ dataType: "string";
1140
+ columnType: "SQLiteText";
1141
+ data: string;
1142
+ driverParam: string;
1143
+ notNull: false;
1144
+ hasDefault: false;
1145
+ isPrimaryKey: false;
1146
+ isAutoincrement: false;
1147
+ hasRuntimeDefault: false;
1148
+ enumValues: [string, ...string[]];
1149
+ baseColumn: never;
1150
+ identity: undefined;
1151
+ generated: undefined;
1152
+ }, {}, {
1153
+ length: number | undefined;
1154
+ }>;
1155
+ retries: drizzle_orm_sqlite_core.SQLiteColumn<{
1156
+ name: "retries";
1157
+ tableName: "agent_run";
1158
+ dataType: "number";
1159
+ columnType: "SQLiteInteger";
1160
+ data: number;
1161
+ driverParam: number;
1162
+ notNull: true;
1163
+ hasDefault: true;
1164
+ isPrimaryKey: false;
1165
+ isAutoincrement: false;
1166
+ hasRuntimeDefault: false;
1167
+ enumValues: undefined;
1168
+ baseColumn: never;
1169
+ identity: undefined;
1170
+ generated: undefined;
1171
+ }, {}, {}>;
1172
+ startedAt: drizzle_orm_sqlite_core.SQLiteColumn<{
1173
+ name: "started_at";
1174
+ tableName: "agent_run";
1175
+ dataType: "date";
1176
+ columnType: "SQLiteTimestamp";
1177
+ data: Date;
1178
+ driverParam: number;
1179
+ notNull: true;
1180
+ hasDefault: false;
1181
+ isPrimaryKey: false;
1182
+ isAutoincrement: false;
1183
+ hasRuntimeDefault: false;
1184
+ enumValues: undefined;
1185
+ baseColumn: never;
1186
+ identity: undefined;
1187
+ generated: undefined;
1188
+ }, {}, {}>;
1189
+ settledAt: drizzle_orm_sqlite_core.SQLiteColumn<{
1190
+ name: "settled_at";
1191
+ tableName: "agent_run";
1192
+ dataType: "date";
1193
+ columnType: "SQLiteTimestamp";
1194
+ data: Date;
1195
+ driverParam: number;
1196
+ notNull: false;
1197
+ hasDefault: false;
1198
+ isPrimaryKey: false;
1199
+ isAutoincrement: false;
1200
+ hasRuntimeDefault: false;
1201
+ enumValues: undefined;
1202
+ baseColumn: never;
1203
+ identity: undefined;
1204
+ generated: undefined;
1205
+ }, {}, {}>;
1206
+ };
1207
+ dialect: "sqlite";
1208
+ }>;
1209
+ /** The six agent tables as one schema object, ready for `drizzle(client, { schema })`. */
991
1210
  declare const agentSchema: {
992
1211
  agentThread: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
993
1212
  name: "agent_thread";
@@ -1953,6 +2172,215 @@ declare const agentSchema: {
1953
2172
  };
1954
2173
  dialect: "sqlite";
1955
2174
  }>;
2175
+ agentRun: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
2176
+ name: "agent_run";
2177
+ schema: undefined;
2178
+ columns: {
2179
+ id: drizzle_orm_sqlite_core.SQLiteColumn<{
2180
+ name: "id";
2181
+ tableName: "agent_run";
2182
+ dataType: "string";
2183
+ columnType: "SQLiteText";
2184
+ data: string;
2185
+ driverParam: string;
2186
+ notNull: true;
2187
+ hasDefault: false;
2188
+ isPrimaryKey: true;
2189
+ isAutoincrement: false;
2190
+ hasRuntimeDefault: false;
2191
+ enumValues: [string, ...string[]];
2192
+ baseColumn: never;
2193
+ identity: undefined;
2194
+ generated: undefined;
2195
+ }, {}, {
2196
+ length: number | undefined;
2197
+ }>;
2198
+ threadId: drizzle_orm_sqlite_core.SQLiteColumn<{
2199
+ name: "thread_id";
2200
+ tableName: "agent_run";
2201
+ dataType: "string";
2202
+ columnType: "SQLiteText";
2203
+ data: string;
2204
+ driverParam: string;
2205
+ notNull: true;
2206
+ hasDefault: false;
2207
+ isPrimaryKey: false;
2208
+ isAutoincrement: false;
2209
+ hasRuntimeDefault: false;
2210
+ enumValues: [string, ...string[]];
2211
+ baseColumn: never;
2212
+ identity: undefined;
2213
+ generated: undefined;
2214
+ }, {}, {
2215
+ length: number | undefined;
2216
+ }>;
2217
+ actorRef: drizzle_orm_sqlite_core.SQLiteColumn<{
2218
+ name: "actor_ref";
2219
+ tableName: "agent_run";
2220
+ dataType: "string";
2221
+ columnType: "SQLiteText";
2222
+ data: string;
2223
+ driverParam: string;
2224
+ notNull: true;
2225
+ hasDefault: false;
2226
+ isPrimaryKey: false;
2227
+ isAutoincrement: false;
2228
+ hasRuntimeDefault: false;
2229
+ enumValues: [string, ...string[]];
2230
+ baseColumn: never;
2231
+ identity: undefined;
2232
+ generated: undefined;
2233
+ }, {}, {
2234
+ length: number | undefined;
2235
+ }>;
2236
+ agentName: drizzle_orm_sqlite_core.SQLiteColumn<{
2237
+ name: "agent_name";
2238
+ tableName: "agent_run";
2239
+ dataType: "string";
2240
+ columnType: "SQLiteText";
2241
+ data: string;
2242
+ driverParam: string;
2243
+ notNull: false;
2244
+ hasDefault: false;
2245
+ isPrimaryKey: false;
2246
+ isAutoincrement: false;
2247
+ hasRuntimeDefault: false;
2248
+ enumValues: [string, ...string[]];
2249
+ baseColumn: never;
2250
+ identity: undefined;
2251
+ generated: undefined;
2252
+ }, {}, {
2253
+ length: number | undefined;
2254
+ }>;
2255
+ status: drizzle_orm_sqlite_core.SQLiteColumn<{
2256
+ name: "status";
2257
+ tableName: "agent_run";
2258
+ dataType: "string";
2259
+ columnType: "SQLiteText";
2260
+ data: AgentRunStatus;
2261
+ driverParam: string;
2262
+ notNull: true;
2263
+ hasDefault: false;
2264
+ isPrimaryKey: false;
2265
+ isAutoincrement: false;
2266
+ hasRuntimeDefault: false;
2267
+ enumValues: [string, ...string[]];
2268
+ baseColumn: never;
2269
+ identity: undefined;
2270
+ generated: undefined;
2271
+ }, {}, {
2272
+ length: number | undefined;
2273
+ $type: AgentRunStatus;
2274
+ }>;
2275
+ durationMs: drizzle_orm_sqlite_core.SQLiteColumn<{
2276
+ name: "duration_ms";
2277
+ tableName: "agent_run";
2278
+ dataType: "number";
2279
+ columnType: "SQLiteInteger";
2280
+ data: number;
2281
+ driverParam: number;
2282
+ notNull: false;
2283
+ hasDefault: false;
2284
+ isPrimaryKey: false;
2285
+ isAutoincrement: false;
2286
+ hasRuntimeDefault: false;
2287
+ enumValues: undefined;
2288
+ baseColumn: never;
2289
+ identity: undefined;
2290
+ generated: undefined;
2291
+ }, {}, {}>;
2292
+ errorCode: drizzle_orm_sqlite_core.SQLiteColumn<{
2293
+ name: "error_code";
2294
+ tableName: "agent_run";
2295
+ dataType: "string";
2296
+ columnType: "SQLiteText";
2297
+ data: string;
2298
+ driverParam: string;
2299
+ notNull: false;
2300
+ hasDefault: false;
2301
+ isPrimaryKey: false;
2302
+ isAutoincrement: false;
2303
+ hasRuntimeDefault: false;
2304
+ enumValues: [string, ...string[]];
2305
+ baseColumn: never;
2306
+ identity: undefined;
2307
+ generated: undefined;
2308
+ }, {}, {
2309
+ length: number | undefined;
2310
+ }>;
2311
+ errorMessage: drizzle_orm_sqlite_core.SQLiteColumn<{
2312
+ name: "error_message";
2313
+ tableName: "agent_run";
2314
+ dataType: "string";
2315
+ columnType: "SQLiteText";
2316
+ data: string;
2317
+ driverParam: string;
2318
+ notNull: false;
2319
+ hasDefault: false;
2320
+ isPrimaryKey: false;
2321
+ isAutoincrement: false;
2322
+ hasRuntimeDefault: false;
2323
+ enumValues: [string, ...string[]];
2324
+ baseColumn: never;
2325
+ identity: undefined;
2326
+ generated: undefined;
2327
+ }, {}, {
2328
+ length: number | undefined;
2329
+ }>;
2330
+ retries: drizzle_orm_sqlite_core.SQLiteColumn<{
2331
+ name: "retries";
2332
+ tableName: "agent_run";
2333
+ dataType: "number";
2334
+ columnType: "SQLiteInteger";
2335
+ data: number;
2336
+ driverParam: number;
2337
+ notNull: true;
2338
+ hasDefault: true;
2339
+ isPrimaryKey: false;
2340
+ isAutoincrement: false;
2341
+ hasRuntimeDefault: false;
2342
+ enumValues: undefined;
2343
+ baseColumn: never;
2344
+ identity: undefined;
2345
+ generated: undefined;
2346
+ }, {}, {}>;
2347
+ startedAt: drizzle_orm_sqlite_core.SQLiteColumn<{
2348
+ name: "started_at";
2349
+ tableName: "agent_run";
2350
+ dataType: "date";
2351
+ columnType: "SQLiteTimestamp";
2352
+ data: Date;
2353
+ driverParam: number;
2354
+ notNull: true;
2355
+ hasDefault: false;
2356
+ isPrimaryKey: false;
2357
+ isAutoincrement: false;
2358
+ hasRuntimeDefault: false;
2359
+ enumValues: undefined;
2360
+ baseColumn: never;
2361
+ identity: undefined;
2362
+ generated: undefined;
2363
+ }, {}, {}>;
2364
+ settledAt: drizzle_orm_sqlite_core.SQLiteColumn<{
2365
+ name: "settled_at";
2366
+ tableName: "agent_run";
2367
+ dataType: "date";
2368
+ columnType: "SQLiteTimestamp";
2369
+ data: Date;
2370
+ driverParam: number;
2371
+ notNull: false;
2372
+ hasDefault: false;
2373
+ isPrimaryKey: false;
2374
+ isAutoincrement: false;
2375
+ hasRuntimeDefault: false;
2376
+ enumValues: undefined;
2377
+ baseColumn: never;
2378
+ identity: undefined;
2379
+ generated: undefined;
2380
+ }, {}, {}>;
2381
+ };
2382
+ dialect: "sqlite";
2383
+ }>;
1956
2384
  };
1957
2385
  /**
1958
2386
  * The dialect-portable Drizzle SQLite database handle the store operates on. Accepts any SQLite
@@ -1964,6 +2392,8 @@ type AgentDrizzleDb = BaseSQLiteDatabase<'sync' | 'async', unknown>;
1964
2392
  type AgentThreadRow = typeof agentThread.$inferSelect;
1965
2393
  /** A persisted message row as Drizzle selects it. */
1966
2394
  type AgentMessageRow = typeof agentMessage.$inferSelect;
2395
+ /** A persisted run row as Drizzle selects it. */
2396
+ type AgentRunRow = typeof agentRun.$inferSelect;
1967
2397
 
1968
2398
  /** Runs the `CREATE TABLE IF NOT EXISTS` DDL above against the supplied Drizzle SQLite db. */
1969
2399
  declare function ensureAgentSchema(db: AgentDrizzleDb): Promise<void>;
@@ -1989,6 +2419,23 @@ declare class DrizzleAgentStore implements AgentStore {
1989
2419
  setTitle(threadId: string, title: string): Promise<void>;
1990
2420
  promoteThread(threadId: string): Promise<void>;
1991
2421
  setActiveStream(threadId: string, runId: string | null): Promise<void>;
2422
+ /** Persist the start of a run (turn). Replay-safe: called under a durable localStep. */
2423
+ recordRunStart(run: {
2424
+ runId: string;
2425
+ threadId: string;
2426
+ actorRef: string;
2427
+ agentName?: string;
2428
+ }): Promise<void>;
2429
+ /** Settle a run's outcome. A no-op when the run is unknown (mirrors `setTitle`/`updateThread`). */
2430
+ recordRunEnd(end: {
2431
+ runId: string;
2432
+ status: 'completed' | 'failed';
2433
+ durationMs?: number;
2434
+ errorCode?: string;
2435
+ errorMessage?: string;
2436
+ }): Promise<void>;
2437
+ /** Bump the run's llm-step retry counter. Atomic `retries = retries + 1`, no read-modify-write. */
2438
+ bumpRunRetries(runId: string): Promise<void>;
1992
2439
  appendMessage(input: AppendMessageInput): Promise<StoredMessage>;
1993
2440
  truncateFrom(threadId: string, messageId: string): Promise<void>;
1994
2441
  recordToolCall(input: RecordToolCallInput): Promise<void>;
@@ -2027,6 +2474,12 @@ declare class DrizzleGovernanceQueries implements AgentGovernanceQueries {
2027
2474
  usageTrend(range: GovernanceRange): Promise<UsageTrendPoint[]>;
2028
2475
  recentToolCalls(limit: number): Promise<ToolCallActivityRow[]>;
2029
2476
  recentThreads(limit: number): Promise<ThreadActivityRow[]>;
2477
+ private runsInRange;
2478
+ runMetrics(range: GovernanceRange): Promise<RunMetrics>;
2479
+ runsByAgent(range: GovernanceRange): Promise<RunAgentBreakdownRow[]>;
2480
+ runErrors(range: GovernanceRange): Promise<RunErrorBreakdownRow[]>;
2481
+ runTrend(range: GovernanceRange): Promise<RunTrendPoint[]>;
2482
+ recentRuns(limit: number): Promise<RecentRunRow[]>;
2030
2483
  }
2031
2484
 
2032
2485
  /**
@@ -2074,4 +2527,4 @@ declare class DrizzleAgentStoreModule {
2074
2527
  static forRoot(options: DrizzleAgentStoreModuleOptions): DynamicModule;
2075
2528
  }
2076
2529
 
2077
- export { type AgentDrizzleDb, type AgentMessageRow, type AgentThreadRow, DrizzleAgentStore, DrizzleAgentStoreModule, type DrizzleAgentStoreModuleOptions, DrizzleGovernanceQueries, DrizzlePricingStore, agentMessage, agentModelPricing, agentSchema, agentThread, agentTokenUsage, agentToolCall, ensureAgentSchema };
2530
+ export { type AgentDrizzleDb, type AgentMessageRow, type AgentRunRow, type AgentRunStatus, type AgentThreadRow, DrizzleAgentStore, DrizzleAgentStoreModule, type DrizzleAgentStoreModuleOptions, DrizzleGovernanceQueries, DrizzlePricingStore, agentMessage, agentModelPricing, agentRun, agentSchema, agentThread, agentTokenUsage, agentToolCall, ensureAgentSchema };