@hoox-sh/hoox-shared 1.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 (161) hide show
  1. package/README.md +44 -0
  2. package/dist/agent-config-fields.d.ts +32 -0
  3. package/dist/agent-config-fields.d.ts.map +1 -0
  4. package/dist/agent-config-fields.js +220 -0
  5. package/dist/analytics.d.ts +47 -0
  6. package/dist/analytics.d.ts.map +1 -0
  7. package/dist/analytics.js +45 -0
  8. package/dist/api-client.d.ts +48 -0
  9. package/dist/api-client.d.ts.map +1 -0
  10. package/dist/api-client.js +191 -0
  11. package/dist/colors.d.ts +76 -0
  12. package/dist/colors.d.ts.map +1 -0
  13. package/dist/colors.js +82 -0
  14. package/dist/config.d.ts +61 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +146 -0
  17. package/dist/cron-handler.d.ts +38 -0
  18. package/dist/cron-handler.d.ts.map +1 -0
  19. package/dist/cron-handler.js +48 -0
  20. package/dist/d1/index.d.ts +9 -0
  21. package/dist/d1/index.d.ts.map +1 -0
  22. package/dist/d1/index.js +360 -0
  23. package/dist/d1/repository.d.ts +86 -0
  24. package/dist/d1/repository.d.ts.map +1 -0
  25. package/dist/d1/repository.js +297 -0
  26. package/dist/d1/schemas.d.ts +89 -0
  27. package/dist/d1/schemas.d.ts.map +1 -0
  28. package/dist/d1/schemas.js +81 -0
  29. package/dist/dashboard-manifest.d.ts +135 -0
  30. package/dist/dashboard-manifest.d.ts.map +1 -0
  31. package/dist/dashboard-manifest.js +401 -0
  32. package/dist/errors.d.ts +44 -0
  33. package/dist/errors.d.ts.map +1 -0
  34. package/dist/errors.js +149 -0
  35. package/dist/exchange-client.d.ts +98 -0
  36. package/dist/exchange-client.d.ts.map +1 -0
  37. package/dist/exchange-client.js +107 -0
  38. package/dist/exchanges/base-exchange-client.d.ts +81 -0
  39. package/dist/exchanges/base-exchange-client.d.ts.map +1 -0
  40. package/dist/exchanges/base-exchange-client.js +123 -0
  41. package/dist/exchanges/index.d.ts +7 -0
  42. package/dist/exchanges/index.d.ts.map +1 -0
  43. package/dist/exchanges/index.js +123 -0
  44. package/dist/exchanges/types.d.ts +23 -0
  45. package/dist/exchanges/types.d.ts.map +1 -0
  46. package/dist/exchanges/types.js +1 -0
  47. package/dist/format-time.d.ts +28 -0
  48. package/dist/format-time.d.ts.map +1 -0
  49. package/dist/format-time.js +57 -0
  50. package/dist/formatters.d.ts +36 -0
  51. package/dist/formatters.d.ts.map +1 -0
  52. package/dist/formatters.js +155 -0
  53. package/dist/health.d.ts +19 -0
  54. package/dist/health.d.ts.map +1 -0
  55. package/dist/health.js +160 -0
  56. package/dist/index.d.ts +72 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +4198 -0
  59. package/dist/kvKeys.d.ts +76 -0
  60. package/dist/kvKeys.d.ts.map +1 -0
  61. package/dist/kvKeys.js +107 -0
  62. package/dist/kvUtils.d.ts +30 -0
  63. package/dist/kvUtils.d.ts.map +1 -0
  64. package/dist/kvUtils.js +170 -0
  65. package/dist/legal.d.ts +15 -0
  66. package/dist/legal.d.ts.map +1 -0
  67. package/dist/legal.js +40 -0
  68. package/dist/middleware/auth.d.ts +102 -0
  69. package/dist/middleware/auth.d.ts.map +1 -0
  70. package/dist/middleware/auth.js +151 -0
  71. package/dist/middleware/cors.d.ts +58 -0
  72. package/dist/middleware/cors.d.ts.map +1 -0
  73. package/dist/middleware/cors.js +77 -0
  74. package/dist/middleware/index.d.ts +14 -0
  75. package/dist/middleware/index.d.ts.map +1 -0
  76. package/dist/middleware/index.js +635 -0
  77. package/dist/middleware/logger.d.ts +17 -0
  78. package/dist/middleware/logger.d.ts.map +1 -0
  79. package/dist/middleware/logger.js +202 -0
  80. package/dist/middleware/rate-limit.d.ts +30 -0
  81. package/dist/middleware/rate-limit.d.ts.map +1 -0
  82. package/dist/middleware/rate-limit.js +181 -0
  83. package/dist/middleware/security-headers.d.ts +43 -0
  84. package/dist/middleware/security-headers.d.ts.map +1 -0
  85. package/dist/middleware/security-headers.js +58 -0
  86. package/dist/middleware/validate.d.ts +25 -0
  87. package/dist/middleware/validate.d.ts.map +1 -0
  88. package/dist/middleware/validate.js +56 -0
  89. package/dist/operator-transport.d.ts +65 -0
  90. package/dist/operator-transport.d.ts.map +1 -0
  91. package/dist/operator-transport.js +87 -0
  92. package/dist/path-utils.d.ts +190 -0
  93. package/dist/path-utils.d.ts.map +1 -0
  94. package/dist/path-utils.js +188 -0
  95. package/dist/queue-handler.d.ts +47 -0
  96. package/dist/queue-handler.d.ts.map +1 -0
  97. package/dist/queue-handler.js +46 -0
  98. package/dist/router.d.ts +15 -0
  99. package/dist/router.d.ts.map +1 -0
  100. package/dist/router.js +130 -0
  101. package/dist/schemas/index.d.ts +8 -0
  102. package/dist/schemas/index.d.ts.map +1 -0
  103. package/dist/schemas/index.js +705 -0
  104. package/dist/schemas/registry.d.ts +12 -0
  105. package/dist/schemas/registry.d.ts.map +1 -0
  106. package/dist/schemas/registry.js +433 -0
  107. package/dist/schemas/types.d.ts +83 -0
  108. package/dist/schemas/types.d.ts.map +1 -0
  109. package/dist/schemas/types.js +1 -0
  110. package/dist/schemas/validators.d.ts +39 -0
  111. package/dist/schemas/validators.d.ts.map +1 -0
  112. package/dist/schemas/validators.js +290 -0
  113. package/dist/service-bindings.d.ts +78 -0
  114. package/dist/service-bindings.d.ts.map +1 -0
  115. package/dist/service-bindings.js +248 -0
  116. package/dist/session.d.ts +39 -0
  117. package/dist/session.d.ts.map +1 -0
  118. package/dist/session.js +261 -0
  119. package/dist/sse.d.ts +39 -0
  120. package/dist/sse.d.ts.map +1 -0
  121. package/dist/sse.js +154 -0
  122. package/dist/stores/config-store.d.ts +91 -0
  123. package/dist/stores/config-store.d.ts.map +1 -0
  124. package/dist/stores/config-store.js +255 -0
  125. package/dist/stores/service-store.d.ts +266 -0
  126. package/dist/stores/service-store.d.ts.map +1 -0
  127. package/dist/stores/service-store.js +516 -0
  128. package/dist/stores/ui-store.d.ts +67 -0
  129. package/dist/stores/ui-store.d.ts.map +1 -0
  130. package/dist/stores/ui-store.js +62 -0
  131. package/dist/test-utils.d.ts +136 -0
  132. package/dist/test-utils.d.ts.map +1 -0
  133. package/dist/test-utils.js +128 -0
  134. package/dist/types/errors.d.ts +20 -0
  135. package/dist/types/errors.d.ts.map +1 -0
  136. package/dist/types/errors.js +1 -0
  137. package/dist/types/router.d.ts +36 -0
  138. package/dist/types/router.d.ts.map +1 -0
  139. package/dist/types/router.js +1 -0
  140. package/dist/types.d.ts +442 -0
  141. package/dist/types.d.ts.map +1 -0
  142. package/dist/types.js +83 -0
  143. package/dist/wizard/engine.d.ts +46 -0
  144. package/dist/wizard/engine.d.ts.map +1 -0
  145. package/dist/wizard/engine.js +525 -0
  146. package/dist/wizard/index.d.ts +11 -0
  147. package/dist/wizard/index.d.ts.map +1 -0
  148. package/dist/wizard/index.js +544 -0
  149. package/dist/wizard/persistence.d.ts +18 -0
  150. package/dist/wizard/persistence.d.ts.map +1 -0
  151. package/dist/wizard/persistence.js +31 -0
  152. package/dist/wizard/presets.d.ts +38 -0
  153. package/dist/wizard/presets.d.ts.map +1 -0
  154. package/dist/wizard/presets.js +223 -0
  155. package/dist/wizard/provisioner.d.ts +15 -0
  156. package/dist/wizard/provisioner.d.ts.map +1 -0
  157. package/dist/wizard/provisioner.js +1 -0
  158. package/dist/wizard/types.d.ts +76 -0
  159. package/dist/wizard/types.d.ts.map +1 -0
  160. package/dist/wizard/types.js +1 -0
  161. package/package.json +117 -0
@@ -0,0 +1,360 @@
1
+ // @bun
2
+ var __defProp = Object.defineProperty;
3
+ var __returnValue = (v) => v;
4
+ function __exportSetter(name, newValue) {
5
+ this[name] = __returnValue.bind(null, newValue);
6
+ }
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true,
12
+ configurable: true,
13
+ set: __exportSetter.bind(all, name)
14
+ });
15
+ };
16
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
+
18
+ // src/errors.ts
19
+ function toError(err, fallback = "Unknown error") {
20
+ if (err instanceof Error)
21
+ return err.message;
22
+ if (typeof err === "string")
23
+ return err;
24
+ if (err && typeof err === "object" && "message" in err && typeof err.message === "string") {
25
+ return err.message;
26
+ }
27
+ if (err === null || err === undefined)
28
+ return fallback;
29
+ try {
30
+ return JSON.stringify(err) || fallback;
31
+ } catch {
32
+ return fallback;
33
+ }
34
+ }
35
+ var SENSITIVE_FIELDS = new Set([
36
+ "password",
37
+ "token",
38
+ "secret",
39
+ "api_key",
40
+ "apiKey",
41
+ "authorization"
42
+ ]);
43
+ function hasSensitiveFields(obj) {
44
+ for (const key of Object.keys(obj)) {
45
+ if (SENSITIVE_FIELDS.has(key))
46
+ return true;
47
+ }
48
+ return false;
49
+ }
50
+ function hasErrorValues(obj) {
51
+ for (const v of Object.values(obj)) {
52
+ if (v instanceof Error)
53
+ return true;
54
+ }
55
+ return false;
56
+ }
57
+ function sanitizeOutput(data) {
58
+ if (data === null || data === undefined)
59
+ return data;
60
+ const t = typeof data;
61
+ if (t === "string" || t === "number" || t === "boolean")
62
+ return data;
63
+ if (data instanceof Error) {
64
+ return { name: data.name, message: data.message };
65
+ }
66
+ if (Array.isArray(data)) {
67
+ return data.map(sanitizeOutput);
68
+ }
69
+ if (t === "object") {
70
+ const obj = data;
71
+ const keys = Object.keys(obj);
72
+ if (keys.length < 10) {
73
+ const sanitized2 = {};
74
+ for (const k of keys) {
75
+ if (k === "stack" || k === "cause")
76
+ continue;
77
+ const v = obj[k];
78
+ sanitized2[k] = v instanceof Error ? { name: v.name, message: v.message } : sanitizeOutput(v);
79
+ }
80
+ return sanitized2;
81
+ }
82
+ if (!hasSensitiveFields(obj) && !hasErrorValues(obj)) {
83
+ return obj;
84
+ }
85
+ const sanitized = {};
86
+ for (const k of keys) {
87
+ if (k === "stack" || k === "cause")
88
+ continue;
89
+ const v = obj[k];
90
+ sanitized[k] = v instanceof Error ? { name: v.name, message: v.message } : sanitizeOutput(v);
91
+ }
92
+ return sanitized;
93
+ }
94
+ return data;
95
+ }
96
+ function createJsonResponse(data, status = 200) {
97
+ return new Response(JSON.stringify(sanitizeOutput(data)), {
98
+ status,
99
+ headers: { "Content-Type": "application/json" }
100
+ });
101
+ }
102
+ function createSuccessResponse(result) {
103
+ return createJsonResponse({ success: true, result }, 200);
104
+ }
105
+ function createErrorResponse(error, status) {
106
+ const message = typeof error === "string" ? error : error.message;
107
+ const statusCode = typeof error === "string" ? status ?? 500 : error.status ?? 500;
108
+ const body = { success: false, error: message };
109
+ if (typeof error !== "string" && error.code)
110
+ body.code = error.code;
111
+ if (typeof error !== "string" && error.details !== undefined)
112
+ body.details = error.details;
113
+ return new Response(JSON.stringify(body), {
114
+ status: statusCode,
115
+ headers: { "Content-Type": "application/json" }
116
+ });
117
+ }
118
+ var Errors = {
119
+ badRequest: (message) => createErrorResponse({ message, status: 400, code: "BAD_REQUEST" }),
120
+ unauthorized: (message = "Unauthorized") => createErrorResponse({ message, status: 401, code: "UNAUTHORIZED" }),
121
+ forbidden: (message = "Forbidden") => createErrorResponse({ message, status: 403, code: "FORBIDDEN" }),
122
+ notFound: (message = "Not found") => createErrorResponse({ message, status: 404, code: "NOT_FOUND" }),
123
+ methodNotAllowed: (message = "Method not allowed") => createErrorResponse({ message, status: 405, code: "METHOD_NOT_ALLOWED" }),
124
+ rateLimited: (retryAfter) => {
125
+ const res = createErrorResponse({
126
+ message: "Rate limit exceeded",
127
+ status: 429,
128
+ code: "RATE_LIMITED"
129
+ });
130
+ if (retryAfter)
131
+ res.headers.set("Retry-After", String(retryAfter));
132
+ return res;
133
+ },
134
+ internal: (err) => {
135
+ const message = err ? toError(err, "Internal server error") : "Internal server error";
136
+ return createErrorResponse({
137
+ message,
138
+ status: 500,
139
+ code: "INTERNAL_ERROR"
140
+ });
141
+ }
142
+ };
143
+
144
+ // src/d1/repository.ts
145
+ class D1Repository {
146
+ db;
147
+ constructor(db) {
148
+ this.db = db;
149
+ }
150
+ async query(sql, params = []) {
151
+ try {
152
+ const stmt = this.db.prepare(sql).bind(...params);
153
+ const result = await stmt.all();
154
+ return {
155
+ success: result.success,
156
+ results: result.results,
157
+ error: result.error
158
+ };
159
+ } catch (error) {
160
+ return {
161
+ success: false,
162
+ error: toError(error)
163
+ };
164
+ }
165
+ }
166
+ async execute(sql, params = []) {
167
+ try {
168
+ const stmt = this.db.prepare(sql).bind(...params);
169
+ const result = await stmt.run();
170
+ return {
171
+ success: result.success,
172
+ meta: {
173
+ last_row_id: result.meta?.last_row_id,
174
+ changes: result.meta?.changes,
175
+ duration: result.meta?.duration
176
+ },
177
+ error: result.error
178
+ };
179
+ } catch (error) {
180
+ return {
181
+ success: false,
182
+ error: toError(error)
183
+ };
184
+ }
185
+ }
186
+ async batch(statements) {
187
+ try {
188
+ const prepared = statements.map((s) => s.params && s.params.length > 0 ? this.db.prepare(s.query).bind(...s.params) : this.db.prepare(s.query));
189
+ const results = await this.db.batch(prepared);
190
+ return results.map((r) => ({
191
+ success: r.success,
192
+ meta: r.meta ? { last_row_id: r.meta.last_row_id, changes: r.meta.changes } : undefined,
193
+ error: r.error
194
+ }));
195
+ } catch (error) {
196
+ return statements.map(() => ({
197
+ success: false,
198
+ error: toError(error)
199
+ }));
200
+ }
201
+ }
202
+ prepare(sql) {
203
+ return this.db.prepare(sql);
204
+ }
205
+ async getTrades(limit = 50, offset = 0) {
206
+ return this.query("SELECT * FROM trades ORDER BY timestamp DESC LIMIT ? OFFSET ?", [limit, offset]);
207
+ }
208
+ async insertTrade(trade) {
209
+ return this.execute(`INSERT INTO trades (id, timestamp, exchange, symbol, action, quantity, price, leverage, status, raw_response)
210
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
211
+ trade.id || crypto.randomUUID(),
212
+ trade.timestamp,
213
+ trade.exchange,
214
+ trade.symbol,
215
+ trade.action,
216
+ trade.quantity ?? null,
217
+ trade.price ?? null,
218
+ trade.leverage ?? null,
219
+ trade.status,
220
+ trade.raw_response ?? null
221
+ ]);
222
+ }
223
+ async getPositions(status) {
224
+ if (status) {
225
+ return this.query("SELECT * FROM positions WHERE status = ? ORDER BY updated_at DESC", [status]);
226
+ }
227
+ return this.query("SELECT * FROM positions ORDER BY updated_at DESC");
228
+ }
229
+ async upsertPosition(position) {
230
+ return this.execute(`REPLACE INTO positions (id, exchange, symbol, side, entry_price, mark_price, liquidation_price, leverage, size, unrealized_pnl, status, updated_at)
231
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
232
+ position.id,
233
+ position.exchange,
234
+ position.symbol,
235
+ position.side,
236
+ position.entry_price ?? null,
237
+ position.mark_price ?? null,
238
+ position.liquidation_price ?? null,
239
+ position.leverage ?? null,
240
+ position.size,
241
+ position.unrealized_pnl ?? null,
242
+ position.status,
243
+ position.updated_at
244
+ ]);
245
+ }
246
+ async getTradeSignals(limit = 10) {
247
+ return this.query(`SELECT signal_id, timestamp, symbol, signal_type, source, processed_at
248
+ FROM trade_signals
249
+ ORDER BY processed_at DESC
250
+ LIMIT ?`, [limit]);
251
+ }
252
+ async insertTradeSignal(signal) {
253
+ return this.execute(`INSERT INTO trade_signals (signal_id, timestamp, symbol, signal_type, source, raw_data)
254
+ VALUES (?, ?, ?, ?, ?, ?)`, [
255
+ signal.signal_id,
256
+ signal.timestamp,
257
+ signal.symbol,
258
+ signal.signal_type,
259
+ signal.source ?? null,
260
+ signal.raw_data ?? null
261
+ ]);
262
+ }
263
+ async getSystemLogs(limit = 50) {
264
+ return this.query("SELECT * FROM system_logs ORDER BY timestamp DESC LIMIT ?", [limit]);
265
+ }
266
+ async insertSystemLog(log) {
267
+ return this.execute(`INSERT INTO system_logs (id, level, service, message, details) VALUES (?, ?, ?, ?, ?)`, [
268
+ log.id || crypto.randomUUID(),
269
+ log.level,
270
+ log.service,
271
+ log.message,
272
+ log.details ?? null
273
+ ]);
274
+ }
275
+ async getLatestBalances() {
276
+ return this.query(`
277
+ SELECT b.id, b.exchange, b.asset, b.total, b.free, b.used, b.timestamp
278
+ FROM balances b
279
+ INNER JOIN (
280
+ SELECT exchange, asset, MAX(timestamp) as max_time
281
+ FROM balances
282
+ GROUP BY exchange, asset
283
+ ) latest ON b.exchange = latest.exchange AND b.asset = latest.asset AND b.timestamp = latest.max_time
284
+ `);
285
+ }
286
+ async healthCheck() {
287
+ try {
288
+ await this.db.prepare("SELECT 1").first();
289
+ return true;
290
+ } catch {
291
+ return false;
292
+ }
293
+ }
294
+ }
295
+
296
+ // src/d1/schemas.ts
297
+ import { z } from "zod";
298
+ var TradeRecordSchema = z.object({
299
+ id: z.string(),
300
+ signal_id: z.string().nullable().optional(),
301
+ timestamp: z.number().int().positive(),
302
+ exchange: z.string().min(1),
303
+ symbol: z.string().min(1),
304
+ action: z.string().min(1),
305
+ quantity: z.number().nullable(),
306
+ price: z.number().nullable(),
307
+ leverage: z.number().nullable(),
308
+ status: z.string().min(1),
309
+ error_message: z.string().nullable().optional(),
310
+ raw_response: z.string().nullable().optional(),
311
+ created_at: z.number().int().optional()
312
+ }).strict();
313
+ var PositionRecordSchema = z.object({
314
+ id: z.string(),
315
+ exchange: z.string().min(1),
316
+ symbol: z.string().min(1),
317
+ side: z.enum(["LONG", "SHORT"]),
318
+ entry_price: z.number().nullable().optional(),
319
+ mark_price: z.number().nullable().optional(),
320
+ liquidation_price: z.number().nullable().optional(),
321
+ leverage: z.number().nullable().optional(),
322
+ size: z.number().nullable(),
323
+ unrealized_pnl: z.number().nullable().optional(),
324
+ status: z.enum(["OPEN", "CLOSED"]),
325
+ updated_at: z.number().int()
326
+ }).strict();
327
+ var BalanceRecordSchema = z.object({
328
+ id: z.string(),
329
+ exchange: z.string().min(1),
330
+ asset: z.string().min(1),
331
+ free: z.number().nullable(),
332
+ used: z.number().nullable(),
333
+ total: z.number().nullable(),
334
+ timestamp: z.number().int().positive()
335
+ }).strict();
336
+ var SystemLogRecordSchema = z.object({
337
+ id: z.string(),
338
+ timestamp: z.number().int().optional(),
339
+ level: z.string().min(1),
340
+ service: z.string().min(1),
341
+ message: z.string().min(1),
342
+ details: z.string().nullable().optional()
343
+ }).strict();
344
+ var TradeSignalRecordSchema = z.object({
345
+ signal_id: z.string(),
346
+ timestamp: z.number().int().positive(),
347
+ symbol: z.string().min(1),
348
+ signal_type: z.string().min(1),
349
+ source: z.string().nullable().optional(),
350
+ raw_data: z.string().nullable().optional(),
351
+ processed_at: z.number().int().optional()
352
+ }).strict();
353
+ export {
354
+ TradeSignalRecordSchema,
355
+ TradeRecordSchema,
356
+ SystemLogRecordSchema,
357
+ PositionRecordSchema,
358
+ D1Repository,
359
+ BalanceRecordSchema
360
+ };
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ /**
6
+ * @deprecated D1Repository is no longer used by any worker.
7
+ * All D1 operations are now handled directly via route handlers in workers/d1-worker.
8
+ * This file is kept for reference but will be removed in a future cleanup pass.
9
+ */
10
+ import type { D1Database, D1PreparedStatement } from "@cloudflare/workers-types";
11
+ import type { TradeRecord, PositionRecord, BalanceRecord, SystemLogRecord, TradeSignalRecord, D1QueryResult } from "./schemas";
12
+ export interface BatchStatement {
13
+ query: string;
14
+ params?: unknown[];
15
+ }
16
+ /**
17
+ * Typed D1 repository providing convenience methods for the hoox database schema.
18
+ *
19
+ * Tables: trades, positions, balances, system_logs, trade_signals
20
+ */
21
+ export declare class D1Repository {
22
+ private readonly db;
23
+ constructor(db: D1Database);
24
+ /**
25
+ * Execute a SELECT query and return typed results
26
+ */
27
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<D1QueryResult<T>>;
28
+ /**
29
+ * Execute a write query (INSERT, UPDATE, DELETE, REPLACE)
30
+ */
31
+ execute(sql: string, params?: unknown[]): Promise<D1QueryResult>;
32
+ /**
33
+ * Execute multiple statements in a batch transaction
34
+ */
35
+ batch(statements: BatchStatement[]): Promise<D1QueryResult[]>;
36
+ /**
37
+ * Return a raw D1PreparedStatement for complex or dynamic queries
38
+ */
39
+ prepare(sql: string): D1PreparedStatement;
40
+ /**
41
+ * Retrieve recent trades ordered by timestamp descending
42
+ */
43
+ getTrades(limit?: number, offset?: number): Promise<D1QueryResult<TradeRecord>>;
44
+ /**
45
+ * Insert a new trade record
46
+ */
47
+ insertTrade(trade: Omit<TradeRecord, "id" | "created_at"> & {
48
+ id?: string;
49
+ }): Promise<D1QueryResult>;
50
+ /**
51
+ * Retrieve positions, optionally filtered by status
52
+ */
53
+ getPositions(status?: "OPEN" | "CLOSED"): Promise<D1QueryResult<PositionRecord>>;
54
+ /**
55
+ * Upsert a position record (REPLACE INTO)
56
+ */
57
+ upsertPosition(position: PositionRecord): Promise<D1QueryResult>;
58
+ /**
59
+ * Retrieve recent trade signals
60
+ */
61
+ getTradeSignals(limit?: number): Promise<D1QueryResult<TradeSignalRecord>>;
62
+ /**
63
+ * Insert a new trade signal
64
+ */
65
+ insertTradeSignal(signal: TradeSignalRecord): Promise<D1QueryResult>;
66
+ /**
67
+ * Retrieve recent system logs
68
+ */
69
+ getSystemLogs(limit?: number): Promise<D1QueryResult<SystemLogRecord>>;
70
+ /**
71
+ * Insert a new system log entry (id and timestamp are auto-generated)
72
+ */
73
+ insertSystemLog(log: Pick<SystemLogRecord, "level" | "service" | "message"> & {
74
+ details?: string | null;
75
+ id?: string;
76
+ }): Promise<D1QueryResult>;
77
+ /**
78
+ * Retrieve the latest balance snapshot per exchange and asset
79
+ */
80
+ getLatestBalances(): Promise<D1QueryResult<BalanceRecord>>;
81
+ /**
82
+ * Quick health check — verifies the database connection is alive
83
+ */
84
+ healthCheck(): Promise<boolean>;
85
+ }
86
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/d1/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,KAAK,EACV,UAAU,EAEV,mBAAmB,EACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,aAAa,EACd,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,UAAU;IAE3C;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,OAAO,EAAO,GACrB,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAiB5B;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAqB1E;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAuBnE;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB;IAMzC;;OAEG;IACG,SAAS,CACb,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,GACjB,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAOtC;;OAEG;IACG,WAAW,CACf,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,YAAY,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9D,OAAO,CAAC,aAAa,CAAC;IAmBzB;;OAEG;IACG,YAAY,CAChB,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GACzB,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAYzC;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAqBtE;;OAEG;IACG,eAAe,CACnB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAU5C;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;IAe1E;;OAEG;IACG,aAAa,CACjB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAO1C;;OAEG;IACG,eAAe,CACnB,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC,GAAG;QAC5D,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,GACA,OAAO,CAAC,aAAa,CAAC;IAazB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAYhE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQtC"}