@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,299 @@
1
+ /**
2
+ * @fileoverview Zod validation schemas for all API routes
3
+ * @description Defines parameter, body, and query schemas used by
4
+ * route handlers via @hono/zod-validator.
5
+ */
6
+ import { z } from "zod";
7
+ import { DEFAULT_MAX_OUTPUT_TOKENS } from "@sudobility/shapeshyft_engine/types";
8
+ // =============================================================================
9
+ // Common Param Schemas
10
+ // =============================================================================
11
+ export const uuidParamSchema = z.object({
12
+ uuid: z.string().uuid(),
13
+ });
14
+ export const userIdParamSchema = z.object({
15
+ userId: z.string().min(1).max(128),
16
+ });
17
+ export const projectIdParamSchema = z.object({
18
+ entitySlug: z.string().min(1).max(12),
19
+ projectId: z.string().uuid(),
20
+ });
21
+ export const endpointIdParamSchema = z.object({
22
+ entitySlug: z.string().min(1).max(12),
23
+ projectId: z.string().uuid(),
24
+ endpointId: z.string().uuid(),
25
+ });
26
+ export const entitySlugParamSchema = z.object({
27
+ entitySlug: z.string().min(1).max(12),
28
+ });
29
+ // Entity API keys ("<entity prefix>_...")
30
+ export const entityApiKeyIdParamSchema = z.object({
31
+ entitySlug: z.string().min(1).max(12),
32
+ keyId: z.string().uuid(),
33
+ });
34
+ export const entityApiKeyCreateSchema = z.object({
35
+ key_name: z.string().min(1).max(255),
36
+ });
37
+ export const entityApiKeyUpdateSchema = z
38
+ .object({
39
+ key_name: z.string().min(1).max(255).optional(),
40
+ is_active: z.boolean().optional(),
41
+ })
42
+ .refine(data => data.key_name !== undefined || data.is_active !== undefined, {
43
+ message: "Provide key_name or is_active",
44
+ });
45
+ export const aiParamSchema = z.object({
46
+ organizationPath: z
47
+ .string()
48
+ .min(1)
49
+ .max(255)
50
+ .regex(/^[a-zA-Z0-9_]+$/, "Must contain only letters, numbers, and underscores"),
51
+ projectName: z
52
+ .string()
53
+ .min(1)
54
+ .max(255)
55
+ .regex(/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/),
56
+ endpointName: z
57
+ .string()
58
+ .min(1)
59
+ .max(255)
60
+ .regex(/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/),
61
+ });
62
+ // =============================================================================
63
+ // LLM Provider Enum
64
+ // =============================================================================
65
+ export const llmProviderSchema = z.enum([
66
+ "openai",
67
+ "anthropic",
68
+ "gemini",
69
+ "mistral",
70
+ "cohere",
71
+ "groq",
72
+ "xai",
73
+ "deepseek",
74
+ "perplexity",
75
+ "lm_studio",
76
+ ]);
77
+ export const httpMethodSchema = z.enum(["GET", "POST"]);
78
+ // =============================================================================
79
+ // JSON Schema (simplified validation)
80
+ // =============================================================================
81
+ export const jsonSchemaSchema = z.lazy(() => z.record(z.union([
82
+ z.string(),
83
+ z.number(),
84
+ z.boolean(),
85
+ z.null(),
86
+ z.array(z.unknown()),
87
+ jsonSchemaSchema,
88
+ ])));
89
+ // =============================================================================
90
+ // Project Schemas
91
+ // =============================================================================
92
+ const projectNameRegex = /^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/;
93
+ export const projectCreateSchema = z.object({
94
+ project_name: z
95
+ .string()
96
+ .min(1)
97
+ .max(255)
98
+ .regex(projectNameRegex, "Must be lowercase alphanumeric with optional hyphens"),
99
+ display_name: z.string().min(1).max(255),
100
+ description: z.string().max(1000).nullish(),
101
+ });
102
+ export const projectUpdateSchema = z.object({
103
+ project_name: z.string().min(1).max(255).regex(projectNameRegex).optional(),
104
+ display_name: z.string().min(1).max(255).optional(),
105
+ description: z.string().max(1000).nullish(),
106
+ is_active: z.boolean().optional(),
107
+ });
108
+ // =============================================================================
109
+ // Endpoint Schemas
110
+ // =============================================================================
111
+ const endpointNameRegex = /^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/;
112
+ // IPv4 address validation
113
+ const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
114
+ export const ipv4Schema = z.string().regex(ipv4Regex, "Invalid IPv4 address");
115
+ export const ipAllowlistSchema = z.array(ipv4Schema).nullable().optional();
116
+ // Media output configuration schema
117
+ export const mediaOutputConfigSchema = z
118
+ .object({
119
+ audio: z.boolean().optional(),
120
+ image: z.boolean().optional(),
121
+ video: z.boolean().optional(),
122
+ })
123
+ .nullable()
124
+ .optional();
125
+ // Output media format schema
126
+ export const outputMediaFormatSchema = z
127
+ .enum(["base64", "url"])
128
+ .nullable()
129
+ .optional();
130
+ export const endpointCreateBaseSchema = z.object({
131
+ endpoint_name: z
132
+ .string()
133
+ .min(1)
134
+ .max(255)
135
+ .regex(endpointNameRegex, "Must be lowercase alphanumeric with optional hyphens"),
136
+ display_name: z.string().min(1).max(255),
137
+ http_method: httpMethodSchema.optional().default("POST"),
138
+ model: z.string().max(255).nullish(),
139
+ input_schema: jsonSchemaSchema.nullish(),
140
+ output_schema: jsonSchemaSchema.nullish(),
141
+ instructions: z.string().max(10000).nullish(),
142
+ context: z.string().max(10000).nullish(),
143
+ expects_media_output: mediaOutputConfigSchema,
144
+ output_media_format: outputMediaFormatSchema,
145
+ web_search: z.boolean().optional().default(false),
146
+ /**
147
+ * Sampling temperature, or null/omitted to leave it to the provider.
148
+ *
149
+ * 0 to 2 is OpenAI's and Gemini's range; Anthropic's is 0 to 1 and it will
150
+ * refuse anything above that. Deliberately not clamped per provider here: an
151
+ * endpoint can be pointed at another model after it is created, and a value
152
+ * silently rewritten at save time would then be the wrong one with nobody
153
+ * told. The provider's own 400 is the honest answer.
154
+ */
155
+ temperature: z.number().min(0).max(2).nullish(),
156
+ /**
157
+ * Output ceiling. Omitted -> DEFAULT_MAX_OUTPUT_TOKENS, so every creation
158
+ * path (dashboard, API, MCP) gets protection without asking. Explicit null ->
159
+ * no protection, for the operator who genuinely wants an uncapped endpoint.
160
+ */
161
+ max_output_tokens: z
162
+ .number()
163
+ .int()
164
+ .positive()
165
+ .max(1_000_000)
166
+ .nullish()
167
+ .default(DEFAULT_MAX_OUTPUT_TOKENS),
168
+ // For Whisper endpoints: model to use for structured extraction
169
+ transcription_extraction_model: z.string().max(255).nullish(),
170
+ });
171
+ export const endpointUpdateBaseSchema = z.object({
172
+ endpoint_name: z.string().min(1).max(255).regex(endpointNameRegex).optional(),
173
+ display_name: z.string().min(1).max(255).optional(),
174
+ http_method: httpMethodSchema.optional(),
175
+ model: z.string().max(255).nullish(),
176
+ input_schema: jsonSchemaSchema.nullish(),
177
+ output_schema: jsonSchemaSchema.nullish(),
178
+ instructions: z.string().max(10000).nullish(),
179
+ context: z.string().max(10000).nullish(),
180
+ is_active: z.boolean().optional(),
181
+ ip_allowlist: ipAllowlistSchema,
182
+ expects_media_output: mediaOutputConfigSchema,
183
+ output_media_format: outputMediaFormatSchema,
184
+ web_search: z.boolean().optional(),
185
+ /** Omitted -> unchanged; null -> say nothing about sampling again. */
186
+ temperature: z.number().min(0).max(2).nullish(),
187
+ /** Omitted -> unchanged; null -> remove the ceiling. */
188
+ max_output_tokens: z.number().int().positive().max(1_000_000).nullish(),
189
+ // For Whisper endpoints: model to use for structured extraction
190
+ transcription_extraction_model: z.string().max(255).nullish(),
191
+ });
192
+ export function createEndpointSchemas(binding = { create: {}, update: {} }) {
193
+ return {
194
+ endpointCreate: endpointCreateBaseSchema.extend(binding.create),
195
+ endpointUpdate: endpointUpdateBaseSchema.extend(binding.update),
196
+ };
197
+ }
198
+ // =============================================================================
199
+ // Analytics Query Schema
200
+ // =============================================================================
201
+ export const analyticsQuerySchema = z.object({
202
+ start_date: z
203
+ .string()
204
+ .regex(/^\d{4}-\d{2}-\d{2}$/)
205
+ .optional(),
206
+ end_date: z
207
+ .string()
208
+ .regex(/^\d{4}-\d{2}-\d{2}$/)
209
+ .optional(),
210
+ project_id: z.string().uuid().optional(),
211
+ endpoint_id: z.string().uuid().optional(),
212
+ });
213
+ // =============================================================================
214
+ // User API Key Schemas
215
+ // =============================================================================
216
+ export const apiKeyIdParamSchema = z.object({
217
+ userId: z.string().min(1).max(128),
218
+ keyId: z.string().uuid(),
219
+ });
220
+ export const userApiKeyCreateSchema = z.object({
221
+ key_name: z.string().min(1).max(255),
222
+ });
223
+ export const userApiKeyUpdateSchema = z.object({
224
+ key_name: z.string().min(1).max(255).optional(),
225
+ is_active: z.boolean().optional(),
226
+ });
227
+ // =============================================================================
228
+ // Settings Schemas
229
+ // =============================================================================
230
+ const organizationPathRegex = /^[a-zA-Z0-9_]+$/;
231
+ export const settingsUpdateSchema = z.object({
232
+ organization_name: z.string().min(1).max(255).optional(),
233
+ organization_path: z
234
+ .string()
235
+ .min(1)
236
+ .max(255)
237
+ .regex(organizationPathRegex, "Must contain only letters, numbers, and underscores")
238
+ .optional(),
239
+ });
240
+ // =============================================================================
241
+ // Storage Config Schemas
242
+ // =============================================================================
243
+ export const storageProviderSchema = z.enum(["gcs", "s3"]);
244
+ // GCS service account credentials schema
245
+ export const gcsCredentialsSchema = z.object({
246
+ type: z.literal("service_account"),
247
+ project_id: z.string().min(1),
248
+ private_key_id: z.string().min(1),
249
+ private_key: z.string().min(1),
250
+ client_email: z.string().email(),
251
+ client_id: z.string().min(1),
252
+ auth_uri: z.string().url().optional(),
253
+ token_uri: z.string().url().optional(),
254
+ auth_provider_x509_cert_url: z.string().url().optional(),
255
+ client_x509_cert_url: z.string().url().optional(),
256
+ });
257
+ // S3 credentials schema
258
+ export const s3CredentialsSchema = z.object({
259
+ access_key_id: z.string().min(1),
260
+ secret_access_key: z.string().min(1),
261
+ region: z.string().min(1),
262
+ });
263
+ // Storage config create schema
264
+ export const storageConfigCreateSchema = z
265
+ .object({
266
+ provider: storageProviderSchema,
267
+ bucket: z.string().min(1).max(255),
268
+ path_prefix: z.string().max(500).optional(),
269
+ credentials: z.union([gcsCredentialsSchema, s3CredentialsSchema]),
270
+ })
271
+ .refine(data => {
272
+ // Validate credentials match provider
273
+ if (data.provider === "gcs") {
274
+ return ("type" in data.credentials &&
275
+ data.credentials.type === "service_account");
276
+ }
277
+ else {
278
+ return "access_key_id" in data.credentials;
279
+ }
280
+ }, {
281
+ message: "Credentials must match the storage provider type",
282
+ });
283
+ // Storage config update schema (credentials optional for partial update)
284
+ export const storageConfigUpdateSchema = z.object({
285
+ bucket: z.string().min(1).max(255).optional(),
286
+ path_prefix: z.string().max(500).nullable().optional(),
287
+ credentials: z.union([gcsCredentialsSchema, s3CredentialsSchema]).optional(),
288
+ });
289
+ // Storage config response schema (safe version without credentials)
290
+ export const storageConfigResponseSchema = z.object({
291
+ uuid: z.string().uuid(),
292
+ entity_id: z.string().uuid(),
293
+ provider: storageProviderSchema,
294
+ bucket: z.string(),
295
+ path_prefix: z.string().nullable(),
296
+ created_at: z.string().datetime().nullable(),
297
+ updated_at: z.string().datetime().nullable(),
298
+ });
299
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @fileoverview Assemble the service: context, routers, and the /api/v1 route tree
3
+ */
4
+ import { Hono, type MiddlewareHandler } from "hono";
5
+ import { type ServiceContext, type ShapeshyftServiceConfig } from "./context.js";
6
+ export interface BuildRoutesOptions {
7
+ /** Replaces the Firebase/API-key middleware on admin routes (tests). */
8
+ authMiddleware?: MiddlewareHandler;
9
+ /**
10
+ * Mount product routes on the authenticated admin app. Runs before the shared
11
+ * admin routes, so a literal segment such as `/entities/self/...` is matched
12
+ * before `/entities/:entitySlug` can claim it.
13
+ */
14
+ mountAdmin?: (admin: Hono) => void;
15
+ }
16
+ export interface ShapeshyftService {
17
+ ctx: ServiceContext;
18
+ routers: {
19
+ ai: Hono;
20
+ providers: Hono;
21
+ projects: Hono;
22
+ endpoints: Hono;
23
+ analytics: Hono;
24
+ settings: Hono;
25
+ ratelimits: Hono;
26
+ entities: Hono<any>;
27
+ invitations: Hono<any>;
28
+ storage: Hono;
29
+ users: Hono;
30
+ userApiKeys: Hono;
31
+ entityApiKeys: Hono;
32
+ };
33
+ middleware: {
34
+ firebaseAuth: MiddlewareHandler;
35
+ rateLimit: MiddlewareHandler;
36
+ };
37
+ /** The route tree to mount at `/api/v1`. */
38
+ buildRoutes(options?: BuildRoutesOptions): Hono;
39
+ }
40
+ export declare function createShapeshyftService(config: ShapeshyftServiceConfig): ShapeshyftService;
41
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACpD,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;AAgBtB,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE;QACP,EAAE,EAAE,IAAI,CAAC;QACT,SAAS,EAAE,IAAI,CAAC;QAChB,QAAQ,EAAE,IAAI,CAAC;QACf,SAAS,EAAE,IAAI,CAAC;QAChB,SAAS,EAAE,IAAI,CAAC;QAChB,QAAQ,EAAE,IAAI,CAAC;QACf,UAAU,EAAE,IAAI,CAAC;QACjB,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,EAAE,IAAI,CAAC;QACd,KAAK,EAAE,IAAI,CAAC;QACZ,WAAW,EAAE,IAAI,CAAC;QAClB,aAAa,EAAE,IAAI,CAAC;KACrB,CAAC;IACF,UAAU,EAAE;QACV,YAAY,EAAE,iBAAiB,CAAC;QAChC,SAAS,EAAE,iBAAiB,CAAC;KAC9B,CAAC;IACF,4CAA4C;IAC5C,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACjD;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,iBAAiB,CA2DnB"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @fileoverview Assemble the service: context, routers, and the /api/v1 route tree
3
+ */
4
+ import { Hono } from "hono";
5
+ import { buildContext, } from "./context.js";
6
+ import { createFirebaseAuthMiddleware } from "./middleware/firebaseAuth.js";
7
+ import { createAiRouter } from "./routes/ai.js";
8
+ import { createProvidersRouter } from "./routes/providers.js";
9
+ import { createProjectsRouter } from "./routes/projects.js";
10
+ import { createEndpointsRouter } from "./routes/endpoints.js";
11
+ import { createAnalyticsRouter } from "./routes/analytics.js";
12
+ import { createSettingsRouter } from "./routes/settings.js";
13
+ import { createRatelimitsRouter } from "./routes/ratelimits.js";
14
+ import { createEntitiesRouter } from "./routes/entities.js";
15
+ import { createInvitationsRouter } from "./routes/invitations.js";
16
+ import { createStorageRouter } from "./routes/storage.js";
17
+ import { createUsersRouter } from "./routes/users.js";
18
+ import { createUserApiKeysRouter } from "./routes/user-api-keys.js";
19
+ import { createEntityApiKeysRouter } from "./routes/entity-api-keys.js";
20
+ export function createShapeshyftService(config) {
21
+ const ctx = buildContext(config);
22
+ const routers = {
23
+ ai: createAiRouter(ctx),
24
+ providers: createProvidersRouter(),
25
+ projects: createProjectsRouter(ctx),
26
+ endpoints: createEndpointsRouter(ctx),
27
+ analytics: createAnalyticsRouter(ctx),
28
+ settings: createSettingsRouter(ctx),
29
+ ratelimits: createRatelimitsRouter(ctx),
30
+ entities: createEntitiesRouter(ctx),
31
+ invitations: createInvitationsRouter(ctx),
32
+ storage: createStorageRouter(ctx),
33
+ users: createUsersRouter(ctx),
34
+ userApiKeys: createUserApiKeysRouter(ctx),
35
+ entityApiKeys: createEntityApiKeysRouter(ctx),
36
+ };
37
+ const firebaseAuth = createFirebaseAuthMiddleware(ctx);
38
+ function buildRoutes(options = {}) {
39
+ const routes = new Hono();
40
+ // Public routes (no auth) -- registered before the admin wildcard
41
+ routes.route("/ai", routers.ai);
42
+ routes.route("/providers", routers.providers);
43
+ const admin = new Hono();
44
+ admin.use("*", options.authMiddleware ?? firebaseAuth);
45
+ options.mountAdmin?.(admin);
46
+ admin.route("/entities/:entitySlug/api-keys", routers.entityApiKeys);
47
+ admin.route("/entities/:entitySlug/storage", routers.storage);
48
+ admin.route("/entities/:entitySlug/projects", routers.projects);
49
+ admin.route("/entities/:entitySlug/projects/:projectId/endpoints", routers.endpoints);
50
+ admin.route("/entities/:entitySlug/analytics", routers.analytics);
51
+ admin.route("/ratelimits/:rateLimitUserId", routers.ratelimits);
52
+ admin.route("/users/:userId/settings", routers.settings);
53
+ admin.route("/users/:userId/api-keys", routers.userApiKeys);
54
+ admin.route("/entities", routers.entities);
55
+ admin.route("/invitations", routers.invitations);
56
+ admin.route("/users", routers.users);
57
+ routes.route("/", admin);
58
+ return routes;
59
+ }
60
+ return {
61
+ ctx,
62
+ routers,
63
+ middleware: {
64
+ firebaseAuth,
65
+ rateLimit: ctx.rateLimiting.rateLimitHandler,
66
+ },
67
+ buildRoutes,
68
+ };
69
+ }
70
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@sudobility/shapeshyft_service",
3
+ "version": "1.0.0",
4
+ "description": "Shared tables, routes and middleware for ShapeShyft-style structured-output APIs",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist/**/*",
16
+ "CLAUDE.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.esm.json",
20
+ "clean": "rm -rf dist",
21
+ "typecheck": "tsc --noEmit",
22
+ "lint": "eslint src/",
23
+ "lint:fix": "eslint src/ --fix",
24
+ "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
27
+ "test:db": "vitest run --config vitest.db.config.ts",
28
+ "verify": "bun run typecheck && bun run lint && bun run test && bun run build",
29
+ "prepublishOnly": "bun run clean && bun run verify"
30
+ },
31
+ "author": "Sudobility",
32
+ "license": "BUSL-1.1",
33
+ "dependencies": {
34
+ "@hono/zod-validator": "^0.7.5",
35
+ "@sudobility/shapeshyft_engine": "^1.0.0",
36
+ "zod": "^3.24.0"
37
+ },
38
+ "peerDependencies": {
39
+ "@sudobility/auth_service": "^1.1.21",
40
+ "@sudobility/entity_service": "^1.0.41",
41
+ "@sudobility/ratelimit_service": "^1.0.39",
42
+ "@sudobility/subscription_service": "^1.0.23",
43
+ "@sudobility/types": "^1.9.67",
44
+ "drizzle-orm": "^0.45.0",
45
+ "firebase-admin": "^13.6.0",
46
+ "hono": "^4.10.7",
47
+ "postgres": "^3.4.7"
48
+ },
49
+ "devDependencies": {
50
+ "@anthropic-ai/sdk": "^0.39.0",
51
+ "@google/generative-ai": "^0.21.0",
52
+ "@sudobility/auth_service": "^1.1.21",
53
+ "@sudobility/entity_service": "^1.0.41",
54
+ "@sudobility/ratelimit_service": "^1.0.39",
55
+ "@sudobility/subscription_service": "^1.0.23",
56
+ "@sudobility/test-db-guard": "1.0.2",
57
+ "@sudobility/types": "^1.9.67",
58
+ "@types/bun": "latest",
59
+ "@types/node": "^24.10.1",
60
+ "@typescript-eslint/eslint-plugin": "^8.50.0",
61
+ "@typescript-eslint/parser": "^8.50.0",
62
+ "drizzle-orm": "^0.45.0",
63
+ "eslint": "^9.39.2",
64
+ "eslint-plugin-import": "^2.32.0",
65
+ "firebase-admin": "^13.6.0",
66
+ "groq-sdk": "^0.37.0",
67
+ "hono": "^4.10.7",
68
+ "openai": "^4.77.0",
69
+ "postgres": "^3.4.7",
70
+ "prettier": "^3.7.4",
71
+ "sharp": "^0.34.5",
72
+ "typescript": "^5.9.3",
73
+ "vitest": "^4.0.4"
74
+ },
75
+ "overrides": {
76
+ "esbuild": "0.25.12"
77
+ },
78
+ "publishConfig": {
79
+ "access": "public"
80
+ },
81
+ "repository": {
82
+ "type": "git",
83
+ "url": "https://github.com/johnqh/shapeshyft_service.git"
84
+ }
85
+ }