@supersolutions/super-router-storage-postgres 0.0.0-stage → 0.1.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.
@@ -0,0 +1,440 @@
1
+ import pg, { type PoolClient } from "pg";
2
+ import { Service, type Principal, type Offering, type Usage } from "@supersolutions/super-router-contracts";
3
+ import { type DataStore, type Leg, type RequestRecord } from "@supersolutions/super-router-core";
4
+ export declare const LOCAL_DATABASE_URL = "postgresql://superrouter:local-development-only@127.0.0.1:25432/superrouter";
5
+ export declare class PostgresStore implements DataStore {
6
+ readonly pool: pg.Pool;
7
+ constructor(url: string);
8
+ close(): Promise<void>;
9
+ migrate(): Promise<void>;
10
+ private tx;
11
+ private row;
12
+ replay(p: Principal, key: string, digest: string): Promise<RequestRecord | null>;
13
+ get(p: Principal, id: string): Promise<RequestRecord>;
14
+ publish(p: Principal, raw: unknown, mode?: "cloud" | "self-host", expectedVersion?: number): Promise<{
15
+ id: string;
16
+ version: number;
17
+ mode: "tier" | "specific" | "pool";
18
+ offerings: {
19
+ id: string;
20
+ provider: string;
21
+ model: string;
22
+ upstream_model: string;
23
+ region: string;
24
+ labels: string[];
25
+ enabled: boolean;
26
+ source: "platform" | "byok";
27
+ max_input_tokens: number;
28
+ max_output_tokens: number;
29
+ price: {
30
+ asset: string;
31
+ input: string;
32
+ cached: string;
33
+ cache_write: string;
34
+ output: string;
35
+ per: number;
36
+ media?: {
37
+ images?: {
38
+ atoms: string;
39
+ per: number;
40
+ } | undefined;
41
+ video_ms?: {
42
+ atoms: string;
43
+ per: number;
44
+ } | undefined;
45
+ audio_ms?: {
46
+ atoms: string;
47
+ per: number;
48
+ } | undefined;
49
+ tasks?: {
50
+ atoms: string;
51
+ per: number;
52
+ } | undefined;
53
+ } | undefined;
54
+ };
55
+ task_kind?: "image" | "video" | "audio" | "task" | undefined;
56
+ max_usage?: {
57
+ images?: number | undefined;
58
+ video_ms?: number | undefined;
59
+ audio_ms?: number | undefined;
60
+ tasks?: number | undefined;
61
+ } | undefined;
62
+ latency_ms?: number | undefined;
63
+ reliability?: number | undefined;
64
+ quality?: number | undefined;
65
+ }[];
66
+ regions: string[];
67
+ required_labels: string[];
68
+ price: {
69
+ asset: string;
70
+ input: string;
71
+ cached: string;
72
+ cache_write: string;
73
+ output: string;
74
+ per: number;
75
+ media?: {
76
+ images?: {
77
+ atoms: string;
78
+ per: number;
79
+ } | undefined;
80
+ video_ms?: {
81
+ atoms: string;
82
+ per: number;
83
+ } | undefined;
84
+ audio_ms?: {
85
+ atoms: string;
86
+ per: number;
87
+ } | undefined;
88
+ tasks?: {
89
+ atoms: string;
90
+ per: number;
91
+ } | undefined;
92
+ } | undefined;
93
+ };
94
+ max_attempts: number;
95
+ max_provider_cost: string;
96
+ max_output_tokens: number;
97
+ weights: {
98
+ cost: number;
99
+ latency: number;
100
+ reliability: number;
101
+ quality: number;
102
+ };
103
+ cost_scale: string;
104
+ latency_scale_ms: number;
105
+ unknown_score: number;
106
+ task_kind?: "image" | "video" | "audio" | "task" | undefined;
107
+ model?: string | undefined;
108
+ tier?: string | undefined;
109
+ platform_price?: {
110
+ asset: string;
111
+ input: string;
112
+ cached: string;
113
+ cache_write: string;
114
+ output: string;
115
+ per: number;
116
+ media?: {
117
+ images?: {
118
+ atoms: string;
119
+ per: number;
120
+ } | undefined;
121
+ video_ms?: {
122
+ atoms: string;
123
+ per: number;
124
+ } | undefined;
125
+ audio_ms?: {
126
+ atoms: string;
127
+ per: number;
128
+ } | undefined;
129
+ tasks?: {
130
+ atoms: string;
131
+ per: number;
132
+ } | undefined;
133
+ } | undefined;
134
+ } | undefined;
135
+ requires_subscription?: boolean | undefined;
136
+ }>;
137
+ getService(p: Principal, id: string, version?: number): Promise<{
138
+ id: string;
139
+ version: number;
140
+ mode: "tier" | "specific" | "pool";
141
+ offerings: {
142
+ id: string;
143
+ provider: string;
144
+ model: string;
145
+ upstream_model: string;
146
+ region: string;
147
+ labels: string[];
148
+ enabled: boolean;
149
+ source: "platform" | "byok";
150
+ max_input_tokens: number;
151
+ max_output_tokens: number;
152
+ price: {
153
+ asset: string;
154
+ input: string;
155
+ cached: string;
156
+ cache_write: string;
157
+ output: string;
158
+ per: number;
159
+ media?: {
160
+ images?: {
161
+ atoms: string;
162
+ per: number;
163
+ } | undefined;
164
+ video_ms?: {
165
+ atoms: string;
166
+ per: number;
167
+ } | undefined;
168
+ audio_ms?: {
169
+ atoms: string;
170
+ per: number;
171
+ } | undefined;
172
+ tasks?: {
173
+ atoms: string;
174
+ per: number;
175
+ } | undefined;
176
+ } | undefined;
177
+ };
178
+ task_kind?: "image" | "video" | "audio" | "task" | undefined;
179
+ max_usage?: {
180
+ images?: number | undefined;
181
+ video_ms?: number | undefined;
182
+ audio_ms?: number | undefined;
183
+ tasks?: number | undefined;
184
+ } | undefined;
185
+ latency_ms?: number | undefined;
186
+ reliability?: number | undefined;
187
+ quality?: number | undefined;
188
+ }[];
189
+ regions: string[];
190
+ required_labels: string[];
191
+ price: {
192
+ asset: string;
193
+ input: string;
194
+ cached: string;
195
+ cache_write: string;
196
+ output: string;
197
+ per: number;
198
+ media?: {
199
+ images?: {
200
+ atoms: string;
201
+ per: number;
202
+ } | undefined;
203
+ video_ms?: {
204
+ atoms: string;
205
+ per: number;
206
+ } | undefined;
207
+ audio_ms?: {
208
+ atoms: string;
209
+ per: number;
210
+ } | undefined;
211
+ tasks?: {
212
+ atoms: string;
213
+ per: number;
214
+ } | undefined;
215
+ } | undefined;
216
+ };
217
+ max_attempts: number;
218
+ max_provider_cost: string;
219
+ max_output_tokens: number;
220
+ weights: {
221
+ cost: number;
222
+ latency: number;
223
+ reliability: number;
224
+ quality: number;
225
+ };
226
+ cost_scale: string;
227
+ latency_scale_ms: number;
228
+ unknown_score: number;
229
+ task_kind?: "image" | "video" | "audio" | "task" | undefined;
230
+ model?: string | undefined;
231
+ tier?: string | undefined;
232
+ platform_price?: {
233
+ asset: string;
234
+ input: string;
235
+ cached: string;
236
+ cache_write: string;
237
+ output: string;
238
+ per: number;
239
+ media?: {
240
+ images?: {
241
+ atoms: string;
242
+ per: number;
243
+ } | undefined;
244
+ video_ms?: {
245
+ atoms: string;
246
+ per: number;
247
+ } | undefined;
248
+ audio_ms?: {
249
+ atoms: string;
250
+ per: number;
251
+ } | undefined;
252
+ tasks?: {
253
+ atoms: string;
254
+ per: number;
255
+ } | undefined;
256
+ } | undefined;
257
+ } | undefined;
258
+ requires_subscription?: boolean | undefined;
259
+ }>;
260
+ list(p: Principal): Promise<{
261
+ id: string;
262
+ version: number;
263
+ mode: "tier" | "specific" | "pool";
264
+ offerings: {
265
+ id: string;
266
+ provider: string;
267
+ model: string;
268
+ upstream_model: string;
269
+ region: string;
270
+ labels: string[];
271
+ enabled: boolean;
272
+ source: "platform" | "byok";
273
+ max_input_tokens: number;
274
+ max_output_tokens: number;
275
+ price: {
276
+ asset: string;
277
+ input: string;
278
+ cached: string;
279
+ cache_write: string;
280
+ output: string;
281
+ per: number;
282
+ media?: {
283
+ images?: {
284
+ atoms: string;
285
+ per: number;
286
+ } | undefined;
287
+ video_ms?: {
288
+ atoms: string;
289
+ per: number;
290
+ } | undefined;
291
+ audio_ms?: {
292
+ atoms: string;
293
+ per: number;
294
+ } | undefined;
295
+ tasks?: {
296
+ atoms: string;
297
+ per: number;
298
+ } | undefined;
299
+ } | undefined;
300
+ };
301
+ task_kind?: "image" | "video" | "audio" | "task" | undefined;
302
+ max_usage?: {
303
+ images?: number | undefined;
304
+ video_ms?: number | undefined;
305
+ audio_ms?: number | undefined;
306
+ tasks?: number | undefined;
307
+ } | undefined;
308
+ latency_ms?: number | undefined;
309
+ reliability?: number | undefined;
310
+ quality?: number | undefined;
311
+ }[];
312
+ regions: string[];
313
+ required_labels: string[];
314
+ price: {
315
+ asset: string;
316
+ input: string;
317
+ cached: string;
318
+ cache_write: string;
319
+ output: string;
320
+ per: number;
321
+ media?: {
322
+ images?: {
323
+ atoms: string;
324
+ per: number;
325
+ } | undefined;
326
+ video_ms?: {
327
+ atoms: string;
328
+ per: number;
329
+ } | undefined;
330
+ audio_ms?: {
331
+ atoms: string;
332
+ per: number;
333
+ } | undefined;
334
+ tasks?: {
335
+ atoms: string;
336
+ per: number;
337
+ } | undefined;
338
+ } | undefined;
339
+ };
340
+ max_attempts: number;
341
+ max_provider_cost: string;
342
+ max_output_tokens: number;
343
+ weights: {
344
+ cost: number;
345
+ latency: number;
346
+ reliability: number;
347
+ quality: number;
348
+ };
349
+ cost_scale: string;
350
+ latency_scale_ms: number;
351
+ unknown_score: number;
352
+ task_kind?: "image" | "video" | "audio" | "task" | undefined;
353
+ model?: string | undefined;
354
+ tier?: string | undefined;
355
+ platform_price?: {
356
+ asset: string;
357
+ input: string;
358
+ cached: string;
359
+ cache_write: string;
360
+ output: string;
361
+ per: number;
362
+ media?: {
363
+ images?: {
364
+ atoms: string;
365
+ per: number;
366
+ } | undefined;
367
+ video_ms?: {
368
+ atoms: string;
369
+ per: number;
370
+ } | undefined;
371
+ audio_ms?: {
372
+ atoms: string;
373
+ per: number;
374
+ } | undefined;
375
+ tasks?: {
376
+ atoms: string;
377
+ per: number;
378
+ } | undefined;
379
+ } | undefined;
380
+ } | undefined;
381
+ requires_subscription?: boolean | undefined;
382
+ }[]>;
383
+ grant(p: Principal, kind: "customer_sale" | "platform_sale", asset: string, amount: string, source: string, expires?: Date): Promise<any>;
384
+ /** Internal trusted composition: caller owns the tenant transaction and authorization. */
385
+ grantTx(c: PoolClient, p: Principal, kind: "customer_sale" | "platform_sale", asset: string, amount: string, source: string, expires?: Date, serviceIds?: string[], sourceKind?: string): Promise<any>;
386
+ accounts(p: Principal, s: Service): Promise<Leg[]>;
387
+ reserve(p: Principal, key: string, digest: string, service: Service, legs: Leg[], deadline: string, decision?: unknown): Promise<{
388
+ request: RequestRecord;
389
+ fresh: boolean;
390
+ }>;
391
+ begin(p: Principal, id: string, o: Offering, bound: string): Promise<`${string}-${string}-${string}-${string}-${string}`>;
392
+ output(p: Principal, id: string): Promise<void>;
393
+ attemptResult(p: Principal, id: string, attempt: string, status: string, usage: Usage | null, cost: string | null, upstream?: string): Promise<void>;
394
+ private event;
395
+ finish(p: Principal, id: string, execution: string, usage: Usage | null, pending: boolean): Promise<void>;
396
+ private finishTx;
397
+ private expire;
398
+ balance(p: Principal): Promise<any[]>;
399
+ cancel(p: Principal, id: string): Promise<void>;
400
+ disable(p: Principal, offering: string): Promise<void>;
401
+ trace(p: Principal, id: string): Promise<{
402
+ request: RequestRecord;
403
+ attempts: any[];
404
+ settlements: any[];
405
+ }>;
406
+ /**
407
+ * Recent requests across all customers of the workspace/environment, newest first,
408
+ * with each attempt's offering, status and provider cost and the settled amount per ledger.
409
+ * Read-only operator view; amounts are atom strings.
410
+ */
411
+ recent(p: Principal, limit?: number, customer?: string): Promise<{
412
+ id: string;
413
+ customer: string;
414
+ service: string;
415
+ service_version: number;
416
+ execution: string;
417
+ billing: string;
418
+ provider_cost: string;
419
+ created_at: Date;
420
+ attempts: {
421
+ offering: string;
422
+ status: string;
423
+ cost: string | null;
424
+ usage: unknown;
425
+ }[];
426
+ settled: Record<string, string>;
427
+ }[]>;
428
+ /** Never redispatch an expired uncertain attempt. Operator resolution requires evidence. */
429
+ recover(): Promise<number>;
430
+ resolveWaiver(p: Principal, id: string, evidence: string): Promise<void>;
431
+ refund(p: Principal, id: string, kind: string, amount: string, key: string, reason: string): Promise<void>;
432
+ claimEvents(limit?: number, tenant?: Pick<Principal, "workspace" | "environment">): Promise<{
433
+ id: string;
434
+ generation: number;
435
+ payload: unknown;
436
+ }[]>;
437
+ ackEvent(id: string, generation: number): Promise<boolean>;
438
+ }
439
+ export { ControlPlane } from "./control.js";
440
+ export type { PaymentIntegration } from "./control.js";