@wopr-network/platform-core 1.68.0 → 1.70.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 (93) hide show
  1. package/dist/backup/types.d.ts +1 -1
  2. package/dist/db/schema/pool-config.d.ts +41 -0
  3. package/dist/db/schema/pool-config.js +5 -0
  4. package/dist/db/schema/pool-instances.d.ts +126 -0
  5. package/dist/db/schema/pool-instances.js +10 -0
  6. package/dist/server/__tests__/build-container.test.d.ts +1 -0
  7. package/dist/server/__tests__/build-container.test.js +339 -0
  8. package/dist/server/__tests__/container.test.d.ts +1 -0
  9. package/dist/server/__tests__/container.test.js +173 -0
  10. package/dist/server/__tests__/lifecycle.test.d.ts +1 -0
  11. package/dist/server/__tests__/lifecycle.test.js +90 -0
  12. package/dist/server/__tests__/mount-routes.test.d.ts +1 -0
  13. package/dist/server/__tests__/mount-routes.test.js +151 -0
  14. package/dist/server/boot-config.d.ts +51 -0
  15. package/dist/server/boot-config.js +7 -0
  16. package/dist/server/container.d.ts +97 -0
  17. package/dist/server/container.js +148 -0
  18. package/dist/server/index.d.ts +33 -0
  19. package/dist/server/index.js +66 -0
  20. package/dist/server/lifecycle.d.ts +25 -0
  21. package/dist/server/lifecycle.js +56 -0
  22. package/dist/server/middleware/__tests__/admin-auth.test.d.ts +1 -0
  23. package/dist/server/middleware/__tests__/admin-auth.test.js +59 -0
  24. package/dist/server/middleware/__tests__/tenant-proxy.test.d.ts +1 -0
  25. package/dist/server/middleware/__tests__/tenant-proxy.test.js +268 -0
  26. package/dist/server/middleware/admin-auth.d.ts +18 -0
  27. package/dist/server/middleware/admin-auth.js +38 -0
  28. package/dist/server/middleware/tenant-proxy.d.ts +56 -0
  29. package/dist/server/middleware/tenant-proxy.js +162 -0
  30. package/dist/server/mount-routes.d.ts +30 -0
  31. package/dist/server/mount-routes.js +74 -0
  32. package/dist/server/routes/__tests__/admin.test.d.ts +1 -0
  33. package/dist/server/routes/__tests__/admin.test.js +267 -0
  34. package/dist/server/routes/__tests__/crypto-webhook.test.d.ts +1 -0
  35. package/dist/server/routes/__tests__/crypto-webhook.test.js +137 -0
  36. package/dist/server/routes/__tests__/provision-webhook.test.d.ts +1 -0
  37. package/dist/server/routes/__tests__/provision-webhook.test.js +212 -0
  38. package/dist/server/routes/__tests__/stripe-webhook.test.d.ts +1 -0
  39. package/dist/server/routes/__tests__/stripe-webhook.test.js +65 -0
  40. package/dist/server/routes/admin.d.ts +129 -0
  41. package/dist/server/routes/admin.js +294 -0
  42. package/dist/server/routes/crypto-webhook.d.ts +23 -0
  43. package/dist/server/routes/crypto-webhook.js +82 -0
  44. package/dist/server/routes/provision-webhook.d.ts +38 -0
  45. package/dist/server/routes/provision-webhook.js +160 -0
  46. package/dist/server/routes/stripe-webhook.d.ts +10 -0
  47. package/dist/server/routes/stripe-webhook.js +29 -0
  48. package/dist/server/services/hot-pool-claim.d.ts +30 -0
  49. package/dist/server/services/hot-pool-claim.js +92 -0
  50. package/dist/server/services/hot-pool.d.ts +25 -0
  51. package/dist/server/services/hot-pool.js +129 -0
  52. package/dist/server/services/pool-repository.d.ts +44 -0
  53. package/dist/server/services/pool-repository.js +72 -0
  54. package/dist/server/test-container.d.ts +15 -0
  55. package/dist/server/test-container.js +103 -0
  56. package/dist/trpc/auth-helpers.d.ts +17 -0
  57. package/dist/trpc/auth-helpers.js +26 -0
  58. package/dist/trpc/container-factories.d.ts +300 -0
  59. package/dist/trpc/container-factories.js +80 -0
  60. package/dist/trpc/index.d.ts +2 -0
  61. package/dist/trpc/index.js +2 -0
  62. package/drizzle/migrations/0025_hot_pool_tables.sql +29 -0
  63. package/package.json +5 -1
  64. package/src/db/schema/pool-config.ts +6 -0
  65. package/src/db/schema/pool-instances.ts +11 -0
  66. package/src/server/__tests__/build-container.test.ts +402 -0
  67. package/src/server/__tests__/container.test.ts +207 -0
  68. package/src/server/__tests__/lifecycle.test.ts +106 -0
  69. package/src/server/__tests__/mount-routes.test.ts +169 -0
  70. package/src/server/boot-config.ts +84 -0
  71. package/src/server/container.ts +264 -0
  72. package/src/server/index.ts +92 -0
  73. package/src/server/lifecycle.ts +72 -0
  74. package/src/server/middleware/__tests__/admin-auth.test.ts +67 -0
  75. package/src/server/middleware/__tests__/tenant-proxy.test.ts +308 -0
  76. package/src/server/middleware/admin-auth.ts +51 -0
  77. package/src/server/middleware/tenant-proxy.ts +192 -0
  78. package/src/server/mount-routes.ts +113 -0
  79. package/src/server/routes/__tests__/admin.test.ts +320 -0
  80. package/src/server/routes/__tests__/crypto-webhook.test.ts +167 -0
  81. package/src/server/routes/__tests__/provision-webhook.test.ts +323 -0
  82. package/src/server/routes/__tests__/stripe-webhook.test.ts +73 -0
  83. package/src/server/routes/admin.ts +360 -0
  84. package/src/server/routes/crypto-webhook.ts +110 -0
  85. package/src/server/routes/provision-webhook.ts +212 -0
  86. package/src/server/routes/stripe-webhook.ts +36 -0
  87. package/src/server/services/hot-pool-claim.ts +130 -0
  88. package/src/server/services/hot-pool.ts +174 -0
  89. package/src/server/services/pool-repository.ts +107 -0
  90. package/src/server/test-container.ts +120 -0
  91. package/src/trpc/auth-helpers.ts +28 -0
  92. package/src/trpc/container-factories.ts +114 -0
  93. package/src/trpc/index.ts +9 -0
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Container-based tRPC router factories.
3
+ *
4
+ * Each function accepts a PlatformContainer (plus any extra deps not yet on
5
+ * the container) and returns a tRPC router by delegating to the existing
6
+ * factory functions. This provides a single-call DI entry point for products
7
+ * that have migrated to the container pattern, while the existing factory
8
+ * functions and setter-based API remain fully functional for products that
9
+ * haven't migrated yet.
10
+ */
11
+ import type { INotificationTemplateRepository } from "../email/notification-template-repository.js";
12
+ import type { RolloutOrchestrator } from "../fleet/rollout-orchestrator.js";
13
+ import type { ITenantUpdateConfigRepository } from "../fleet/tenant-update-config-repository.js";
14
+ import type { ProductConfigService } from "../product-config/service.js";
15
+ import type { PlatformContainer } from "../server/container.js";
16
+ import { type OrgRemovePaymentMethodDeps } from "./org-remove-payment-method-router.js";
17
+ /**
18
+ * Wire the PlatformContainer's orgMemberRepo into the tRPC middleware layer.
19
+ *
20
+ * This replaces the manual `setTrpcOrgMemberRepo()` call. Products using the
21
+ * container call this once at boot; the setter-based API remains for products
22
+ * that haven't migrated yet.
23
+ */
24
+ export declare function initTrpcFromContainer(container: PlatformContainer): void;
25
+ /**
26
+ * Create the admin fleet-update router from a container.
27
+ *
28
+ * Requires additional fleet-specific deps (orchestrator + config repo) that
29
+ * are constructed at boot when fleet is enabled and are not yet on the
30
+ * PlatformContainer itself.
31
+ */
32
+ export declare function createAdminFleetUpdateRouterFromContainer(_container: PlatformContainer, getOrchestrator: () => RolloutOrchestrator, getConfigRepo: () => ITenantUpdateConfigRepository): import("@trpc/server").TRPCBuiltRouter<{
33
+ ctx: import("./init.js").TRPCContext;
34
+ meta: object;
35
+ errorShape: import("@trpc/server").TRPCDefaultErrorShape;
36
+ transformer: false;
37
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
38
+ rolloutStatus: import("@trpc/server").TRPCQueryProcedure<{
39
+ input: void;
40
+ output: {
41
+ isRolling: boolean;
42
+ };
43
+ meta: object;
44
+ }>;
45
+ forceRollout: import("@trpc/server").TRPCMutationProcedure<{
46
+ input: void;
47
+ output: {
48
+ triggered: boolean;
49
+ };
50
+ meta: object;
51
+ }>;
52
+ listTenantConfigs: import("@trpc/server").TRPCQueryProcedure<{
53
+ input: void;
54
+ output: import("../fleet/tenant-update-config-repository.js").TenantUpdateConfig[];
55
+ meta: object;
56
+ }>;
57
+ setTenantConfig: import("@trpc/server").TRPCMutationProcedure<{
58
+ input: {
59
+ tenantId: string;
60
+ mode: "manual" | "auto";
61
+ preferredHourUtc?: number | undefined;
62
+ };
63
+ output: void;
64
+ meta: object;
65
+ }>;
66
+ }>>;
67
+ /**
68
+ * Create the fleet-update-config router from a container.
69
+ *
70
+ * Requires the tenant-update-config repository getter (fleet-specific dep
71
+ * not yet on PlatformContainer).
72
+ */
73
+ export declare function createFleetUpdateConfigRouterFromContainer(_container: PlatformContainer, getConfigRepo: () => ITenantUpdateConfigRepository): import("@trpc/server").TRPCBuiltRouter<{
74
+ ctx: import("./init.js").TRPCContext;
75
+ meta: object;
76
+ errorShape: import("@trpc/server").TRPCDefaultErrorShape;
77
+ transformer: false;
78
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
79
+ getUpdateConfig: import("@trpc/server").TRPCQueryProcedure<{
80
+ input: {
81
+ tenantId: string;
82
+ };
83
+ output: import("../fleet/tenant-update-config-repository.js").TenantUpdateConfig | null;
84
+ meta: object;
85
+ }>;
86
+ setUpdateConfig: import("@trpc/server").TRPCMutationProcedure<{
87
+ input: {
88
+ tenantId: string;
89
+ mode: "manual" | "auto";
90
+ preferredHourUtc?: number | undefined;
91
+ };
92
+ output: void;
93
+ meta: object;
94
+ }>;
95
+ }>>;
96
+ /**
97
+ * Create the notification-template router from a container.
98
+ *
99
+ * Requires a getter for the notification-template repository (not yet on
100
+ * PlatformContainer).
101
+ */
102
+ export declare function createNotificationTemplateRouterFromContainer(_container: PlatformContainer, getRepo: () => INotificationTemplateRepository): import("@trpc/server").TRPCBuiltRouter<{
103
+ ctx: import("./init.js").TRPCContext;
104
+ meta: object;
105
+ errorShape: import("@trpc/server").TRPCDefaultErrorShape;
106
+ transformer: false;
107
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
108
+ listTemplates: import("@trpc/server").TRPCQueryProcedure<{
109
+ input: void;
110
+ output: import("../email/notification-repository-types.js").NotificationTemplateRow[];
111
+ meta: object;
112
+ }>;
113
+ getTemplate: import("@trpc/server").TRPCQueryProcedure<{
114
+ input: {
115
+ name: string;
116
+ };
117
+ output: import("../email/notification-repository-types.js").NotificationTemplateRow | null;
118
+ meta: object;
119
+ }>;
120
+ updateTemplate: import("@trpc/server").TRPCMutationProcedure<{
121
+ input: {
122
+ name: string;
123
+ subject?: string | undefined;
124
+ htmlBody?: string | undefined;
125
+ textBody?: string | undefined;
126
+ description?: string | undefined;
127
+ active?: boolean | undefined;
128
+ };
129
+ output: void;
130
+ meta: object;
131
+ }>;
132
+ previewTemplate: import("@trpc/server").TRPCMutationProcedure<{
133
+ input: {
134
+ subject: string;
135
+ htmlBody: string;
136
+ textBody: string;
137
+ data: Record<string, unknown>;
138
+ };
139
+ output: {
140
+ subject: string;
141
+ html: string;
142
+ text: string;
143
+ };
144
+ meta: object;
145
+ }>;
146
+ seedDefaults: import("@trpc/server").TRPCMutationProcedure<{
147
+ input: void;
148
+ output: {
149
+ inserted: number;
150
+ total: number;
151
+ };
152
+ meta: object;
153
+ }>;
154
+ }>>;
155
+ /**
156
+ * Create the org-remove-payment-method router from a container.
157
+ *
158
+ * The container's StripeServices.processor is typed narrowly (webhook-only),
159
+ * so this still requires the full OrgRemovePaymentMethodDeps to be supplied
160
+ * until the container's Stripe sub-container is widened to include
161
+ * IPaymentProcessor.
162
+ */
163
+ export declare function createOrgRemovePaymentMethodRouterFromContainer(_container: PlatformContainer, getDeps: () => OrgRemovePaymentMethodDeps): import("@trpc/server").TRPCBuiltRouter<{
164
+ ctx: import("./init.js").TRPCContext;
165
+ meta: object;
166
+ errorShape: import("@trpc/server").TRPCDefaultErrorShape;
167
+ transformer: false;
168
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
169
+ orgRemovePaymentMethod: import("@trpc/server").TRPCMutationProcedure<{
170
+ input: {
171
+ orgId: string;
172
+ paymentMethodId: string;
173
+ };
174
+ output: {
175
+ removed: boolean;
176
+ };
177
+ meta: object;
178
+ }>;
179
+ }>>;
180
+ /**
181
+ * Create the product-config router from a container.
182
+ *
183
+ * Requires a getter for ProductConfigService and the product slug, both of
184
+ * which are product-specific and not on PlatformContainer.
185
+ */
186
+ export declare function createProductConfigRouterFromContainer(_container: PlatformContainer, getService: () => ProductConfigService, productSlug: string): import("@trpc/server").TRPCBuiltRouter<{
187
+ ctx: import("./init.js").TRPCContext;
188
+ meta: object;
189
+ errorShape: import("@trpc/server").TRPCDefaultErrorShape;
190
+ transformer: false;
191
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
192
+ getBrandConfig: import("@trpc/server").TRPCQueryProcedure<{
193
+ input: void;
194
+ output: import("../product-config/repository-types.js").ProductBrandConfig | null;
195
+ meta: object;
196
+ }>;
197
+ getNavItems: import("@trpc/server").TRPCQueryProcedure<{
198
+ input: void;
199
+ output: {
200
+ label: string;
201
+ href: string;
202
+ }[];
203
+ meta: object;
204
+ }>;
205
+ admin: import("@trpc/server").TRPCBuiltRouter<{
206
+ ctx: import("./init.js").TRPCContext;
207
+ meta: object;
208
+ errorShape: import("@trpc/server").TRPCDefaultErrorShape;
209
+ transformer: false;
210
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
211
+ get: import("@trpc/server").TRPCQueryProcedure<{
212
+ input: void;
213
+ output: import("../product-config/repository-types.js").ProductConfig | null;
214
+ meta: object;
215
+ }>;
216
+ listAll: import("@trpc/server").TRPCQueryProcedure<{
217
+ input: void;
218
+ output: import("../product-config/repository-types.js").ProductConfig[];
219
+ meta: object;
220
+ }>;
221
+ updateBrand: import("@trpc/server").TRPCMutationProcedure<{
222
+ input: {
223
+ brandName?: string | undefined;
224
+ productName?: string | undefined;
225
+ tagline?: string | undefined;
226
+ domain?: string | undefined;
227
+ appDomain?: string | undefined;
228
+ cookieDomain?: string | undefined;
229
+ companyLegal?: string | undefined;
230
+ priceLabel?: string | undefined;
231
+ defaultImage?: string | undefined;
232
+ emailSupport?: string | undefined;
233
+ emailPrivacy?: string | undefined;
234
+ emailLegal?: string | undefined;
235
+ fromEmail?: string | undefined;
236
+ homePath?: string | undefined;
237
+ storagePrefix?: string | undefined;
238
+ };
239
+ output: void;
240
+ meta: object;
241
+ }>;
242
+ updateNavItems: import("@trpc/server").TRPCMutationProcedure<{
243
+ input: {
244
+ label: string;
245
+ href: string;
246
+ sortOrder: number;
247
+ icon?: string | undefined;
248
+ requiresRole?: string | undefined;
249
+ enabled?: boolean | undefined;
250
+ }[];
251
+ output: void;
252
+ meta: object;
253
+ }>;
254
+ updateFeatures: import("@trpc/server").TRPCMutationProcedure<{
255
+ input: {
256
+ chatEnabled?: boolean | undefined;
257
+ onboardingEnabled?: boolean | undefined;
258
+ onboardingDefaultModel?: string | undefined;
259
+ onboardingSystemPrompt?: string | undefined;
260
+ onboardingMaxCredits?: number | undefined;
261
+ onboardingWelcomeMsg?: string | undefined;
262
+ sharedModuleBilling?: boolean | undefined;
263
+ sharedModuleMonitoring?: boolean | undefined;
264
+ sharedModuleAnalytics?: boolean | undefined;
265
+ };
266
+ output: void;
267
+ meta: object;
268
+ }>;
269
+ updateFleet: import("@trpc/server").TRPCMutationProcedure<{
270
+ input: {
271
+ containerImage?: string | undefined;
272
+ containerPort?: number | undefined;
273
+ lifecycle?: "managed" | "ephemeral" | undefined;
274
+ billingModel?: "monthly" | "per_use" | "none" | undefined;
275
+ maxInstances?: number | undefined;
276
+ imageAllowlist?: string[] | undefined;
277
+ dockerNetwork?: string | undefined;
278
+ placementStrategy?: string | undefined;
279
+ fleetDataDir?: string | undefined;
280
+ };
281
+ output: void;
282
+ meta: object;
283
+ }>;
284
+ updateBilling: import("@trpc/server").TRPCMutationProcedure<{
285
+ input: {
286
+ stripePublishableKey?: string | undefined;
287
+ stripeSecretKey?: string | undefined;
288
+ stripeWebhookSecret?: string | undefined;
289
+ creditPrices?: Record<string, number> | undefined;
290
+ affiliateBaseUrl?: string | undefined;
291
+ affiliateMatchRate?: number | undefined;
292
+ affiliateMaxCap?: number | undefined;
293
+ dividendRate?: number | undefined;
294
+ marginConfig?: unknown;
295
+ };
296
+ output: void;
297
+ meta: object;
298
+ }>;
299
+ }>>;
300
+ }>>;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Container-based tRPC router factories.
3
+ *
4
+ * Each function accepts a PlatformContainer (plus any extra deps not yet on
5
+ * the container) and returns a tRPC router by delegating to the existing
6
+ * factory functions. This provides a single-call DI entry point for products
7
+ * that have migrated to the container pattern, while the existing factory
8
+ * functions and setter-based API remain fully functional for products that
9
+ * haven't migrated yet.
10
+ */
11
+ import { createAdminFleetUpdateRouter } from "./admin-fleet-update-router.js";
12
+ import { createFleetUpdateConfigRouter } from "./fleet-update-config-router.js";
13
+ import { setTrpcOrgMemberRepo } from "./init.js";
14
+ import { createNotificationTemplateRouter } from "./notification-template-router.js";
15
+ import { createOrgRemovePaymentMethodRouter, } from "./org-remove-payment-method-router.js";
16
+ import { createProductConfigRouter } from "./product-config-router.js";
17
+ // ---------------------------------------------------------------------------
18
+ // Init / middleware wiring
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * Wire the PlatformContainer's orgMemberRepo into the tRPC middleware layer.
22
+ *
23
+ * This replaces the manual `setTrpcOrgMemberRepo()` call. Products using the
24
+ * container call this once at boot; the setter-based API remains for products
25
+ * that haven't migrated yet.
26
+ */
27
+ export function initTrpcFromContainer(container) {
28
+ setTrpcOrgMemberRepo(container.orgMemberRepo);
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // Router factories — thin wrappers over existing factory functions
32
+ // ---------------------------------------------------------------------------
33
+ /**
34
+ * Create the admin fleet-update router from a container.
35
+ *
36
+ * Requires additional fleet-specific deps (orchestrator + config repo) that
37
+ * are constructed at boot when fleet is enabled and are not yet on the
38
+ * PlatformContainer itself.
39
+ */
40
+ export function createAdminFleetUpdateRouterFromContainer(_container, getOrchestrator, getConfigRepo) {
41
+ return createAdminFleetUpdateRouter(getOrchestrator, getConfigRepo);
42
+ }
43
+ /**
44
+ * Create the fleet-update-config router from a container.
45
+ *
46
+ * Requires the tenant-update-config repository getter (fleet-specific dep
47
+ * not yet on PlatformContainer).
48
+ */
49
+ export function createFleetUpdateConfigRouterFromContainer(_container, getConfigRepo) {
50
+ return createFleetUpdateConfigRouter(getConfigRepo);
51
+ }
52
+ /**
53
+ * Create the notification-template router from a container.
54
+ *
55
+ * Requires a getter for the notification-template repository (not yet on
56
+ * PlatformContainer).
57
+ */
58
+ export function createNotificationTemplateRouterFromContainer(_container, getRepo) {
59
+ return createNotificationTemplateRouter(getRepo);
60
+ }
61
+ /**
62
+ * Create the org-remove-payment-method router from a container.
63
+ *
64
+ * The container's StripeServices.processor is typed narrowly (webhook-only),
65
+ * so this still requires the full OrgRemovePaymentMethodDeps to be supplied
66
+ * until the container's Stripe sub-container is widened to include
67
+ * IPaymentProcessor.
68
+ */
69
+ export function createOrgRemovePaymentMethodRouterFromContainer(_container, getDeps) {
70
+ return createOrgRemovePaymentMethodRouter(getDeps);
71
+ }
72
+ /**
73
+ * Create the product-config router from a container.
74
+ *
75
+ * Requires a getter for ProductConfigService and the product slug, both of
76
+ * which are product-specific and not on PlatformContainer.
77
+ */
78
+ export function createProductConfigRouterFromContainer(_container, getService, productSlug) {
79
+ return createProductConfigRouter(getService, productSlug);
80
+ }
@@ -1,5 +1,7 @@
1
1
  export { createAdminFleetUpdateRouter } from "./admin-fleet-update-router.js";
2
+ export { createAssertOrgAdminOrOwner } from "./auth-helpers.js";
2
3
  export { authSocialRouter } from "./auth-social-router.js";
4
+ export { createAdminFleetUpdateRouterFromContainer, createFleetUpdateConfigRouterFromContainer, createNotificationTemplateRouterFromContainer, createOrgRemovePaymentMethodRouterFromContainer, createProductConfigRouterFromContainer, initTrpcFromContainer, } from "./container-factories.js";
3
5
  export { createFleetUpdateConfigRouter } from "./fleet-update-config-router.js";
4
6
  export { adminProcedure, createCallerFactory, orgAdminProcedure, orgMemberProcedure, protectedProcedure, publicProcedure, router, setTrpcOrgMemberRepo, type TRPCContext, tenantProcedure, } from "./init.js";
5
7
  export { createNotificationTemplateRouter } from "./notification-template-router.js";
@@ -1,5 +1,7 @@
1
1
  export { createAdminFleetUpdateRouter } from "./admin-fleet-update-router.js";
2
+ export { createAssertOrgAdminOrOwner } from "./auth-helpers.js";
2
3
  export { authSocialRouter } from "./auth-social-router.js";
4
+ export { createAdminFleetUpdateRouterFromContainer, createFleetUpdateConfigRouterFromContainer, createNotificationTemplateRouterFromContainer, createOrgRemovePaymentMethodRouterFromContainer, createProductConfigRouterFromContainer, initTrpcFromContainer, } from "./container-factories.js";
3
5
  export { createFleetUpdateConfigRouter } from "./fleet-update-config-router.js";
4
6
  export { adminProcedure, createCallerFactory, orgAdminProcedure, orgMemberProcedure, protectedProcedure, publicProcedure, router, setTrpcOrgMemberRepo, tenantProcedure, } from "./init.js";
5
7
  export { createNotificationTemplateRouter } from "./notification-template-router.js";
@@ -0,0 +1,29 @@
1
+ -- Hot pool: pre-provisioned warm containers for instant claiming
2
+ CREATE TABLE IF NOT EXISTS "pool_config" (
3
+ "id" integer PRIMARY KEY DEFAULT 1,
4
+ "pool_size" integer NOT NULL DEFAULT 2
5
+ );
6
+ --> statement-breakpoint
7
+
8
+ CREATE TABLE IF NOT EXISTS "pool_instances" (
9
+ "id" text PRIMARY KEY,
10
+ "container_id" text NOT NULL,
11
+ "status" text NOT NULL DEFAULT 'warm',
12
+ "tenant_id" text,
13
+ "name" text,
14
+ "created_at" timestamp NOT NULL DEFAULT now(),
15
+ "claimed_at" timestamp
16
+ );
17
+ --> statement-breakpoint
18
+
19
+ -- Claim query: WHERE status = 'warm' ORDER BY created_at ASC FOR UPDATE SKIP LOCKED
20
+ CREATE INDEX IF NOT EXISTS "pool_instances_status_created" ON "pool_instances" ("status", "created_at");
21
+ --> statement-breakpoint
22
+
23
+ -- Tenant lookup for admin queries
24
+ CREATE INDEX IF NOT EXISTS "pool_instances_tenant" ON "pool_instances" ("tenant_id") WHERE "tenant_id" IS NOT NULL;
25
+ --> statement-breakpoint
26
+
27
+ -- Seed default pool config
28
+ INSERT INTO "pool_config" ("id", "pool_size") VALUES (1, 2)
29
+ ON CONFLICT ("id") DO NOTHING;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wopr-network/platform-core",
3
- "version": "1.68.0",
3
+ "version": "1.70.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -36,6 +36,10 @@
36
36
  "./product-config": "./dist/product-config/index.js",
37
37
  "./proxy": "./dist/proxy/index.js",
38
38
  "./security": "./dist/security/index.js",
39
+ "./server": {
40
+ "import": "./dist/server/index.js",
41
+ "types": "./dist/server/index.d.ts"
42
+ },
39
43
  "./setup": "./dist/setup/index.js",
40
44
  "./tenancy": "./dist/tenancy/index.js",
41
45
  "./api/routes/audit": "./dist/api/routes/audit.js",
@@ -0,0 +1,6 @@
1
+ import { integer, pgTable } from "drizzle-orm/pg-core";
2
+
3
+ export const poolConfig = pgTable("pool_config", {
4
+ id: integer("id").primaryKey().default(1),
5
+ poolSize: integer("pool_size").notNull().default(2),
6
+ });
@@ -0,0 +1,11 @@
1
+ import { pgTable, text, timestamp } from "drizzle-orm/pg-core";
2
+
3
+ export const poolInstances = pgTable("pool_instances", {
4
+ id: text("id").primaryKey(),
5
+ containerId: text("container_id").notNull(),
6
+ status: text("status").notNull().default("warm"),
7
+ tenantId: text("tenant_id"),
8
+ name: text("name"),
9
+ createdAt: timestamp("created_at").notNull().defaultNow(),
10
+ claimedAt: timestamp("claimed_at"),
11
+ });