File size: 30,914 Bytes
303c85f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var AdminRouter_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AdminRouter = void 0;
const common_1 = require("@nestjs/common");
const zod_1 = require("zod");
const trpc_init_1 = require("../trpc/trpc.init");
const shared_types_1 = require("@micprotocol/shared-types");
const admin_realtime_service_1 = require("./admin-realtime.service");
const admin_clip_scorer_service_1 = require("./admin-clip-scorer.service");
const admin_auth_service_1 = require("./admin-auth.service");
const admin_users_service_1 = require("./admin-users.service");
const admin_workspaces_service_1 = require("./admin-workspaces.service");
const admin_billing_service_1 = require("./admin-billing.service");
const admin_moderation_service_1 = require("./admin-moderation.service");
const admin_operations_service_1 = require("./admin-operations.service");
const admin_settings_service_1 = require("./admin-settings.service");
const admin_audit_service_1 = require("./admin-audit.service");
const admin_comms_service_1 = require("./admin-comms.service");
const admin_supervision_service_1 = require("./admin-supervision.service");
const cursorListSchema = zod_1.z.object({
    cursor: zod_1.z.string().uuid().optional(),
    limit: zod_1.z.number().int().min(1).max(200).optional(),
});
let AdminRouter = AdminRouter_1 = class AdminRouter {
    realtime;
    clipScorer;
    adminAuth;
    users;
    workspaces;
    billing;
    moderation;
    operations;
    settings;
    audit;
    comms;
    supervision;
    logger = new common_1.Logger(AdminRouter_1.name);
    constructor(realtime, clipScorer, adminAuth, users, workspaces, billing, moderation, operations, settings, audit, comms, supervision) {
        this.realtime = realtime;
        this.clipScorer = clipScorer;
        this.adminAuth = adminAuth;
        this.users = users;
        this.workspaces = workspaces;
        this.billing = billing;
        this.moderation = moderation;
        this.operations = operations;
        this.settings = settings;
        this.audit = audit;
        this.comms = comms;
        this.supervision = supervision;
    }
    get router() {
        return (0, trpc_init_1.router)({
            realtime: (0, trpc_init_1.router)({
                stats: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ).query(async () => this.realtime.getStats()),
                metrics: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ).query(async () => this.realtime.getMetrics()),
                traces: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ)
                    .input(zod_1.z.object({ limit: zod_1.z.number().int().min(1).max(1000).optional() }))
                    .query(async ({ input }) => this.realtime.getTraces(input.limit ?? 50)),
            }),
            clipScorer: (0, trpc_init_1.router)({
                locks: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_LOCKS).query(async () => this.clipScorer.getLocks()),
                releaseLock: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_LOCKS)
                    .input(zod_1.z.object({ key: zod_1.z.string() }))
                    .mutation(async ({ input }) => this.clipScorer.forceReleaseLock(input.key)),
                scratch: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_HEALTH).query(async () => this.clipScorer.getScratchStorage()),
            }),
            aiEngines: (0, trpc_init_1.router)({
                listEngines: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ)
                    .input(zod_1.z.object({ includeMetrics: zod_1.z.boolean().optional() }))
                    .query(async ({ input }) => {
                    const locks = await this.clipScorer.getLocks();
                    const scratch = await this.clipScorer.getScratchStorage();
                    const usedGB = scratch.dirs.reduce((sum, d) => sum + d.bytes, 0) / (1024 * 1024 * 1024);
                    return {
                        items: [
                            {
                                id: "clip-scorer",
                                name: "CLIP Scorer",
                                engineType: "ml-engine",
                                status: locks.error ? "down" : "healthy",
                                requestsPerSecond: 12.5,
                                avgLatencyMs: 145.5,
                                errorRate: 0.01,
                                queueDepth: 0,
                                jobsProcessed: 12450,
                                jobsFailed: 23,
                                scratchUsedGB: usedGB,
                            },
                        ],
                    };
                }),
                clipScorerStatus: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ)
                    .query(async () => {
                    const locks = await this.clipScorer.getLocks();
                    const scratch = await this.clipScorer.getScratchStorage();
                    const usedGB = scratch.dirs.reduce((sum, d) => sum + d.bytes, 0) / (1024 * 1024 * 1024);
                    return {
                        status: locks.error ? "down" : "healthy",
                        uptimeSeconds: 86400,
                        jobsProcessed: 12450,
                        jobsFailed: 23,
                        avgLatencyMs: 145.5,
                        queueDepth: 0,
                        scoringAxes: [
                            { name: "Visual Relevance", weight: 0.4, enabled: true },
                            { name: "Audio Clarity", weight: 0.3, enabled: true },
                            { name: "Semantic Match", weight: 0.2, enabled: true },
                            { name: "Loudness Norm", weight: 0.1, enabled: false },
                        ],
                        locks: locks.locks,
                        storage: {
                            usedGB,
                            totalGB: 100,
                            utilization: Math.round((usedGB / 100) * 100),
                        },
                    };
                }),
            }),
            users: (0, trpc_init_1.router)({
                list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_READ)
                    .input(cursorListSchema.extend({
                    search: zod_1.z.string().max(200).optional(),
                    role: zod_1.z.string().optional(),
                    suspended: zod_1.z.boolean().optional(),
                }))
                    .query(async ({ input }) => this.users.listUsers(input)),
                get: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_READ)
                    .input(zod_1.z.object({ userId: zod_1.z.string().uuid() }))
                    .query(async ({ input }) => this.users.getUser(input.userId)),
                suspend: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_SUSPEND)
                    .input(zod_1.z.object({ userId: zod_1.z.string().uuid(), reason: zod_1.z.string().max(1000).optional().nullable() }))
                    .mutation(async ({ input, ctx }) => this.users.suspendUser(input.userId, input.reason ?? null, ctx.userId)),
                reactivate: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_SUSPEND)
                    .input(zod_1.z.object({ userId: zod_1.z.string().uuid() }))
                    .mutation(async ({ input, ctx }) => this.users.reactivateUser(input.userId, ctx.userId)),
                revokeSessions: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_REVOKE_SESSIONS)
                    .input(zod_1.z.object({ userId: zod_1.z.string().uuid(), exceptToken: zod_1.z.string().optional() }))
                    .mutation(async ({ input, ctx }) => this.users.revokeSessions(input.userId, ctx.userId, input.exceptToken)),
                impersonate: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_IMPERSONATE)
                    .input(zod_1.z.object({
                    userId: zod_1.z.string().uuid(),
                    reason: zod_1.z.string().max(1000).optional(),
                    ttlMinutes: zod_1.z.number().int().min(5).max(480).optional().default(60),
                }))
                    .mutation(async ({ input, ctx }) => this.users.impersonate(input.userId, ctx.userId, input.reason, input.ttlMinutes)),
                grantAdmin: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_GRANT_ADMIN)
                    .input(zod_1.z.object({
                    userId: zod_1.z.string().uuid(),
                    role: zod_1.z.nativeEnum(shared_types_1.AdminRole),
                    permissions: zod_1.z.array(zod_1.z.string()).optional().nullable(),
                }))
                    .mutation(async ({ input, ctx }) => this.users.grantAdmin(input.userId, input.role, input.permissions ?? null, ctx.userId)),
                revokeAdmin: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_GRANT_ADMIN)
                    .input(zod_1.z.object({ userId: zod_1.z.string().uuid() }))
                    .mutation(async ({ input, ctx }) => this.users.revokeAdmin(input.userId, ctx.userId)),
                deleteUser: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_DELETE)
                    .input(zod_1.z.object({ userId: zod_1.z.string().uuid(), anonymize: zod_1.z.boolean().optional().default(true) }))
                    .mutation(async ({ input, ctx }) => this.users.deleteUser(input.userId, ctx.userId, input.anonymize)),
                addNote: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.USERS_NOTES)
                    .input(zod_1.z.object({ userId: zod_1.z.string().uuid(), body: zod_1.z.string().min(1).max(5000) }))
                    .mutation(async ({ input, ctx }) => this.users.addUserNote(input.userId, input.body, ctx.userId)),
            }),
            workspaces: (0, trpc_init_1.router)({
                list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_READ)
                    .input(cursorListSchema.extend({
                    search: zod_1.z.string().max(200).optional(),
                    suspended: zod_1.z.boolean().optional(),
                }))
                    .query(async ({ input }) => this.workspaces.listWorkspaces(input)),
                get: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_READ)
                    .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid() }))
                    .query(async ({ input }) => this.workspaces.getWorkspace(input.workspaceId)),
                suspend: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_SUSPEND)
                    .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), reason: zod_1.z.string().max(1000).optional().nullable() }))
                    .mutation(async ({ input, ctx }) => this.workspaces.suspendWorkspace(input.workspaceId, input.reason ?? null, ctx.userId)),
                reactivate: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_SUSPEND)
                    .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid() }))
                    .mutation(async ({ input, ctx }) => this.workspaces.reactivateWorkspace(input.workspaceId, ctx.userId)),
                overridePlan: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_PLAN)
                    .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), planId: zod_1.z.string().min(1) }))
                    .mutation(async ({ input, ctx }) => this.workspaces.overridePlan(input.workspaceId, input.planId, ctx.userId)),
                setCredits: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_CREDITS)
                    .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), credits: zod_1.z.number() }))
                    .mutation(async ({ input, ctx }) => this.workspaces.setCredits(input.workspaceId, input.credits, ctx.userId)),
                transferOwner: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_TRANSFER_OWNER)
                    .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), newOwnerUserId: zod_1.z.string().uuid() }))
                    .mutation(async ({ input, ctx }) => this.workspaces.transferOwner(input.workspaceId, input.newOwnerUserId, ctx.userId)),
                addNote: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.WORKSPACES_NOTES)
                    .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), body: zod_1.z.string().min(1).max(5000) }))
                    .mutation(async ({ input, ctx }) => this.workspaces.addWorkspaceNote(input.workspaceId, input.body, ctx.userId)),
            }),
            billing: (0, trpc_init_1.router)({
                listSubscriptions: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_READ)
                    .query(async () => this.billing.listSubscriptions()),
                getWallet: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_READ)
                    .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid() }))
                    .query(async ({ input }) => this.billing.getWallet(input.workspaceId)),
                listWallets: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_READ)
                    .query(async () => this.billing.listWallets()),
                listTransactions: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_READ)
                    .input(zod_1.z.object({ walletId: zod_1.z.string().uuid(), limit: zod_1.z.number().int().min(1).max(200).optional().default(50) }))
                    .query(async ({ input }) => this.billing.listTransactions(input.walletId, input.limit)),
                refund: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_REFUND)
                    .input(zod_1.z.object({
                    workspaceId: zod_1.z.string().uuid(),
                    amount: zod_1.z.number().positive(),
                    reference: zod_1.z.string().min(1),
                    description: zod_1.z.string().max(1000).optional().nullable(),
                }))
                    .mutation(async ({ input, ctx }) => this.billing.refund(input.workspaceId, input.amount, input.reference, input.description ?? null, ctx.userId)),
                planOverride: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.BILLING_PLAN_OVERRIDE)
                    .input(zod_1.z.object({ workspaceId: zod_1.z.string().uuid(), planId: zod_1.z.string().min(1) }))
                    .mutation(async ({ input, ctx }) => this.billing.planOverride(input.workspaceId, input.planId, ctx.userId)),
            }),
            moderation: (0, trpc_init_1.router)({
                listReports: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.MODERATION_READ)
                    .input(cursorListSchema.extend({
                    status: zod_1.z.string().optional(),
                    category: zod_1.z.string().optional(),
                    targetType: zod_1.z.string().optional(),
                }))
                    .query(async ({ input }) => this.moderation.listAbuseReports(input)),
                getReport: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.MODERATION_READ)
                    .input(zod_1.z.object({ reportId: zod_1.z.string().uuid() }))
                    .query(async ({ input }) => this.moderation.getAbuseReport(input.reportId)),
                resolve: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.MODERATION_RESOLVE)
                    .input(zod_1.z.object({
                    reportId: zod_1.z.string().uuid(),
                    resolution: zod_1.z.string().min(1).max(2000),
                    status: zod_1.z.string().optional(),
                }))
                    .mutation(async ({ input, ctx }) => this.moderation.resolveReport(input.reportId, input.resolution, ctx.userId, input.status)),
                takedown: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.MODERATION_TAKEDOWN)
                    .input(zod_1.z.object({ reportId: zod_1.z.string().uuid(), reason: zod_1.z.string().max(1000).optional() }))
                    .mutation(async ({ input, ctx }) => this.moderation.takedown(input.reportId, ctx.userId, input.reason)),
            }),
            settings: (0, trpc_init_1.router)({
                list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SETTINGS_READ)
                    .query(async () => this.settings.listSettings()),
                get: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SETTINGS_READ)
                    .input(zod_1.z.object({ key: zod_1.z.string().min(1) }))
                    .query(async ({ input }) => this.settings.getSetting(input.key)),
                upsert: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SETTINGS_WRITE)
                    .input(zod_1.z.object({
                    key: zod_1.z.string().min(1),
                    value: zod_1.z.unknown(),
                    description: zod_1.z.string().max(1000).optional().nullable(),
                    category: zod_1.z.string().min(1),
                }))
                    .mutation(async ({ input, ctx }) => this.settings.upsertSetting(input.key, input.value, input.description ?? null, input.category, ctx.userId)),
                delete: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SETTINGS_WRITE)
                    .input(zod_1.z.object({ key: zod_1.z.string().min(1) }))
                    .mutation(async ({ input, ctx }) => this.settings.deleteSetting(input.key, ctx.userId)),
            }),
            flags: (0, trpc_init_1.router)({
                list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.FLAGS_READ)
                    .query(async () => this.settings.listFlags()),
                isEnabled: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.FLAGS_READ)
                    .input(zod_1.z.object({ key: zod_1.z.string().min(1), workspaceId: zod_1.z.string().uuid().optional() }))
                    .query(async ({ input }) => this.settings.isFlagEnabled(input.key, input.workspaceId)),
                upsert: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.FLAGS_WRITE)
                    .input(zod_1.z.object({
                    key: zod_1.z.string().min(1),
                    enabled: zod_1.z.boolean(),
                    rolloutPercentage: zod_1.z.number().int().min(0).max(100),
                    allowlistWorkspaceIds: zod_1.z.array(zod_1.z.string().uuid()).optional().default([]),
                    description: zod_1.z.string().max(1000).optional().nullable(),
                }))
                    .mutation(async ({ input, ctx }) => this.settings.upsertFlag(input.key, input.enabled, input.rolloutPercentage, input.allowlistWorkspaceIds, input.description ?? null, ctx.userId)),
                delete: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.FLAGS_WRITE)
                    .input(zod_1.z.object({ key: zod_1.z.string().min(1) }))
                    .mutation(async ({ input, ctx }) => this.settings.deleteFlag(input.key, ctx.userId)),
            }),
            audit: (0, trpc_init_1.router)({
                list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.AUDIT_READ)
                    .input(cursorListSchema.extend({
                    action: zod_1.z.string().optional(),
                    entityType: zod_1.z.string().optional(),
                    userId: zod_1.z.string().uuid().optional(),
                    workspaceId: zod_1.z.string().uuid().optional(),
                    startDate: zod_1.z.string().optional(),
                    endDate: zod_1.z.string().optional(),
                    search: zod_1.z.string().max(200).optional(),
                }))
                    .query(async ({ input }) => this.audit.list(input)),
                verify: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.AUDIT_READ)
                    .query(async () => this.audit.verify()),
                stats: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.AUDIT_READ)
                    .query(async () => this.audit.stats()),
                export: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.AUDIT_EXPORT)
                    .input(zod_1.z.object({ startDate: zod_1.z.string().optional(), endDate: zod_1.z.string().optional() }))
                    .query(async ({ input, ctx }) => this.audit.export(input, ctx.userId)),
                getEntry: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.AUDIT_READ)
                    .input(zod_1.z.object({ entryId: zod_1.z.string().uuid() }))
                    .query(async ({ input }) => this.audit.getEntry(input.entryId)),
            }),
            comms: (0, trpc_init_1.router)({
                list: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.ANNOUNCEMENTS_READ)
                    .query(async () => this.comms.listAnnouncements()),
                create: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.ANNOUNCEMENTS_WRITE)
                    .input(zod_1.z.object({
                    title: zod_1.z.string().min(1).max(200),
                    body: zod_1.z.string().min(1).max(10_000),
                    audience: zod_1.z.unknown(),
                    severity: zod_1.z.string().min(1),
                    status: zod_1.z.string().min(1),
                    publishedAt: zod_1.z.string().datetime().optional().nullable(),
                    expiresAt: zod_1.z.string().datetime().optional().nullable(),
                }))
                    .mutation(async ({ input, ctx }) => this.comms.createAnnouncement(input.title, input.body, input.audience, input.severity, input.status, input.publishedAt ? new Date(input.publishedAt) : null, input.expiresAt ? new Date(input.expiresAt) : null, ctx.userId)),
                update: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.ANNOUNCEMENTS_WRITE)
                    .input(zod_1.z.object({
                    id: zod_1.z.string().uuid(),
                    title: zod_1.z.string().min(1).max(200).optional(),
                    body: zod_1.z.string().min(1).max(10_000).optional(),
                    audience: zod_1.z.unknown().optional(),
                    severity: zod_1.z.string().min(1).optional(),
                    status: zod_1.z.string().min(1).optional(),
                    publishedAt: zod_1.z.string().datetime().optional().nullable(),
                    expiresAt: zod_1.z.string().datetime().optional().nullable(),
                }))
                    .mutation(async ({ input, ctx }) => {
                    const { id, ...patch } = input;
                    return this.comms.updateAnnouncement(id, patch, ctx.userId);
                }),
                archive: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.ANNOUNCEMENTS_WRITE)
                    .input(zod_1.z.object({ id: zod_1.z.string().uuid() }))
                    .mutation(async ({ input, ctx }) => this.comms.archiveAnnouncement(input.id, ctx.userId)),
            }),
            supervision: (0, trpc_init_1.router)({
                run: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SUPERVISION_RUN)
                    .input(zod_1.z.object({ kind: zod_1.z.string().optional() }))
                    .query(async ({ input, ctx }) => this.supervision.runSupervision(input.kind ?? "other", ctx.userId)),
                listRuns: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SUPERVISION_READ)
                    .query(async () => this.supervision.listRuns()),
                listFindings: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SUPERVISION_READ)
                    .input(zod_1.z.object({ runId: zod_1.z.string().uuid().optional(), status: zod_1.z.string().optional() }))
                    .query(async ({ input }) => this.supervision.listFindings(input.runId, input.status)),
                acknowledge: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SUPERVISION_RUN)
                    .input(zod_1.z.object({ findingId: zod_1.z.string().uuid(), assignedToId: zod_1.z.string().uuid().optional() }))
                    .mutation(async ({ input, ctx }) => this.supervision.acknowledgeFinding(input.findingId, input.assignedToId ?? ctx.userId)),
                resolve: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.SUPERVISION_RUN)
                    .input(zod_1.z.object({ findingId: zod_1.z.string().uuid() }))
                    .mutation(async ({ input }) => this.supervision.resolveFinding(input.findingId)),
            }),
            operations: (0, trpc_init_1.router)({
                queueHealth: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_READ)
                    .query(async () => this.operations.getQueueHealth()),
                queueJobs: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_QUEUES)
                    .input(zod_1.z.object({
                    queue: zod_1.z.string(),
                    type: zod_1.z.enum(["waiting", "active", "failed", "completed", "delayed"]),
                    limit: zod_1.z.number().int().min(1).max(200).optional().default(50),
                }))
                    .query(async ({ input }) => this.operations.getQueueJobs(input.queue, input.type, input.limit)),
                retryJob: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_RETRY_JOBS)
                    .input(zod_1.z.object({ queue: zod_1.z.string(), jobId: zod_1.z.string() }))
                    .mutation(async ({ input, ctx }) => this.operations.retryJob(input.queue, input.jobId, ctx.userId)),
                purgeFailed: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_PURGE_JOBS)
                    .input(zod_1.z.object({ queue: zod_1.z.string() }))
                    .mutation(async ({ input, ctx }) => this.operations.purgeFailedJobs(input.queue, ctx.userId)),
                getLocks: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_LOCKS)
                    .input(zod_1.z.object({ pattern: zod_1.z.string().optional().default("lock:clip:*"), limit: zod_1.z.number().int().min(1).max(1000).optional().default(100) }))
                    .query(async ({ input }) => this.operations.getLocks(input.pattern, input.limit)),
                releaseLock: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_LOCKS)
                    .input(zod_1.z.object({ key: zod_1.z.string() }))
                    .mutation(async ({ input, ctx }) => this.operations.releaseLock(input.key, ctx.userId)),
                systemHealth: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_HEALTH)
                    .query(async () => this.operations.getSystemHealth()),
                setMaintenanceMode: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_MAINTENANCE)
                    .input(zod_1.z.object({ enabled: zod_1.z.boolean() }))
                    .mutation(async ({ input, ctx }) => this.operations.setMaintenanceMode(input.enabled, ctx.userId)),
                flushCache: (0, trpc_init_1.adminPermissionProcedure)(shared_types_1.AdminPermission.OPS_CACHE)
                    .input(zod_1.z.object({ pattern: zod_1.z.string().optional().default("*") }))
                    .mutation(async ({ input, ctx }) => this.operations.flushCache(input.pattern, ctx.userId)),
            }),
            me: trpc_init_1.adminProcedure
                .query(async ({ ctx }) => {
                const context = await this.adminAuth.getAdminContext(ctx.userId);
                if (!context)
                    return null;
                return {
                    userId: context.userId,
                    isAdmin: context.isAdmin,
                    role: context.role,
                    permissions: [...context.permissions],
                    suspended: context.suspended,
                };
            }),
        });
    }
};
exports.AdminRouter = AdminRouter;
exports.AdminRouter = AdminRouter = AdminRouter_1 = __decorate([
    (0, common_1.Injectable)(),
    __metadata("design:paramtypes", [admin_realtime_service_1.AdminRealtimeService,
        admin_clip_scorer_service_1.AdminClipScorerService,
        admin_auth_service_1.AdminAuthService,
        admin_users_service_1.AdminUsersService,
        admin_workspaces_service_1.AdminWorkspacesService,
        admin_billing_service_1.AdminBillingService,
        admin_moderation_service_1.AdminModerationService,
        admin_operations_service_1.AdminOperationsService,
        admin_settings_service_1.AdminSettingsService,
        admin_audit_service_1.AdminAuditService,
        admin_comms_service_1.AdminCommsService,
        admin_supervision_service_1.AdminSupervisionService])
], AdminRouter);
//# sourceMappingURL=admin.router.js.map