@downcity/services 0.1.66 → 0.1.69

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 (55) hide show
  1. package/bin/accounts/index.d.ts +1 -5
  2. package/bin/accounts/index.d.ts.map +1 -1
  3. package/bin/accounts/index.js +1 -4
  4. package/bin/accounts/index.js.map +1 -1
  5. package/bin/balance/index.d.ts +1 -1
  6. package/bin/balance/index.d.ts.map +1 -1
  7. package/bin/balance/index.js +1 -1
  8. package/bin/balance/index.js.map +1 -1
  9. package/bin/balance/service.d.ts +0 -4
  10. package/bin/balance/service.d.ts.map +1 -1
  11. package/bin/balance/service.js +0 -6
  12. package/bin/balance/service.js.map +1 -1
  13. package/bin/billing/index.d.ts +1 -1
  14. package/bin/billing/index.d.ts.map +1 -1
  15. package/bin/billing/index.js +1 -1
  16. package/bin/billing/index.js.map +1 -1
  17. package/bin/billing/service.d.ts +0 -4
  18. package/bin/billing/service.d.ts.map +1 -1
  19. package/bin/billing/service.js +0 -6
  20. package/bin/billing/service.js.map +1 -1
  21. package/bin/index.d.ts +6 -6
  22. package/bin/index.d.ts.map +1 -1
  23. package/bin/index.js +5 -5
  24. package/bin/index.js.map +1 -1
  25. package/bin/payment/helpers.d.ts +68 -0
  26. package/bin/payment/helpers.d.ts.map +1 -0
  27. package/bin/payment/helpers.js +148 -0
  28. package/bin/payment/helpers.js.map +1 -0
  29. package/bin/payment/index.d.ts +10 -28
  30. package/bin/payment/index.d.ts.map +1 -1
  31. package/bin/payment/index.js +9 -890
  32. package/bin/payment/index.js.map +1 -1
  33. package/bin/payment/providers.d.ts +25 -0
  34. package/bin/payment/providers.d.ts.map +1 -0
  35. package/bin/payment/providers.js +415 -0
  36. package/bin/payment/providers.js.map +1 -0
  37. package/bin/payment/routes.d.ts +29 -0
  38. package/bin/payment/routes.d.ts.map +1 -0
  39. package/bin/payment/routes.js +394 -0
  40. package/bin/payment/routes.js.map +1 -0
  41. package/bin/payment/service.d.ts +448 -0
  42. package/bin/payment/service.d.ts.map +1 -0
  43. package/bin/payment/service.js +72 -0
  44. package/bin/payment/service.js.map +1 -0
  45. package/bin/payment/types.d.ts +11 -18
  46. package/bin/payment/types.d.ts.map +1 -1
  47. package/bin/usage/index.d.ts +3 -174
  48. package/bin/usage/index.d.ts.map +1 -1
  49. package/bin/usage/index.js +2 -117
  50. package/bin/usage/index.js.map +1 -1
  51. package/bin/usage/service.d.ts +353 -0
  52. package/bin/usage/service.d.ts.map +1 -0
  53. package/bin/usage/service.js +140 -0
  54. package/bin/usage/service.js.map +1 -0
  55. package/package.json +2 -2
@@ -1,177 +1,6 @@
1
1
  /**
2
- * Downcity 官方 Usage 服务。
3
- *
4
- * 通过全局 hook 记录 service 调用事件。
5
- * 兼容 Node.js 和 Cloudflare Workers(使用 Web Crypto API)。
2
+ * Usage 服务子模块公共入口。
6
3
  */
7
- import type { ServiceDefinition } from "@downcity/city";
8
- export interface UsageServiceOptions {
9
- /**
10
- * 是否记录失败的用户侧 service 调用。
11
- *
12
- * 默认只记录成功调用;开启后会通过 error hook 记录失败事件。
13
- */
14
- record_errors?: boolean;
15
- }
16
- /** Usage 事件表 */
17
- export declare const usageEvents: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
18
- name: "service_usage_events";
19
- schema: undefined;
20
- columns: {
21
- event_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
22
- name: "event_id";
23
- tableName: "service_usage_events";
24
- dataType: "string";
25
- columnType: "SQLiteText";
26
- data: string;
27
- driverParam: string;
28
- notNull: true;
29
- hasDefault: false;
30
- isPrimaryKey: true;
31
- isAutoincrement: false;
32
- hasRuntimeDefault: false;
33
- enumValues: [string, ...string[]];
34
- baseColumn: never;
35
- identity: undefined;
36
- generated: undefined;
37
- }, {}, {
38
- length: number | undefined;
39
- }>;
40
- town_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
41
- name: "town_id";
42
- tableName: "service_usage_events";
43
- dataType: "string";
44
- columnType: "SQLiteText";
45
- data: string;
46
- driverParam: string;
47
- notNull: true;
48
- hasDefault: false;
49
- isPrimaryKey: false;
50
- isAutoincrement: false;
51
- hasRuntimeDefault: false;
52
- enumValues: [string, ...string[]];
53
- baseColumn: never;
54
- identity: undefined;
55
- generated: undefined;
56
- }, {}, {
57
- length: number | undefined;
58
- }>;
59
- user_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
60
- name: "user_id";
61
- tableName: "service_usage_events";
62
- dataType: "string";
63
- columnType: "SQLiteText";
64
- data: string;
65
- driverParam: string;
66
- notNull: true;
67
- hasDefault: false;
68
- isPrimaryKey: false;
69
- isAutoincrement: false;
70
- hasRuntimeDefault: false;
71
- enumValues: [string, ...string[]];
72
- baseColumn: never;
73
- identity: undefined;
74
- generated: undefined;
75
- }, {}, {
76
- length: number | undefined;
77
- }>;
78
- service: import("drizzle-orm/sqlite-core").SQLiteColumn<{
79
- name: "service";
80
- tableName: "service_usage_events";
81
- dataType: "string";
82
- columnType: "SQLiteText";
83
- data: string;
84
- driverParam: string;
85
- notNull: true;
86
- hasDefault: false;
87
- isPrimaryKey: false;
88
- isAutoincrement: false;
89
- hasRuntimeDefault: false;
90
- enumValues: [string, ...string[]];
91
- baseColumn: never;
92
- identity: undefined;
93
- generated: undefined;
94
- }, {}, {
95
- length: number | undefined;
96
- }>;
97
- model_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
98
- name: "model_id";
99
- tableName: "service_usage_events";
100
- dataType: "string";
101
- columnType: "SQLiteText";
102
- data: string;
103
- driverParam: string;
104
- notNull: true;
105
- hasDefault: false;
106
- isPrimaryKey: false;
107
- isAutoincrement: false;
108
- hasRuntimeDefault: false;
109
- enumValues: [string, ...string[]];
110
- baseColumn: never;
111
- identity: undefined;
112
- generated: undefined;
113
- }, {}, {
114
- length: number | undefined;
115
- }>;
116
- status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
117
- name: "status";
118
- tableName: "service_usage_events";
119
- dataType: "string";
120
- columnType: "SQLiteText";
121
- data: string;
122
- driverParam: string;
123
- notNull: true;
124
- hasDefault: false;
125
- isPrimaryKey: false;
126
- isAutoincrement: false;
127
- hasRuntimeDefault: false;
128
- enumValues: [string, ...string[]];
129
- baseColumn: never;
130
- identity: undefined;
131
- generated: undefined;
132
- }, {}, {
133
- length: number | undefined;
134
- }>;
135
- metadata_json: import("drizzle-orm/sqlite-core").SQLiteColumn<{
136
- name: "metadata_json";
137
- tableName: "service_usage_events";
138
- dataType: "string";
139
- columnType: "SQLiteText";
140
- data: string;
141
- driverParam: string;
142
- notNull: true;
143
- hasDefault: false;
144
- isPrimaryKey: false;
145
- isAutoincrement: false;
146
- hasRuntimeDefault: false;
147
- enumValues: [string, ...string[]];
148
- baseColumn: never;
149
- identity: undefined;
150
- generated: undefined;
151
- }, {}, {
152
- length: number | undefined;
153
- }>;
154
- created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
155
- name: "created_at";
156
- tableName: "service_usage_events";
157
- dataType: "string";
158
- columnType: "SQLiteText";
159
- data: string;
160
- driverParam: string;
161
- notNull: true;
162
- hasDefault: false;
163
- isPrimaryKey: false;
164
- isAutoincrement: false;
165
- hasRuntimeDefault: false;
166
- enumValues: [string, ...string[]];
167
- baseColumn: never;
168
- identity: undefined;
169
- generated: undefined;
170
- }, {}, {
171
- length: number | undefined;
172
- }>;
173
- };
174
- dialect: "sqlite";
175
- }>;
176
- export declare function usageService(options?: UsageServiceOptions): ServiceDefinition;
4
+ export { UsageService, usageEvents } from "./service.js";
5
+ export type { UsageServiceOptions } from "./service.js";
177
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/usage/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAW,MAAM,gBAAgB,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,gBAAgB;AAChB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAStB,CAAC;AAEH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,iBAAiB,CA6DjF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/usage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -1,120 +1,5 @@
1
1
  /**
2
- * Downcity 官方 Usage 服务。
3
- *
4
- * 通过全局 hook 记录 service 调用事件。
5
- * 兼容 Node.js 和 Cloudflare Workers(使用 Web Crypto API)。
2
+ * Usage 服务子模块公共入口。
6
3
  */
7
- import { sqliteTable, text } from "drizzle-orm/sqlite-core";
8
- /** Usage 事件表 */
9
- export const usageEvents = sqliteTable("service_usage_events", {
10
- event_id: text("event_id").primaryKey(),
11
- town_id: text("town_id").notNull(),
12
- user_id: text("user_id").notNull(),
13
- service: text("service").notNull(),
14
- model_id: text("model_id").notNull(),
15
- status: text("status").notNull(),
16
- metadata_json: text("metadata_json").notNull(),
17
- created_at: text("created_at").notNull(),
18
- });
19
- export function usageService(options = {}) {
20
- return {
21
- id: "usage",
22
- name: "Usage",
23
- version: "0.1.0",
24
- schema: { events: usageEvents },
25
- instruction: [
26
- "通过全局 hook 记录真实用户侧 service 调用事件。",
27
- "默认只记录成功调用;record_errors=true 时也会记录失败调用。",
28
- "常用读取方式是管理端查看 events/summary,用户侧查看 me。",
29
- ].join("\n"),
30
- install(ctx) {
31
- const events = ctx.table("events");
32
- ctx.hook.after(async (serviceCtx) => {
33
- if (!shouldRecordUsage(serviceCtx))
34
- return;
35
- await events.insert(createUsageEvent(serviceCtx, "success"));
36
- });
37
- if (options.record_errors) {
38
- ctx.hook.onError(async (serviceCtx) => {
39
- if (!shouldRecordUsage(serviceCtx))
40
- return;
41
- await events.insert(createUsageEvent(serviceCtx, "error"));
42
- });
43
- }
44
- ctx.route({
45
- method: "GET",
46
- path: "/events",
47
- auth: ["admin"],
48
- async handler(requestCtx) {
49
- return requestCtx.jsonResponse({ items: await events.select() });
50
- },
51
- });
52
- ctx.route({
53
- method: "GET",
54
- path: "/summary",
55
- auth: ["admin"],
56
- async handler(requestCtx) {
57
- return requestCtx.jsonResponse({
58
- items: summarizeUsage(await events.select()),
59
- });
60
- },
61
- });
62
- ctx.route({
63
- method: "GET",
64
- path: "/me",
65
- auth: ["user"],
66
- async handler(requestCtx) {
67
- return requestCtx.jsonResponse({
68
- items: await events.select({
69
- user_id: requestCtx.user?.user_id ?? "",
70
- town_id: requestCtx.town?.town_id ?? "",
71
- }),
72
- });
73
- },
74
- });
75
- },
76
- };
77
- }
78
- /**
79
- * 只记录真实用户侧调用。
80
- *
81
- * 管理端操作没有 user/town 上下文,usage 服务自己的查询也不应反过来
82
- * 产生 usage 事件,否则统计接口会污染自身结果。
83
- */
84
- function shouldRecordUsage(ctx) {
85
- return Boolean(ctx.user?.user_id && ctx.town?.town_id && ctx.service?.id !== "usage");
86
- }
87
- function createUsageEvent(ctx, status) {
88
- return {
89
- event_id: `usage_${randomId()}`,
90
- town_id: ctx.town?.town_id ?? "",
91
- user_id: ctx.user?.user_id ?? "",
92
- service: ctx.service?.id ?? "",
93
- model_id: ctx.variant?.id ?? "",
94
- status,
95
- metadata_json: JSON.stringify({
96
- variant: ctx.variant?.id,
97
- started_at: ctx.started_at?.toISOString(),
98
- ended_at: ctx.ended_at?.toISOString(),
99
- error: ctx.error?.message,
100
- }),
101
- created_at: new Date().toISOString(),
102
- };
103
- }
104
- function summarizeUsage(rows) {
105
- const byKey = new Map();
106
- for (const row of rows) {
107
- const key = `${row.town_id}\u0000${row.service}\u0000${row.status}`;
108
- const current = byKey.get(key) ?? { town_id: row.town_id, service: row.service, status: row.status, count: 0 };
109
- current.count += 1;
110
- byKey.set(key, current);
111
- }
112
- return [...byKey.values()].sort((a, b) => `${a.town_id}:${a.service}:${a.status}`.localeCompare(`${b.town_id}:${b.service}:${b.status}`));
113
- }
114
- /** 生成随机 ID(兼容 Node 和 Workers) */
115
- function randomId() {
116
- const buf = new Uint8Array(12);
117
- crypto.getRandomValues(buf);
118
- return btoa(String.fromCharCode(...buf)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
119
- }
4
+ export { UsageService, usageEvents } from "./service.js";
120
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/usage/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/usage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Downcity 官方 Usage 服务。
3
+ *
4
+ * 通过全局 hook 记录 service 调用事件。
5
+ * 兼容 Node.js 和 Cloudflare Workers(使用 Web Crypto API)。
6
+ */
7
+ import { InstallableService, type ServiceInstallContext } from "@downcity/city";
8
+ /**
9
+ * Usage 服务配置。
10
+ */
11
+ export interface UsageServiceOptions {
12
+ /**
13
+ * 是否记录失败的用户侧 service 调用。
14
+ *
15
+ * 默认只记录成功调用;开启后会通过 error hook 记录失败事件。
16
+ */
17
+ record_errors?: boolean;
18
+ }
19
+ /**
20
+ * Usage 事件表。
21
+ */
22
+ export declare const usageEvents: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
23
+ name: "service_usage_events";
24
+ schema: undefined;
25
+ columns: {
26
+ event_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
27
+ name: "event_id";
28
+ tableName: "service_usage_events";
29
+ dataType: "string";
30
+ columnType: "SQLiteText";
31
+ data: string;
32
+ driverParam: string;
33
+ notNull: true;
34
+ hasDefault: false;
35
+ isPrimaryKey: true;
36
+ isAutoincrement: false;
37
+ hasRuntimeDefault: false;
38
+ enumValues: [string, ...string[]];
39
+ baseColumn: never;
40
+ identity: undefined;
41
+ generated: undefined;
42
+ }, {}, {
43
+ length: number | undefined;
44
+ }>;
45
+ town_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
46
+ name: "town_id";
47
+ tableName: "service_usage_events";
48
+ dataType: "string";
49
+ columnType: "SQLiteText";
50
+ data: string;
51
+ driverParam: string;
52
+ notNull: true;
53
+ hasDefault: false;
54
+ isPrimaryKey: false;
55
+ isAutoincrement: false;
56
+ hasRuntimeDefault: false;
57
+ enumValues: [string, ...string[]];
58
+ baseColumn: never;
59
+ identity: undefined;
60
+ generated: undefined;
61
+ }, {}, {
62
+ length: number | undefined;
63
+ }>;
64
+ user_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
65
+ name: "user_id";
66
+ tableName: "service_usage_events";
67
+ dataType: "string";
68
+ columnType: "SQLiteText";
69
+ data: string;
70
+ driverParam: string;
71
+ notNull: true;
72
+ hasDefault: false;
73
+ isPrimaryKey: false;
74
+ isAutoincrement: false;
75
+ hasRuntimeDefault: false;
76
+ enumValues: [string, ...string[]];
77
+ baseColumn: never;
78
+ identity: undefined;
79
+ generated: undefined;
80
+ }, {}, {
81
+ length: number | undefined;
82
+ }>;
83
+ service: import("drizzle-orm/sqlite-core").SQLiteColumn<{
84
+ name: "service";
85
+ tableName: "service_usage_events";
86
+ dataType: "string";
87
+ columnType: "SQLiteText";
88
+ data: string;
89
+ driverParam: string;
90
+ notNull: true;
91
+ hasDefault: false;
92
+ isPrimaryKey: false;
93
+ isAutoincrement: false;
94
+ hasRuntimeDefault: false;
95
+ enumValues: [string, ...string[]];
96
+ baseColumn: never;
97
+ identity: undefined;
98
+ generated: undefined;
99
+ }, {}, {
100
+ length: number | undefined;
101
+ }>;
102
+ model_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
103
+ name: "model_id";
104
+ tableName: "service_usage_events";
105
+ dataType: "string";
106
+ columnType: "SQLiteText";
107
+ data: string;
108
+ driverParam: string;
109
+ notNull: true;
110
+ hasDefault: false;
111
+ isPrimaryKey: false;
112
+ isAutoincrement: false;
113
+ hasRuntimeDefault: false;
114
+ enumValues: [string, ...string[]];
115
+ baseColumn: never;
116
+ identity: undefined;
117
+ generated: undefined;
118
+ }, {}, {
119
+ length: number | undefined;
120
+ }>;
121
+ status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
122
+ name: "status";
123
+ tableName: "service_usage_events";
124
+ dataType: "string";
125
+ columnType: "SQLiteText";
126
+ data: string;
127
+ driverParam: string;
128
+ notNull: true;
129
+ hasDefault: false;
130
+ isPrimaryKey: false;
131
+ isAutoincrement: false;
132
+ hasRuntimeDefault: false;
133
+ enumValues: [string, ...string[]];
134
+ baseColumn: never;
135
+ identity: undefined;
136
+ generated: undefined;
137
+ }, {}, {
138
+ length: number | undefined;
139
+ }>;
140
+ metadata_json: import("drizzle-orm/sqlite-core").SQLiteColumn<{
141
+ name: "metadata_json";
142
+ tableName: "service_usage_events";
143
+ dataType: "string";
144
+ columnType: "SQLiteText";
145
+ data: string;
146
+ driverParam: string;
147
+ notNull: true;
148
+ hasDefault: false;
149
+ isPrimaryKey: false;
150
+ isAutoincrement: false;
151
+ hasRuntimeDefault: false;
152
+ enumValues: [string, ...string[]];
153
+ baseColumn: never;
154
+ identity: undefined;
155
+ generated: undefined;
156
+ }, {}, {
157
+ length: number | undefined;
158
+ }>;
159
+ created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
160
+ name: "created_at";
161
+ tableName: "service_usage_events";
162
+ dataType: "string";
163
+ columnType: "SQLiteText";
164
+ data: string;
165
+ driverParam: string;
166
+ notNull: true;
167
+ hasDefault: false;
168
+ isPrimaryKey: false;
169
+ isAutoincrement: false;
170
+ hasRuntimeDefault: false;
171
+ enumValues: [string, ...string[]];
172
+ baseColumn: never;
173
+ identity: undefined;
174
+ generated: undefined;
175
+ }, {}, {
176
+ length: number | undefined;
177
+ }>;
178
+ };
179
+ dialect: "sqlite";
180
+ }>;
181
+ /**
182
+ * Usage 服务实例。
183
+ */
184
+ export declare class UsageService extends InstallableService {
185
+ private readonly options;
186
+ readonly id = "usage";
187
+ readonly name = "Usage";
188
+ readonly version = "0.1.0";
189
+ readonly schema: {
190
+ events: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
191
+ name: "service_usage_events";
192
+ schema: undefined;
193
+ columns: {
194
+ event_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
195
+ name: "event_id";
196
+ tableName: "service_usage_events";
197
+ dataType: "string";
198
+ columnType: "SQLiteText";
199
+ data: string;
200
+ driverParam: string;
201
+ notNull: true;
202
+ hasDefault: false;
203
+ isPrimaryKey: true;
204
+ isAutoincrement: false;
205
+ hasRuntimeDefault: false;
206
+ enumValues: [string, ...string[]];
207
+ baseColumn: never;
208
+ identity: undefined;
209
+ generated: undefined;
210
+ }, {}, {
211
+ length: number | undefined;
212
+ }>;
213
+ town_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
214
+ name: "town_id";
215
+ tableName: "service_usage_events";
216
+ dataType: "string";
217
+ columnType: "SQLiteText";
218
+ data: string;
219
+ driverParam: string;
220
+ notNull: true;
221
+ hasDefault: false;
222
+ isPrimaryKey: false;
223
+ isAutoincrement: false;
224
+ hasRuntimeDefault: false;
225
+ enumValues: [string, ...string[]];
226
+ baseColumn: never;
227
+ identity: undefined;
228
+ generated: undefined;
229
+ }, {}, {
230
+ length: number | undefined;
231
+ }>;
232
+ user_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
233
+ name: "user_id";
234
+ tableName: "service_usage_events";
235
+ dataType: "string";
236
+ columnType: "SQLiteText";
237
+ data: string;
238
+ driverParam: string;
239
+ notNull: true;
240
+ hasDefault: false;
241
+ isPrimaryKey: false;
242
+ isAutoincrement: false;
243
+ hasRuntimeDefault: false;
244
+ enumValues: [string, ...string[]];
245
+ baseColumn: never;
246
+ identity: undefined;
247
+ generated: undefined;
248
+ }, {}, {
249
+ length: number | undefined;
250
+ }>;
251
+ service: import("drizzle-orm/sqlite-core").SQLiteColumn<{
252
+ name: "service";
253
+ tableName: "service_usage_events";
254
+ dataType: "string";
255
+ columnType: "SQLiteText";
256
+ data: string;
257
+ driverParam: string;
258
+ notNull: true;
259
+ hasDefault: false;
260
+ isPrimaryKey: false;
261
+ isAutoincrement: false;
262
+ hasRuntimeDefault: false;
263
+ enumValues: [string, ...string[]];
264
+ baseColumn: never;
265
+ identity: undefined;
266
+ generated: undefined;
267
+ }, {}, {
268
+ length: number | undefined;
269
+ }>;
270
+ model_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
271
+ name: "model_id";
272
+ tableName: "service_usage_events";
273
+ dataType: "string";
274
+ columnType: "SQLiteText";
275
+ data: string;
276
+ driverParam: string;
277
+ notNull: true;
278
+ hasDefault: false;
279
+ isPrimaryKey: false;
280
+ isAutoincrement: false;
281
+ hasRuntimeDefault: false;
282
+ enumValues: [string, ...string[]];
283
+ baseColumn: never;
284
+ identity: undefined;
285
+ generated: undefined;
286
+ }, {}, {
287
+ length: number | undefined;
288
+ }>;
289
+ status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
290
+ name: "status";
291
+ tableName: "service_usage_events";
292
+ dataType: "string";
293
+ columnType: "SQLiteText";
294
+ data: string;
295
+ driverParam: string;
296
+ notNull: true;
297
+ hasDefault: false;
298
+ isPrimaryKey: false;
299
+ isAutoincrement: false;
300
+ hasRuntimeDefault: false;
301
+ enumValues: [string, ...string[]];
302
+ baseColumn: never;
303
+ identity: undefined;
304
+ generated: undefined;
305
+ }, {}, {
306
+ length: number | undefined;
307
+ }>;
308
+ metadata_json: import("drizzle-orm/sqlite-core").SQLiteColumn<{
309
+ name: "metadata_json";
310
+ tableName: "service_usage_events";
311
+ dataType: "string";
312
+ columnType: "SQLiteText";
313
+ data: string;
314
+ driverParam: string;
315
+ notNull: true;
316
+ hasDefault: false;
317
+ isPrimaryKey: false;
318
+ isAutoincrement: false;
319
+ hasRuntimeDefault: false;
320
+ enumValues: [string, ...string[]];
321
+ baseColumn: never;
322
+ identity: undefined;
323
+ generated: undefined;
324
+ }, {}, {
325
+ length: number | undefined;
326
+ }>;
327
+ created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
328
+ name: "created_at";
329
+ tableName: "service_usage_events";
330
+ dataType: "string";
331
+ columnType: "SQLiteText";
332
+ data: string;
333
+ driverParam: string;
334
+ notNull: true;
335
+ hasDefault: false;
336
+ isPrimaryKey: false;
337
+ isAutoincrement: false;
338
+ hasRuntimeDefault: false;
339
+ enumValues: [string, ...string[]];
340
+ baseColumn: never;
341
+ identity: undefined;
342
+ generated: undefined;
343
+ }, {}, {
344
+ length: number | undefined;
345
+ }>;
346
+ };
347
+ dialect: "sqlite";
348
+ }>;
349
+ };
350
+ constructor(options?: UsageServiceOptions);
351
+ install(ctx: ServiceInstallContext): void;
352
+ }
353
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/usage/service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,kBAAkB,EAAE,KAAK,qBAAqB,EAAgB,MAAM,gBAAgB,CAAC;AAE9F;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAStB,CAAC;AAEH;;GAEG;AACH,qBAAa,YAAa,SAAQ,kBAAkB;IAMtC,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAA2B;gBAEb,OAAO,GAAE,mBAAwB;IAS9D,OAAO,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI;CAiD1C"}