ai-database 0.0.0-development → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/.turbo/turbo-test.log +102 -0
  3. package/README.md +402 -47
  4. package/TESTING.md +410 -0
  5. package/TEST_SUMMARY.md +250 -0
  6. package/TODO.md +128 -0
  7. package/dist/ai-promise-db.d.ts +370 -0
  8. package/dist/ai-promise-db.d.ts.map +1 -0
  9. package/dist/ai-promise-db.js +839 -0
  10. package/dist/ai-promise-db.js.map +1 -0
  11. package/dist/authorization.d.ts +531 -0
  12. package/dist/authorization.d.ts.map +1 -0
  13. package/dist/authorization.js +632 -0
  14. package/dist/authorization.js.map +1 -0
  15. package/dist/durable-clickhouse.d.ts +193 -0
  16. package/dist/durable-clickhouse.d.ts.map +1 -0
  17. package/dist/durable-clickhouse.js +422 -0
  18. package/dist/durable-clickhouse.js.map +1 -0
  19. package/dist/durable-promise.d.ts +182 -0
  20. package/dist/durable-promise.d.ts.map +1 -0
  21. package/dist/durable-promise.js +409 -0
  22. package/dist/durable-promise.js.map +1 -0
  23. package/dist/execution-queue.d.ts +239 -0
  24. package/dist/execution-queue.d.ts.map +1 -0
  25. package/dist/execution-queue.js +400 -0
  26. package/dist/execution-queue.js.map +1 -0
  27. package/dist/index.d.ts +54 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +79 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/linguistic.d.ts +115 -0
  32. package/dist/linguistic.d.ts.map +1 -0
  33. package/dist/linguistic.js +379 -0
  34. package/dist/linguistic.js.map +1 -0
  35. package/dist/memory-provider.d.ts +304 -0
  36. package/dist/memory-provider.d.ts.map +1 -0
  37. package/dist/memory-provider.js +785 -0
  38. package/dist/memory-provider.js.map +1 -0
  39. package/dist/schema.d.ts +899 -0
  40. package/dist/schema.d.ts.map +1 -0
  41. package/dist/schema.js +1165 -0
  42. package/dist/schema.js.map +1 -0
  43. package/dist/tests.d.ts +107 -0
  44. package/dist/tests.d.ts.map +1 -0
  45. package/dist/tests.js +568 -0
  46. package/dist/tests.js.map +1 -0
  47. package/dist/types.d.ts +972 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +126 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +37 -23
  52. package/src/ai-promise-db.ts +1243 -0
  53. package/src/authorization.ts +1102 -0
  54. package/src/durable-clickhouse.ts +596 -0
  55. package/src/durable-promise.ts +582 -0
  56. package/src/execution-queue.ts +608 -0
  57. package/src/index.test.ts +868 -0
  58. package/src/index.ts +337 -0
  59. package/src/linguistic.ts +404 -0
  60. package/src/memory-provider.test.ts +1036 -0
  61. package/src/memory-provider.ts +1119 -0
  62. package/src/schema.test.ts +1254 -0
  63. package/src/schema.ts +2296 -0
  64. package/src/tests.ts +725 -0
  65. package/src/types.ts +1177 -0
  66. package/test/README.md +153 -0
  67. package/test/edge-cases.test.ts +646 -0
  68. package/test/provider-resolution.test.ts +402 -0
  69. package/tsconfig.json +9 -0
  70. package/vitest.config.ts +19 -0
  71. package/LICENSE +0 -21
  72. package/dist/types/database.d.ts +0 -46
  73. package/dist/types/document.d.ts +0 -15
  74. package/dist/types/index.d.ts +0 -5
  75. package/dist/types/mdxdb/embedding.d.ts +0 -7
  76. package/dist/types/mdxdb/types.d.ts +0 -59
  77. package/dist/types/synthetic.d.ts +0 -9
  78. package/dist/types/tools.d.ts +0 -10
  79. package/dist/types/vector.d.ts +0 -16
@@ -0,0 +1,193 @@
1
+ /**
2
+ * ClickHouse-backed Durable Promise Provider
3
+ *
4
+ * Uses @mdxdb/clickhouse as the persistence layer for DurablePromise.
5
+ * Provides full durability, crash recovery, and observability.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import type { ExecutionPriority, DurablePromiseOptions, BatchScheduler } from './durable-promise.js';
10
+ import { DurablePromise } from './durable-promise.js';
11
+ /**
12
+ * ClickHouse action row structure (minimal fields needed)
13
+ */
14
+ interface ActionRow {
15
+ id: string;
16
+ ns: string;
17
+ actor: string;
18
+ act: string;
19
+ action: string;
20
+ activity: string;
21
+ object: string;
22
+ objectData: Record<string, unknown>;
23
+ status: 'pending' | 'active' | 'completed' | 'failed' | 'cancelled';
24
+ progress: number;
25
+ total: number;
26
+ result: Record<string, unknown>;
27
+ error: string;
28
+ data: Record<string, unknown>;
29
+ meta: Record<string, unknown>;
30
+ priority: number;
31
+ batch: string;
32
+ batchIndex: number;
33
+ batchTotal: number;
34
+ dependencies: string[];
35
+ scheduledAt: string | null;
36
+ startedAt: string | null;
37
+ completedAt: string | null;
38
+ createdAt: string;
39
+ updatedAt: string;
40
+ }
41
+ /**
42
+ * Executor interface for ClickHouse operations
43
+ */
44
+ export interface ClickHouseExecutor {
45
+ query<T = unknown>(sql: string): Promise<T[]>;
46
+ command(sql: string): Promise<void>;
47
+ insert<T>(table: string, values: T[]): Promise<void>;
48
+ close(): Promise<void>;
49
+ }
50
+ /**
51
+ * Configuration for the ClickHouse durable provider
52
+ */
53
+ export interface ClickHouseDurableConfig {
54
+ /** ClickHouse executor instance */
55
+ executor: ClickHouseExecutor;
56
+ /** Default namespace for actions */
57
+ namespace?: string;
58
+ /** Concurrency limits by priority tier */
59
+ concurrency?: {
60
+ priority?: number;
61
+ standard?: number;
62
+ flex?: number;
63
+ batch?: number;
64
+ };
65
+ /** Batch window in milliseconds */
66
+ batchWindow?: number;
67
+ /** Maximum batch size before auto-flush */
68
+ maxBatchSize?: number;
69
+ /** Poll interval for checking action status (ms) */
70
+ pollInterval?: number;
71
+ /** Auto-recover pending actions on start */
72
+ autoRecover?: boolean;
73
+ }
74
+ /**
75
+ * ClickHouse-backed provider for durable promises
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * import { createClickHouseDatabase } from '@mdxdb/clickhouse'
80
+ * import { ClickHouseDurableProvider } from 'ai-database'
81
+ *
82
+ * const db = await createClickHouseDatabase({ url: 'http://localhost:8123' })
83
+ * const provider = new ClickHouseDurableProvider({
84
+ * executor: db.getExecutor(),
85
+ * namespace: 'myapp.example.com',
86
+ * })
87
+ *
88
+ * // Use context for automatic persistence
89
+ * await provider.withContext({ priority: 'batch' }, async () => {
90
+ * const result = await ai.generate({ prompt: 'Hello' })
91
+ * })
92
+ *
93
+ * // Flush batched operations
94
+ * await provider.flush()
95
+ * ```
96
+ */
97
+ export declare class ClickHouseDurableProvider implements BatchScheduler {
98
+ private readonly executor;
99
+ private readonly namespace;
100
+ private readonly semaphores;
101
+ private readonly config;
102
+ private readonly batchQueue;
103
+ private batchTimer;
104
+ private pendingCount;
105
+ private activeCount;
106
+ private completedCount;
107
+ private failedCount;
108
+ constructor(config: ClickHouseDurableConfig);
109
+ /**
110
+ * Create an action in ClickHouse
111
+ */
112
+ createAction(options: {
113
+ id: string;
114
+ method: string;
115
+ args?: unknown[];
116
+ priority: ExecutionPriority;
117
+ actor?: string;
118
+ dependsOn?: string[];
119
+ deferUntil?: Date;
120
+ meta?: Record<string, unknown>;
121
+ }): Promise<ActionRow>;
122
+ /**
123
+ * Update action status
124
+ */
125
+ updateAction(id: string, updates: Partial<Pick<ActionRow, 'status' | 'progress' | 'result' | 'error' | 'startedAt' | 'completedAt'>>): Promise<void>;
126
+ /**
127
+ * Get action by ID
128
+ */
129
+ getAction(id: string): Promise<ActionRow | null>;
130
+ /**
131
+ * List actions by status
132
+ */
133
+ listActions(options?: {
134
+ status?: ActionRow['status'] | ActionRow['status'][];
135
+ priority?: ExecutionPriority;
136
+ limit?: number;
137
+ }): Promise<ActionRow[]>;
138
+ /**
139
+ * Add a promise to the batch queue
140
+ */
141
+ enqueue(promise: DurablePromise<unknown>): void;
142
+ /**
143
+ * Get pending count
144
+ */
145
+ get pending(): number;
146
+ /**
147
+ * Flush all pending batch operations
148
+ */
149
+ flush(): Promise<void>;
150
+ private startBatchTimer;
151
+ /**
152
+ * Recover pending/active actions from ClickHouse after crash
153
+ */
154
+ recover(): Promise<number>;
155
+ /**
156
+ * Retry failed actions
157
+ */
158
+ retryFailed(filter?: {
159
+ method?: string;
160
+ since?: Date;
161
+ }): Promise<number>;
162
+ /**
163
+ * Create a DurablePromise with ClickHouse persistence
164
+ */
165
+ createPromise<T>(options: Omit<DurablePromiseOptions<T>, 'provider'>): DurablePromise<T>;
166
+ /**
167
+ * Get current statistics
168
+ */
169
+ getStats(): Promise<{
170
+ pending: number;
171
+ active: number;
172
+ completed: number;
173
+ failed: number;
174
+ byPriority: Record<ExecutionPriority, {
175
+ pending: number;
176
+ active: number;
177
+ completed: number;
178
+ }>;
179
+ batchQueue: number;
180
+ }>;
181
+ private parseVerb;
182
+ private escapeString;
183
+ /**
184
+ * Close the provider
185
+ */
186
+ close(): Promise<void>;
187
+ }
188
+ /**
189
+ * Create a ClickHouse durable provider
190
+ */
191
+ export declare function createClickHouseDurableProvider(config: ClickHouseDurableConfig): ClickHouseDurableProvider;
192
+ export {};
193
+ //# sourceMappingURL=durable-clickhouse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-clickhouse.d.ts","sourceRoot":"","sources":["../src/durable-clickhouse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,422 @@
1
+ /**
2
+ * ClickHouse-backed Durable Promise Provider
3
+ *
4
+ * Uses @mdxdb/clickhouse as the persistence layer for DurablePromise.
5
+ * Provides full durability, crash recovery, and observability.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { DurablePromise, getCurrentContext, setBatchScheduler } from './durable-promise.js';
10
+ import { Semaphore } from './memory-provider.js';
11
+ /**
12
+ * Priority tier to numeric priority mapping
13
+ * Lower number = higher priority
14
+ */
15
+ const PRIORITY_MAP = {
16
+ priority: 1,
17
+ standard: 5,
18
+ flex: 7,
19
+ batch: 9,
20
+ };
21
+ /**
22
+ * Numeric priority to tier mapping
23
+ */
24
+ const PRIORITY_REVERSE = {
25
+ 1: 'priority',
26
+ 5: 'standard',
27
+ 7: 'flex',
28
+ 9: 'batch',
29
+ };
30
+ // =============================================================================
31
+ // ClickHouse Durable Provider
32
+ // =============================================================================
33
+ /**
34
+ * ClickHouse-backed provider for durable promises
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { createClickHouseDatabase } from '@mdxdb/clickhouse'
39
+ * import { ClickHouseDurableProvider } from 'ai-database'
40
+ *
41
+ * const db = await createClickHouseDatabase({ url: 'http://localhost:8123' })
42
+ * const provider = new ClickHouseDurableProvider({
43
+ * executor: db.getExecutor(),
44
+ * namespace: 'myapp.example.com',
45
+ * })
46
+ *
47
+ * // Use context for automatic persistence
48
+ * await provider.withContext({ priority: 'batch' }, async () => {
49
+ * const result = await ai.generate({ prompt: 'Hello' })
50
+ * })
51
+ *
52
+ * // Flush batched operations
53
+ * await provider.flush()
54
+ * ```
55
+ */
56
+ export class ClickHouseDurableProvider {
57
+ executor;
58
+ namespace;
59
+ semaphores;
60
+ config;
61
+ // Batch queue
62
+ batchQueue = new Map();
63
+ batchTimer = null;
64
+ // Tracking
65
+ pendingCount = 0;
66
+ activeCount = 0;
67
+ completedCount = 0;
68
+ failedCount = 0;
69
+ constructor(config) {
70
+ this.executor = config.executor;
71
+ this.namespace = config.namespace ?? 'default';
72
+ this.config = {
73
+ namespace: this.namespace,
74
+ concurrency: {
75
+ priority: config.concurrency?.priority ?? 50,
76
+ standard: config.concurrency?.standard ?? 20,
77
+ flex: config.concurrency?.flex ?? 10,
78
+ batch: config.concurrency?.batch ?? 1000,
79
+ },
80
+ batchWindow: config.batchWindow ?? 60000,
81
+ maxBatchSize: config.maxBatchSize ?? 10000,
82
+ pollInterval: config.pollInterval ?? 1000,
83
+ autoRecover: config.autoRecover ?? true,
84
+ };
85
+ // Initialize semaphores
86
+ this.semaphores = {
87
+ priority: new Semaphore(this.config.concurrency.priority),
88
+ standard: new Semaphore(this.config.concurrency.standard),
89
+ flex: new Semaphore(this.config.concurrency.flex),
90
+ batch: new Semaphore(this.config.concurrency.batch),
91
+ };
92
+ // Register as global batch scheduler
93
+ setBatchScheduler(this);
94
+ // Auto-recover on init
95
+ if (this.config.autoRecover) {
96
+ this.recover().catch(console.error);
97
+ }
98
+ }
99
+ // ===========================================================================
100
+ // Action Creation
101
+ // ===========================================================================
102
+ /**
103
+ * Create an action in ClickHouse
104
+ */
105
+ async createAction(options) {
106
+ const now = new Date().toISOString();
107
+ const verb = this.parseVerb(options.method);
108
+ const action = {
109
+ id: options.id,
110
+ ns: this.namespace,
111
+ actor: options.actor ?? getCurrentContext()?.actor ?? 'system',
112
+ act: verb,
113
+ action: `${verb}s`,
114
+ activity: `${verb}ing`,
115
+ object: options.method,
116
+ objectData: {
117
+ method: options.method,
118
+ args: options.args,
119
+ },
120
+ status: 'pending',
121
+ progress: 0,
122
+ total: 1,
123
+ result: {},
124
+ error: '',
125
+ data: {},
126
+ meta: options.meta ?? {},
127
+ priority: PRIORITY_MAP[options.priority],
128
+ batch: '',
129
+ batchIndex: 0,
130
+ batchTotal: 0,
131
+ dependencies: options.dependsOn ?? [],
132
+ scheduledAt: options.deferUntil?.toISOString() ?? null,
133
+ startedAt: null,
134
+ completedAt: null,
135
+ createdAt: now,
136
+ updatedAt: now,
137
+ };
138
+ await this.executor.insert('Actions', [action]);
139
+ this.pendingCount++;
140
+ return action;
141
+ }
142
+ /**
143
+ * Update action status
144
+ */
145
+ async updateAction(id, updates) {
146
+ const now = new Date().toISOString();
147
+ // Get existing action
148
+ const rows = await this.executor.query(`SELECT * FROM Actions FINAL WHERE id = '${this.escapeString(id)}' AND ns = '${this.namespace}' ORDER BY updatedAt DESC LIMIT 1`);
149
+ if (rows.length === 0) {
150
+ throw new Error(`Action not found: ${id}`);
151
+ }
152
+ const existing = rows[0];
153
+ // Track status changes
154
+ if (updates.status && updates.status !== existing.status) {
155
+ if (existing.status === 'pending')
156
+ this.pendingCount--;
157
+ if (existing.status === 'active')
158
+ this.activeCount--;
159
+ if (updates.status === 'active')
160
+ this.activeCount++;
161
+ if (updates.status === 'completed')
162
+ this.completedCount++;
163
+ if (updates.status === 'failed')
164
+ this.failedCount++;
165
+ }
166
+ // Insert new row with updates (ReplacingMergeTree will handle dedup)
167
+ await this.executor.insert('Actions', [{
168
+ ...existing,
169
+ ...updates,
170
+ updatedAt: now,
171
+ }]);
172
+ }
173
+ /**
174
+ * Get action by ID
175
+ */
176
+ async getAction(id) {
177
+ const rows = await this.executor.query(`SELECT * FROM Actions FINAL WHERE id = '${this.escapeString(id)}' AND ns = '${this.namespace}' ORDER BY updatedAt DESC LIMIT 1`);
178
+ return rows[0] ?? null;
179
+ }
180
+ /**
181
+ * List actions by status
182
+ */
183
+ async listActions(options = {}) {
184
+ const conditions = [`ns = '${this.namespace}'`];
185
+ if (options.status) {
186
+ if (Array.isArray(options.status)) {
187
+ const statuses = options.status.map(s => `'${s}'`).join(', ');
188
+ conditions.push(`status IN (${statuses})`);
189
+ }
190
+ else {
191
+ conditions.push(`status = '${options.status}'`);
192
+ }
193
+ }
194
+ if (options.priority) {
195
+ conditions.push(`priority = ${PRIORITY_MAP[options.priority]}`);
196
+ }
197
+ const limit = options.limit ? `LIMIT ${options.limit}` : '';
198
+ return this.executor.query(`SELECT * FROM Actions FINAL WHERE ${conditions.join(' AND ')} ORDER BY createdAt ASC ${limit}`);
199
+ }
200
+ // ===========================================================================
201
+ // Batch Scheduler Interface
202
+ // ===========================================================================
203
+ /**
204
+ * Add a promise to the batch queue
205
+ */
206
+ enqueue(promise) {
207
+ this.batchQueue.set(promise.actionId, promise);
208
+ this.startBatchTimer();
209
+ if (this.batchQueue.size >= this.config.maxBatchSize) {
210
+ this.flush();
211
+ }
212
+ }
213
+ /**
214
+ * Get pending count
215
+ */
216
+ get pending() {
217
+ return this.batchQueue.size + this.pendingCount;
218
+ }
219
+ /**
220
+ * Flush all pending batch operations
221
+ */
222
+ async flush() {
223
+ if (this.batchTimer) {
224
+ clearTimeout(this.batchTimer);
225
+ this.batchTimer = null;
226
+ }
227
+ const promises = Array.from(this.batchQueue.values());
228
+ this.batchQueue.clear();
229
+ if (promises.length === 0)
230
+ return;
231
+ // Group by method prefix (provider)
232
+ const groups = new Map();
233
+ for (const promise of promises) {
234
+ const provider = promise.method.split('.')[0] ?? 'default';
235
+ const existing = groups.get(provider) ?? [];
236
+ existing.push(promise);
237
+ groups.set(provider, existing);
238
+ }
239
+ // Update batch metadata in ClickHouse
240
+ for (const [provider, batch] of groups) {
241
+ const batchId = crypto.randomUUID();
242
+ for (let i = 0; i < batch.length; i++) {
243
+ await this.executor.insert('Actions', [{
244
+ id: batch[i].actionId,
245
+ ns: this.namespace,
246
+ batch: batchId,
247
+ batchIndex: i,
248
+ batchTotal: batch.length,
249
+ updatedAt: new Date().toISOString(),
250
+ }]);
251
+ }
252
+ console.log(`Batch ${batchId}: ${batch.length} ${provider} operations queued`);
253
+ }
254
+ // Execute non-batch immediately with concurrency control
255
+ await Promise.all(promises.map(async (promise) => {
256
+ await this.semaphores.batch.run(async () => {
257
+ try {
258
+ await promise;
259
+ }
260
+ catch {
261
+ // Error is handled by the promise itself
262
+ }
263
+ });
264
+ }));
265
+ }
266
+ startBatchTimer() {
267
+ if (this.batchTimer)
268
+ return;
269
+ this.batchTimer = setTimeout(async () => {
270
+ this.batchTimer = null;
271
+ await this.flush();
272
+ }, this.config.batchWindow);
273
+ }
274
+ // ===========================================================================
275
+ // Recovery
276
+ // ===========================================================================
277
+ /**
278
+ * Recover pending/active actions from ClickHouse after crash
279
+ */
280
+ async recover() {
281
+ const actions = await this.listActions({
282
+ status: ['pending', 'active'],
283
+ });
284
+ console.log(`Recovering ${actions.length} actions from ClickHouse`);
285
+ let recovered = 0;
286
+ for (const action of actions) {
287
+ // Mark active as failed (we don't know if it completed)
288
+ if (action.status === 'active') {
289
+ await this.updateAction(action.id, {
290
+ status: 'failed',
291
+ error: 'Recovered after crash - execution interrupted',
292
+ completedAt: new Date().toISOString(),
293
+ });
294
+ recovered++;
295
+ }
296
+ // Pending actions can be retried
297
+ else if (action.status === 'pending') {
298
+ this.pendingCount++;
299
+ }
300
+ }
301
+ return recovered;
302
+ }
303
+ /**
304
+ * Retry failed actions
305
+ */
306
+ async retryFailed(filter) {
307
+ const conditions = [
308
+ `ns = '${this.namespace}'`,
309
+ `status = 'failed'`,
310
+ ];
311
+ if (filter?.method) {
312
+ conditions.push(`object = '${this.escapeString(filter.method)}'`);
313
+ }
314
+ if (filter?.since) {
315
+ conditions.push(`completedAt > '${filter.since.toISOString()}'`);
316
+ }
317
+ const failed = await this.executor.query(`SELECT * FROM Actions FINAL WHERE ${conditions.join(' AND ')}`);
318
+ for (const action of failed) {
319
+ await this.updateAction(action.id, {
320
+ status: 'pending',
321
+ error: '',
322
+ completedAt: null,
323
+ });
324
+ }
325
+ return failed.length;
326
+ }
327
+ // ===========================================================================
328
+ // Context
329
+ // ===========================================================================
330
+ /**
331
+ * Create a DurablePromise with ClickHouse persistence
332
+ */
333
+ createPromise(options) {
334
+ // The provider will be used via context
335
+ return new DurablePromise({
336
+ ...options,
337
+ // Inject ourselves as the context provider
338
+ });
339
+ }
340
+ // ===========================================================================
341
+ // Stats
342
+ // ===========================================================================
343
+ /**
344
+ * Get current statistics
345
+ */
346
+ async getStats() {
347
+ // Query ClickHouse for accurate counts
348
+ const statusCounts = await this.executor.query(`SELECT status, priority, count() as count FROM Actions FINAL WHERE ns = '${this.namespace}' GROUP BY status, priority`);
349
+ const byPriority = {
350
+ priority: { pending: 0, active: 0, completed: 0 },
351
+ standard: { pending: 0, active: 0, completed: 0 },
352
+ flex: { pending: 0, active: 0, completed: 0 },
353
+ batch: { pending: 0, active: 0, completed: 0 },
354
+ };
355
+ let pending = 0;
356
+ let active = 0;
357
+ let completed = 0;
358
+ let failed = 0;
359
+ for (const row of statusCounts) {
360
+ const count = parseInt(row.count, 10);
361
+ const tier = PRIORITY_REVERSE[row.priority] ?? 'standard';
362
+ if (row.status === 'pending') {
363
+ pending += count;
364
+ byPriority[tier].pending += count;
365
+ }
366
+ else if (row.status === 'active') {
367
+ active += count;
368
+ byPriority[tier].active += count;
369
+ }
370
+ else if (row.status === 'completed') {
371
+ completed += count;
372
+ byPriority[tier].completed += count;
373
+ }
374
+ else if (row.status === 'failed') {
375
+ failed += count;
376
+ }
377
+ }
378
+ return {
379
+ pending,
380
+ active,
381
+ completed,
382
+ failed,
383
+ byPriority,
384
+ batchQueue: this.batchQueue.size,
385
+ };
386
+ }
387
+ // ===========================================================================
388
+ // Helpers
389
+ // ===========================================================================
390
+ parseVerb(method) {
391
+ const parts = method.split('.');
392
+ return parts[parts.length - 1] ?? 'process';
393
+ }
394
+ escapeString(str) {
395
+ return str.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
396
+ }
397
+ // ===========================================================================
398
+ // Cleanup
399
+ // ===========================================================================
400
+ /**
401
+ * Close the provider
402
+ */
403
+ async close() {
404
+ if (this.batchTimer) {
405
+ clearTimeout(this.batchTimer);
406
+ this.batchTimer = null;
407
+ }
408
+ // Flush any remaining batch
409
+ await this.flush();
410
+ setBatchScheduler(null);
411
+ }
412
+ }
413
+ // =============================================================================
414
+ // Factory
415
+ // =============================================================================
416
+ /**
417
+ * Create a ClickHouse durable provider
418
+ */
419
+ export function createClickHouseDurableProvider(config) {
420
+ return new ClickHouseDurableProvider(config);
421
+ }
422
+ //# sourceMappingURL=durable-clickhouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-clickhouse.js","sourceRoot":"","sources":["../src/durable-clickhouse.ts"],"names":[],"mappings":"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"}