@sudobility/shapeshyft_service 1.0.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 (127) hide show
  1. package/CLAUDE.md +35 -0
  2. package/README.md +17 -0
  3. package/dist/context.d.ts +62 -0
  4. package/dist/context.d.ts.map +1 -0
  5. package/dist/context.js +55 -0
  6. package/dist/context.js.map +1 -0
  7. package/dist/contracts.d.ts +110 -0
  8. package/dist/contracts.d.ts.map +1 -0
  9. package/dist/contracts.js +7 -0
  10. package/dist/contracts.js.map +1 -0
  11. package/dist/index.d.ts +17 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +16 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/lib/api-key.d.ts +22 -0
  16. package/dist/lib/api-key.d.ts.map +1 -0
  17. package/dist/lib/api-key.js +87 -0
  18. package/dist/lib/api-key.js.map +1 -0
  19. package/dist/lib/encryption.d.ts +22 -0
  20. package/dist/lib/encryption.d.ts.map +1 -0
  21. package/dist/lib/encryption.js +41 -0
  22. package/dist/lib/encryption.js.map +1 -0
  23. package/dist/lib/entity-api-key.d.ts +21 -0
  24. package/dist/lib/entity-api-key.d.ts.map +1 -0
  25. package/dist/lib/entity-api-key.js +54 -0
  26. package/dist/lib/entity-api-key.js.map +1 -0
  27. package/dist/lib/entity-helpers.d.ts +90 -0
  28. package/dist/lib/entity-helpers.d.ts.map +1 -0
  29. package/dist/lib/entity-helpers.js +136 -0
  30. package/dist/lib/entity-helpers.js.map +1 -0
  31. package/dist/lib/money.d.ts +7 -0
  32. package/dist/lib/money.d.ts.map +1 -0
  33. package/dist/lib/money.js +9 -0
  34. package/dist/lib/money.js.map +1 -0
  35. package/dist/lib/public-project.d.ts +14 -0
  36. package/dist/lib/public-project.d.ts.map +1 -0
  37. package/dist/lib/public-project.js +17 -0
  38. package/dist/lib/public-project.js.map +1 -0
  39. package/dist/lib/user-api-key-cache.d.ts +35 -0
  40. package/dist/lib/user-api-key-cache.d.ts.map +1 -0
  41. package/dist/lib/user-api-key-cache.js +99 -0
  42. package/dist/lib/user-api-key-cache.js.map +1 -0
  43. package/dist/lib/user-api-key.d.ts +46 -0
  44. package/dist/lib/user-api-key.d.ts.map +1 -0
  45. package/dist/lib/user-api-key.js +102 -0
  46. package/dist/lib/user-api-key.js.map +1 -0
  47. package/dist/middleware/firebaseAuth.d.ts +34 -0
  48. package/dist/middleware/firebaseAuth.d.ts.map +1 -0
  49. package/dist/middleware/firebaseAuth.js +133 -0
  50. package/dist/middleware/firebaseAuth.js.map +1 -0
  51. package/dist/middleware/rateLimit.d.ts +29 -0
  52. package/dist/middleware/rateLimit.d.ts.map +1 -0
  53. package/dist/middleware/rateLimit.js +85 -0
  54. package/dist/middleware/rateLimit.js.map +1 -0
  55. package/dist/middleware/subscription.d.ts +8 -0
  56. package/dist/middleware/subscription.d.ts.map +1 -0
  57. package/dist/middleware/subscription.js +19 -0
  58. package/dist/middleware/subscription.js.map +1 -0
  59. package/dist/routes/ai.d.ts +10 -0
  60. package/dist/routes/ai.d.ts.map +1 -0
  61. package/dist/routes/ai.js +698 -0
  62. package/dist/routes/ai.js.map +1 -0
  63. package/dist/routes/analytics.d.ts +9 -0
  64. package/dist/routes/analytics.d.ts.map +1 -0
  65. package/dist/routes/analytics.js +192 -0
  66. package/dist/routes/analytics.js.map +1 -0
  67. package/dist/routes/endpoints.d.ts +10 -0
  68. package/dist/routes/endpoints.d.ts.map +1 -0
  69. package/dist/routes/endpoints.js +255 -0
  70. package/dist/routes/endpoints.js.map +1 -0
  71. package/dist/routes/entities.d.ts +15 -0
  72. package/dist/routes/entities.d.ts.map +1 -0
  73. package/dist/routes/entities.js +332 -0
  74. package/dist/routes/entities.js.map +1 -0
  75. package/dist/routes/entity-api-keys.d.ts +17 -0
  76. package/dist/routes/entity-api-keys.d.ts.map +1 -0
  77. package/dist/routes/entity-api-keys.js +142 -0
  78. package/dist/routes/entity-api-keys.js.map +1 -0
  79. package/dist/routes/invitations.d.ts +15 -0
  80. package/dist/routes/invitations.d.ts.map +1 -0
  81. package/dist/routes/invitations.js +58 -0
  82. package/dist/routes/invitations.js.map +1 -0
  83. package/dist/routes/projects.d.ts +9 -0
  84. package/dist/routes/projects.d.ts.map +1 -0
  85. package/dist/routes/projects.js +241 -0
  86. package/dist/routes/projects.js.map +1 -0
  87. package/dist/routes/providers.d.ts +9 -0
  88. package/dist/routes/providers.d.ts.map +1 -0
  89. package/dist/routes/providers.js +89 -0
  90. package/dist/routes/providers.js.map +1 -0
  91. package/dist/routes/ratelimits.d.ts +9 -0
  92. package/dist/routes/ratelimits.d.ts.map +1 -0
  93. package/dist/routes/ratelimits.js +171 -0
  94. package/dist/routes/ratelimits.js.map +1 -0
  95. package/dist/routes/settings.d.ts +9 -0
  96. package/dist/routes/settings.d.ts.map +1 -0
  97. package/dist/routes/settings.js +138 -0
  98. package/dist/routes/settings.js.map +1 -0
  99. package/dist/routes/storage.d.ts +9 -0
  100. package/dist/routes/storage.d.ts.map +1 -0
  101. package/dist/routes/storage.js +180 -0
  102. package/dist/routes/storage.js.map +1 -0
  103. package/dist/routes/user-api-keys.d.ts +14 -0
  104. package/dist/routes/user-api-keys.d.ts.map +1 -0
  105. package/dist/routes/user-api-keys.js +237 -0
  106. package/dist/routes/user-api-keys.js.map +1 -0
  107. package/dist/routes/users.d.ts +7 -0
  108. package/dist/routes/users.d.ts.map +1 -0
  109. package/dist/routes/users.js +102 -0
  110. package/dist/routes/users.js.map +1 -0
  111. package/dist/schema/init.d.ts +12 -0
  112. package/dist/schema/init.d.ts.map +1 -0
  113. package/dist/schema/init.js +404 -0
  114. package/dist/schema/init.js.map +1 -0
  115. package/dist/schema/tables.d.ts +2110 -0
  116. package/dist/schema/tables.d.ts.map +1 -0
  117. package/dist/schema/tables.js +251 -0
  118. package/dist/schema/tables.js.map +1 -0
  119. package/dist/schemas/index.d.ts +671 -0
  120. package/dist/schemas/index.d.ts.map +1 -0
  121. package/dist/schemas/index.js +299 -0
  122. package/dist/schemas/index.js.map +1 -0
  123. package/dist/service.d.ts +41 -0
  124. package/dist/service.d.ts.map +1 -0
  125. package/dist/service.js +70 -0
  126. package/dist/service.js.map +1 -0
  127. package/package.json +85 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/schema/tables.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,QAAQ,EAWd,MAAM,qBAAqB,CAAC;AAS7B,eAAO,MAAM,mBAAmB,uHAWtB,CAAC;AAEX,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoR9B;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * @fileoverview Drizzle table factories for the shared schema
3
+ * @description Everything in shapeshyft_api's schema except `llm_api_keys`,
4
+ * built against a caller-supplied pgSchema so each product keeps its own
5
+ * PostgreSQL schema (`shapeshyft`, `shaperouter`).
6
+ */
7
+ import { pgEnum, uuid, varchar, text, boolean, timestamp, integer, jsonb, real, uniqueIndex, index, } from "drizzle-orm/pg-core";
8
+ import { createRateLimitCountersTable } from "@sudobility/ratelimit_service";
9
+ import { createEntitiesTable, createEntityMembersTable, createEntityInvitationsTable, createEntityApiKeysTable, } from "@sudobility/entity_service";
10
+ export const LLM_PROVIDER_VALUES = [
11
+ "openai",
12
+ "anthropic",
13
+ "gemini",
14
+ "mistral",
15
+ "cohere",
16
+ "groq",
17
+ "xai",
18
+ "deepseek",
19
+ "perplexity",
20
+ "lm_studio",
21
+ ];
22
+ export function createServiceTables(schema, opts) {
23
+ const p = opts.indexPrefix;
24
+ const llmProviderEnum = pgEnum("llm_provider", LLM_PROVIDER_VALUES);
25
+ const httpMethodEnum = pgEnum("http_method", ["GET", "POST"]);
26
+ // =============================================================================
27
+ // Users Table
28
+ // firebase_uid is the primary key - no internal UUID needed
29
+ // =============================================================================
30
+ const users = schema.table("users", {
31
+ firebase_uid: varchar("firebase_uid", { length: 128 }).primaryKey(),
32
+ email: varchar("email", { length: 255 }),
33
+ display_name: varchar("display_name", { length: 255 }),
34
+ created_at: timestamp("created_at").defaultNow(),
35
+ updated_at: timestamp("updated_at").defaultNow(),
36
+ });
37
+ // =============================================================================
38
+ // User Settings Table
39
+ // =============================================================================
40
+ const userSettings = schema.table("user_settings", {
41
+ id: uuid("id").primaryKey().defaultRandom(),
42
+ firebase_uid: varchar("firebase_uid", { length: 128 })
43
+ .notNull()
44
+ .references(() => users.firebase_uid, { onDelete: "cascade" })
45
+ .unique(),
46
+ organization_name: varchar("organization_name", { length: 255 }),
47
+ organization_path: varchar("organization_path", { length: 255 })
48
+ .notNull()
49
+ .unique(),
50
+ created_at: timestamp("created_at").defaultNow(),
51
+ updated_at: timestamp("updated_at").defaultNow(),
52
+ });
53
+ // =============================================================================
54
+ // Entity Tables (from @sudobility/entity_service)
55
+ // Must be defined before tables that reference them
56
+ // =============================================================================
57
+ const entities = createEntitiesTable(schema, p);
58
+ const entityMembers = createEntityMembersTable(schema, p);
59
+ const entityInvitations = createEntityInvitationsTable(schema, p);
60
+ /**
61
+ * Entity-scoped API keys ("<entity prefix>_..."). Authenticate a caller as the entity
62
+ * itself -- CI jobs, scripts, and MCP clients that outlive any one member.
63
+ * Hash-only storage, so a key is revealed once at creation.
64
+ */
65
+ const entityApiKeys = createEntityApiKeysTable(schema, p);
66
+ // =============================================================================
67
+ // Entity Storage Configs Table
68
+ // User-provided cloud storage configuration for generated media
69
+ // =============================================================================
70
+ const entityStorageConfigs = schema.table("entity_storage_configs", {
71
+ uuid: uuid("uuid").primaryKey().defaultRandom(),
72
+ entity_id: uuid("entity_id")
73
+ .notNull()
74
+ .references(() => entities.id, { onDelete: "cascade" })
75
+ .unique(), // One storage config per entity
76
+ provider: varchar("provider", { length: 20 }).notNull(), // "gcs" | "s3"
77
+ bucket: varchar("bucket", { length: 255 }).notNull(),
78
+ path_prefix: varchar("path_prefix", { length: 500 }), // e.g., "generated/"
79
+ // Encrypted credentials (AES-256-CBC, see lib/encryption)
80
+ encrypted_credentials: text("encrypted_credentials").notNull(),
81
+ encryption_iv: varchar("encryption_iv", { length: 32 }).notNull(),
82
+ // Audit fields
83
+ created_at: timestamp("created_at").defaultNow(),
84
+ updated_at: timestamp("updated_at").defaultNow(),
85
+ created_by: varchar("created_by", { length: 128 }).notNull(), // Firebase UID
86
+ }, table => ({
87
+ entityIdx: index(`${p}_entity_storage_configs_entity_idx`).on(table.entity_id),
88
+ }));
89
+ // =============================================================================
90
+ // User API Keys Table
91
+ // Personal API keys ("<user prefix>...") that authenticate a user against the admin
92
+ // routes exactly as a Firebase ID token does. A user may hold several.
93
+ // Looked up by SHA-256 hash; the encrypted copy exists so the owner can reveal
94
+ // the key again from the dashboard.
95
+ // =============================================================================
96
+ const userApiKeys = schema.table("user_api_keys", {
97
+ uuid: uuid("uuid").primaryKey().defaultRandom(),
98
+ firebase_uid: varchar("firebase_uid", { length: 128 })
99
+ .notNull()
100
+ .references(() => users.firebase_uid, { onDelete: "cascade" }),
101
+ key_name: varchar("key_name", { length: 255 }).notNull(),
102
+ /** SHA-256 hex digest of the key — the authentication lookup index */
103
+ key_hash: varchar("key_hash", { length: 64 }).notNull().unique(),
104
+ /** First characters of the key, for display in listings */
105
+ key_prefix: varchar("key_prefix", { length: 20 }).notNull(),
106
+ /** AES-256-CBC ciphertext so the owner can copy the key again */
107
+ encrypted_key: text("encrypted_key").notNull(),
108
+ encryption_iv: varchar("encryption_iv", { length: 32 }).notNull(),
109
+ is_active: boolean("is_active").default(true).notNull(),
110
+ last_used_at: timestamp("last_used_at"),
111
+ created_at: timestamp("created_at").defaultNow(),
112
+ updated_at: timestamp("updated_at").defaultNow(),
113
+ }, table => ({
114
+ userIdx: index(`${p}_user_api_keys_user_idx`).on(table.firebase_uid),
115
+ hashIdx: uniqueIndex(`${p}_user_api_keys_hash_idx`).on(table.key_hash),
116
+ }));
117
+ // =============================================================================
118
+ // Projects Table
119
+ // =============================================================================
120
+ const projects = schema.table("projects", {
121
+ uuid: uuid("uuid").primaryKey().defaultRandom(),
122
+ entity_id: uuid("entity_id")
123
+ .notNull()
124
+ .references(() => entities.id, { onDelete: "cascade" }),
125
+ project_name: varchar("project_name", { length: 255 }).notNull(),
126
+ display_name: varchar("display_name", { length: 255 }).notNull(),
127
+ description: text("description"),
128
+ is_active: boolean("is_active").default(true),
129
+ // API Key fields
130
+ encrypted_api_key: text("encrypted_api_key"),
131
+ api_key_iv: varchar("api_key_iv", { length: 32 }),
132
+ api_key_prefix: varchar("api_key_prefix", { length: 20 }),
133
+ api_key_created_at: timestamp("api_key_created_at"),
134
+ created_at: timestamp("created_at").defaultNow(),
135
+ updated_at: timestamp("updated_at").defaultNow(),
136
+ }, table => ({
137
+ uniqueProjectPerEntity: uniqueIndex("unique_project_per_entity").on(table.entity_id, table.project_name),
138
+ entityIdx: index(`${p}_projects_entity_idx`).on(table.entity_id),
139
+ }));
140
+ // =============================================================================
141
+ // Endpoints Table
142
+ // =============================================================================
143
+ const endpoints = schema.table("endpoints", {
144
+ uuid: uuid("uuid").primaryKey().defaultRandom(),
145
+ project_id: uuid("project_id")
146
+ .notNull()
147
+ .references(() => projects.uuid, { onDelete: "cascade" }),
148
+ endpoint_name: varchar("endpoint_name", { length: 255 }).notNull(),
149
+ display_name: varchar("display_name", { length: 255 }).notNull(),
150
+ http_method: httpMethodEnum("http_method").notNull().default("POST"),
151
+ /**
152
+ * The product's credential binding. ShapeShyft stores an llm_api_keys UUID
153
+ * and adds its own foreign key; products with site-owned provider keys
154
+ * leave it null. No reference here: the service has no key table.
155
+ */
156
+ llm_key_id: uuid("llm_key_id"),
157
+ /**
158
+ * Provider this endpoint calls, written by bindEndpoint on create/update.
159
+ * Nullable so a rolling deploy cannot break inserts from an older server;
160
+ * the invoke path uses the resolver's provider, never this column alone.
161
+ */
162
+ provider: llmProviderEnum("provider"),
163
+ model: varchar("model", { length: 255 }),
164
+ input_schema: jsonb("input_schema"),
165
+ output_schema: jsonb("output_schema"),
166
+ instructions: text("instructions"),
167
+ context: text("context"),
168
+ is_active: boolean("is_active").default(true),
169
+ // IP Allowlist - JSON array of IPv4 addresses, null = allow all
170
+ ip_allowlist: jsonb("ip_allowlist"),
171
+ // Media output configuration - what media types this endpoint expects to generate
172
+ expects_media_output: jsonb("expects_media_output"),
173
+ // How to return generated media ("base64" for inline, "url" for cloud storage)
174
+ output_media_format: varchar("output_media_format", { length: 20 }),
175
+ // Enable web search for supported providers (OpenAI Responses API)
176
+ web_search: boolean("web_search").default(false),
177
+ /**
178
+ * Sampling temperature for this endpoint's model, or NULL to say nothing.
179
+ *
180
+ * NULL rather than a default of 0, and the distinction is load-bearing:
181
+ * the adapters disagree about what "unset" means. OpenAI, Gemini, Groq and
182
+ * the custom provider default it to 0; Anthropic omits the field entirely,
183
+ * because Opus 4.7+ and Sonnet 5 reject `temperature` with a 400. A column
184
+ * defaulting to 0 would start sending a value to the models that refuse
185
+ * one, so every endpoint that predates this keeps its NULL and its
186
+ * behaviour.
187
+ */
188
+ temperature: real("temperature"),
189
+ /**
190
+ * Ceiling on tokens the model may generate per invocation.
191
+ *
192
+ * Deliberately has NO database default: a NULL means "no protection", and
193
+ * every endpoint that predates this column keeps that NULL. New endpoints
194
+ * get DEFAULT_MAX_OUTPUT_TOKENS applied at the API layer instead, so the
195
+ * default reaches new rows without silently re-capping existing ones.
196
+ */
197
+ max_output_tokens: integer("max_output_tokens"),
198
+ // For Whisper endpoints: model to use for structured extraction from transcription
199
+ transcription_extraction_model: varchar("transcription_extraction_model", {
200
+ length: 255,
201
+ }),
202
+ /**
203
+ * Lifetime invocation count, incremented on every call -- successful or
204
+ * failed -- alongside the usage_analytics row for that call.
205
+ */
206
+ call_count: integer("call_count").notNull().default(0),
207
+ created_at: timestamp("created_at").defaultNow(),
208
+ updated_at: timestamp("updated_at").defaultNow(),
209
+ }, table => ({
210
+ uniqueEndpointPerProject: uniqueIndex("unique_endpoint_per_project").on(table.project_id, table.endpoint_name),
211
+ projectIdx: index(`${p}_endpoints_project_idx`).on(table.project_id),
212
+ }));
213
+ // =============================================================================
214
+ // Usage Analytics Table
215
+ // =============================================================================
216
+ const usageAnalytics = schema.table("usage_analytics", {
217
+ uuid: uuid("uuid").primaryKey().defaultRandom(),
218
+ endpoint_id: uuid("endpoint_id")
219
+ .notNull()
220
+ .references(() => endpoints.uuid, { onDelete: "cascade" }),
221
+ timestamp: timestamp("timestamp").notNull().defaultNow(),
222
+ success: boolean("success").notNull(),
223
+ error_message: text("error_message"),
224
+ tokens_input: integer("tokens_input"),
225
+ tokens_output: integer("tokens_output"),
226
+ latency_ms: integer("latency_ms"),
227
+ estimated_cost_cents: integer("estimated_cost_cents"),
228
+ request_metadata: jsonb("request_metadata"),
229
+ });
230
+ // =============================================================================
231
+ // Rate Limit Counters Table (from @sudobility/subscription_service)
232
+ // =============================================================================
233
+ const rateLimitCounters = createRateLimitCountersTable(schema, p);
234
+ return {
235
+ llmProviderEnum,
236
+ httpMethodEnum,
237
+ users,
238
+ userSettings,
239
+ entities,
240
+ entityMembers,
241
+ entityInvitations,
242
+ entityApiKeys,
243
+ entityStorageConfigs,
244
+ userApiKeys,
245
+ projects,
246
+ endpoints,
247
+ usageAnalytics,
248
+ rateLimitCounters,
249
+ };
250
+ }
251
+ //# sourceMappingURL=tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/schema/tables.ts"],"names":[],"mappings":"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"}