@elaraai/e3-api-server 0.0.2-beta.4 → 0.0.2-beta.41

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 (123) hide show
  1. package/README.md +145 -30
  2. package/dist/src/async-operation-state.d.ts +37 -0
  3. package/dist/src/async-operation-state.d.ts.map +1 -0
  4. package/dist/src/async-operation-state.js +118 -0
  5. package/dist/src/async-operation-state.js.map +1 -0
  6. package/dist/src/auth/device.d.ts +26 -0
  7. package/dist/src/auth/device.d.ts.map +1 -0
  8. package/dist/src/auth/device.js +227 -0
  9. package/dist/src/auth/device.js.map +1 -0
  10. package/dist/src/auth/discovery.d.ts +23 -0
  11. package/dist/src/auth/discovery.d.ts.map +1 -0
  12. package/dist/src/auth/discovery.js +40 -0
  13. package/dist/src/auth/discovery.js.map +1 -0
  14. package/dist/src/auth/index.d.ts +56 -0
  15. package/dist/src/auth/index.d.ts.map +1 -0
  16. package/dist/src/auth/index.js +69 -0
  17. package/dist/src/auth/index.js.map +1 -0
  18. package/dist/src/auth/keys.d.ts +55 -0
  19. package/dist/src/auth/keys.d.ts.map +1 -0
  20. package/dist/src/auth/keys.js +78 -0
  21. package/dist/src/auth/keys.js.map +1 -0
  22. package/dist/src/beast2.d.ts +15 -3
  23. package/dist/src/beast2.d.ts.map +1 -1
  24. package/dist/src/beast2.js +38 -8
  25. package/dist/src/beast2.js.map +1 -1
  26. package/dist/src/cli.js +58 -6
  27. package/dist/src/cli.js.map +1 -1
  28. package/dist/src/errors.d.ts.map +1 -1
  29. package/dist/src/errors.js +8 -2
  30. package/dist/src/errors.js.map +1 -1
  31. package/dist/src/handlers/dataflow.d.ts +43 -0
  32. package/dist/src/handlers/dataflow.d.ts.map +1 -0
  33. package/dist/src/handlers/dataflow.js +363 -0
  34. package/dist/src/handlers/dataflow.js.map +1 -0
  35. package/dist/src/handlers/datasets.d.ts +38 -0
  36. package/dist/src/handlers/datasets.d.ts.map +1 -0
  37. package/dist/src/handlers/datasets.js +222 -0
  38. package/dist/src/handlers/datasets.js.map +1 -0
  39. package/dist/src/handlers/index.d.ts +11 -0
  40. package/dist/src/handlers/index.d.ts.map +1 -0
  41. package/dist/src/handlers/index.js +11 -0
  42. package/dist/src/handlers/index.js.map +1 -0
  43. package/dist/src/handlers/packages.d.ts +18 -0
  44. package/dist/src/handlers/packages.d.ts.map +1 -0
  45. package/dist/src/handlers/packages.js +51 -0
  46. package/dist/src/handlers/packages.js.map +1 -0
  47. package/dist/src/handlers/repository.d.ts +24 -0
  48. package/dist/src/handlers/repository.d.ts.map +1 -0
  49. package/dist/src/handlers/repository.js +79 -0
  50. package/dist/src/handlers/repository.js.map +1 -0
  51. package/dist/src/handlers/tasks.d.ts +18 -0
  52. package/dist/src/handlers/tasks.d.ts.map +1 -0
  53. package/dist/src/handlers/tasks.js +134 -0
  54. package/dist/src/handlers/tasks.js.map +1 -0
  55. package/dist/src/handlers/workspaces.d.ts +34 -0
  56. package/dist/src/handlers/workspaces.d.ts.map +1 -0
  57. package/dist/src/handlers/workspaces.js +225 -0
  58. package/dist/src/handlers/workspaces.js.map +1 -0
  59. package/dist/src/index.d.ts +3 -0
  60. package/dist/src/index.d.ts.map +1 -1
  61. package/dist/src/index.js +6 -0
  62. package/dist/src/index.js.map +1 -1
  63. package/dist/src/middleware/auth.d.ts +51 -0
  64. package/dist/src/middleware/auth.d.ts.map +1 -0
  65. package/dist/src/middleware/auth.js +158 -0
  66. package/dist/src/middleware/auth.js.map +1 -0
  67. package/dist/src/orchestrator-manager.d.ts +45 -0
  68. package/dist/src/orchestrator-manager.d.ts.map +1 -0
  69. package/dist/src/orchestrator-manager.js +150 -0
  70. package/dist/src/orchestrator-manager.js.map +1 -0
  71. package/dist/src/routes/data.d.ts +21 -0
  72. package/dist/src/routes/data.d.ts.map +1 -0
  73. package/dist/src/routes/data.js +125 -0
  74. package/dist/src/routes/data.js.map +1 -0
  75. package/dist/src/routes/datasets.d.ts +2 -1
  76. package/dist/src/routes/datasets.d.ts.map +1 -1
  77. package/dist/src/routes/datasets.js +59 -83
  78. package/dist/src/routes/datasets.js.map +1 -1
  79. package/dist/src/routes/executions.d.ts +2 -1
  80. package/dist/src/routes/executions.d.ts.map +1 -1
  81. package/dist/src/routes/executions.js +54 -287
  82. package/dist/src/routes/executions.js.map +1 -1
  83. package/dist/src/routes/index.d.ts +15 -0
  84. package/dist/src/routes/index.d.ts.map +1 -0
  85. package/dist/src/routes/index.js +15 -0
  86. package/dist/src/routes/index.js.map +1 -0
  87. package/dist/src/routes/objects.d.ts +8 -0
  88. package/dist/src/routes/objects.d.ts.map +1 -0
  89. package/dist/src/routes/objects.js +38 -0
  90. package/dist/src/routes/objects.js.map +1 -0
  91. package/dist/src/routes/package-transfer.d.ts +23 -0
  92. package/dist/src/routes/package-transfer.d.ts.map +1 -0
  93. package/dist/src/routes/package-transfer.js +168 -0
  94. package/dist/src/routes/package-transfer.js.map +1 -0
  95. package/dist/src/routes/packages.d.ts +2 -1
  96. package/dist/src/routes/packages.d.ts.map +1 -1
  97. package/dist/src/routes/packages.js +18 -109
  98. package/dist/src/routes/packages.js.map +1 -1
  99. package/dist/src/routes/repository.d.ts +2 -1
  100. package/dist/src/routes/repository.d.ts.map +1 -1
  101. package/dist/src/routes/repository.js +19 -54
  102. package/dist/src/routes/repository.js.map +1 -1
  103. package/dist/src/routes/tasks.d.ts +2 -1
  104. package/dist/src/routes/tasks.d.ts.map +1 -1
  105. package/dist/src/routes/tasks.js +22 -46
  106. package/dist/src/routes/tasks.js.map +1 -1
  107. package/dist/src/routes/transfer.d.ts +19 -0
  108. package/dist/src/routes/transfer.d.ts.map +1 -0
  109. package/dist/src/routes/transfer.js +124 -0
  110. package/dist/src/routes/transfer.js.map +1 -0
  111. package/dist/src/routes/workspaces.d.ts +2 -1
  112. package/dist/src/routes/workspaces.d.ts.map +1 -1
  113. package/dist/src/routes/workspaces.js +45 -116
  114. package/dist/src/routes/workspaces.js.map +1 -1
  115. package/dist/src/server.d.ts +24 -3
  116. package/dist/src/server.d.ts.map +1 -1
  117. package/dist/src/server.js +266 -19
  118. package/dist/src/server.js.map +1 -1
  119. package/dist/src/types.d.ts +1385 -731
  120. package/dist/src/types.d.ts.map +1 -1
  121. package/dist/src/types.js +238 -2
  122. package/dist/src/types.js.map +1 -1
  123. package/package.json +16 -4
@@ -2,44 +2,291 @@
2
2
  * Copyright (c) 2025 Elara AI Pty Ltd
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
+ import * as path from 'node:path';
5
6
  import { Hono } from 'hono';
6
7
  import { cors } from 'hono/cors';
7
8
  import { serve } from '@hono/node-server';
8
- import { createRepositoryRoutes } from './routes/repository.js';
9
+ import { LocalStorage, RepoAlreadyExistsError, RepoNotFoundError, InMemoryTransferBackend } from '@elaraai/e3-core';
10
+ import { createAuthMiddleware } from './middleware/auth.js';
11
+ import { createOidcProvider } from './auth/index.js';
12
+ import { sendError, sendSuccessWithStatus, sendSuccess } from './beast2.js';
13
+ import { StringType, NullType, variant, ArrayType } from '@elaraai/east';
14
+ import { errorToVariant } from './errors.js';
9
15
  import { createPackageRoutes } from './routes/packages.js';
10
16
  import { createWorkspaceRoutes } from './routes/workspaces.js';
11
17
  import { createDatasetRoutes } from './routes/datasets.js';
12
18
  import { createTaskRoutes } from './routes/tasks.js';
13
19
  import { createExecutionRoutes } from './routes/executions.js';
20
+ import { createRepositoryRoutes } from './routes/repository.js';
21
+ import { createObjectRoutes } from './routes/objects.js';
22
+ import { createTransferRoutes } from './routes/transfer.js';
23
+ import { createPackageTransferRoutes } from './routes/package-transfer.js';
24
+ import { createDataEndpoints } from './routes/data.js';
14
25
  /**
15
26
  * Create an e3 API server.
16
27
  *
28
+ * The server operates in multi-repo mode, serving multiple repositories
29
+ * from subdirectories of the configured reposDir.
30
+ *
31
+ * URL structure:
32
+ * - GET /api/repos - List available repositories
33
+ * - /api/repos/:repo/... - Repository-specific endpoints
34
+ *
17
35
  * @param config - Server configuration
18
36
  * @returns Server instance
19
37
  */
20
- export function createServer(config) {
21
- const { repo: repoPath, port = 3000, host = 'localhost', cors: enableCors = false } = config;
38
+ export async function createServer(config) {
39
+ const { reposDir, singleRepoPath, port = 3000, host = 'localhost', cors: enableCors = false, auth, oidc } = config;
40
+ // Validate config: exactly one of reposDir or singleRepoPath must be specified
41
+ if (reposDir && singleRepoPath) {
42
+ throw new Error('Cannot specify both reposDir and singleRepoPath');
43
+ }
44
+ if (!reposDir && !singleRepoPath) {
45
+ throw new Error('Must specify either reposDir or singleRepoPath');
46
+ }
47
+ const isSingleRepoMode = !!singleRepoPath;
48
+ // Single storage instance shared across all requests
49
+ // Pass reposDir for multi-repo mode to enable storage.repos.* operations
50
+ const storage = new LocalStorage(isSingleRepoMode ? undefined : reposDir);
51
+ // Helper to compute repo path from repo name
52
+ // In single-repo mode, middleware validates 'default' before routes are called
53
+ const getRepoPath = (repoName) => {
54
+ if (isSingleRepoMode) {
55
+ // Middleware ensures repoName === 'default' before we get here
56
+ return singleRepoPath;
57
+ }
58
+ return path.join(reposDir, repoName);
59
+ };
22
60
  const app = new Hono();
23
61
  // Enable CORS if configured
24
62
  if (enableCors) {
25
63
  app.use('*', cors({ origin: '*' }));
64
+ // Allow Private Network Access (required for extension webviews on WiFi)
65
+ app.use('*', async (c, next) => {
66
+ await next();
67
+ if (c.req.header('Access-Control-Request-Private-Network') === 'true') {
68
+ c.header('Access-Control-Allow-Private-Network', 'true');
69
+ }
70
+ });
71
+ }
72
+ // Create OIDC provider if configured (built-in auth server)
73
+ let oidcProvider;
74
+ if (oidc) {
75
+ oidcProvider = createOidcProvider(oidc);
76
+ // Mount OIDC routes at root (/.well-known/*, /oauth2/*, /device)
77
+ app.route('/', oidcProvider.routes);
78
+ }
79
+ // Transfer backend for presigned URL object transfer
80
+ const transferBackend = new InMemoryTransferBackend({ baseUrl: '' });
81
+ // Data routes (no auth — capability-URL pattern via UUID)
82
+ // Must be mounted BEFORE auth middleware so they bypass JWT validation.
83
+ // In cloud deployments these URLs are S3 presigned URLs that reject auth headers.
84
+ const pkgTransfer = createPackageTransferRoutes(storage, getRepoPath, transferBackend);
85
+ const dsTransfer = createTransferRoutes(storage, getRepoPath, transferBackend);
86
+ const dataEndpoints = createDataEndpoints(transferBackend, storage, getRepoPath);
87
+ app.route('/api/uploads', dataEndpoints.uploads);
88
+ app.route('/api/downloads', dataEndpoints.downloads);
89
+ // Apply auth middleware to all repo-specific routes if configured
90
+ // If OIDC is enabled but auth is not separately configured, use OIDC keys for validation
91
+ if (auth) {
92
+ const authMiddleware = await createAuthMiddleware(auth);
93
+ app.use('/api/repos/:repo/*', authMiddleware);
94
+ }
95
+ else if (oidcProvider) {
96
+ // Use the OIDC provider's keys for JWT validation
97
+ const authMiddleware = await createAuthMiddleware({
98
+ jwksUrl: `${oidc.baseUrl}/.well-known/jwks.json`,
99
+ issuer: oidc.baseUrl,
100
+ audience: oidc.baseUrl,
101
+ // Provide keys directly to avoid HTTP fetch to self
102
+ _internalKeys: oidcProvider.keys,
103
+ });
104
+ app.use('/api/repos/:repo/*', authMiddleware);
105
+ }
106
+ // Single-repo mode: validate repo name and handle disabled operations
107
+ // Runs AFTER auth middleware (so unauthorized users get 401, not 404/405)
108
+ // Uses JSON error responses with HTTP error status codes because middleware
109
+ // cannot know the BEAST2 success type expected by the handler.
110
+ if (isSingleRepoMode) {
111
+ // Block repo-level PUT (create) and DELETE (remove) in single-repo mode
112
+ app.put('/api/repos/:repo', (c) => {
113
+ return c.json({
114
+ error: 'method_not_allowed',
115
+ message: 'Repository creation is disabled in single-repo mode'
116
+ }, 405);
117
+ });
118
+ app.delete('/api/repos/:repo', (c) => {
119
+ const repo = c.req.param('repo');
120
+ if (repo === 'default') {
121
+ return c.json({
122
+ error: 'method_not_allowed',
123
+ message: 'Repository deletion is disabled in single-repo mode'
124
+ }, 405);
125
+ }
126
+ return c.json({ error: 'not_found', message: `Repository '${repo}' not found` }, 404);
127
+ });
128
+ // Validate repo name for all sub-routes
129
+ app.use('/api/repos/:repo/*', async (c, next) => {
130
+ const repo = c.req.param('repo');
131
+ if (repo !== 'default') {
132
+ return c.json({ error: 'not_found', message: `Repository '${repo}' not found` }, 404);
133
+ }
134
+ await next();
135
+ });
136
+ }
137
+ // Validate repository exists and is accessible before processing requests (multi-repo mode only)
138
+ // In single-repo mode, this is handled by the middleware above
139
+ // Skip validation for PUT/DELETE on /api/repos/:repo (repo create/remove)
140
+ // Skip validation for /api/repos/:repo/delete/* (repo deletion status - repo may already be deleted)
141
+ // Uses JSON error responses with HTTP 404 because middleware cannot know
142
+ // the BEAST2 success type expected by the handler.
143
+ if (!isSingleRepoMode) {
144
+ app.use('/api/repos/:repo/*', async (c, next) => {
145
+ // Skip validation for repo create/remove operations at the repo level
146
+ // These operate on repos that may not exist yet (PUT) or are being deleted (DELETE)
147
+ const method = c.req.method;
148
+ const reqPath = c.req.path;
149
+ // Check if this is the base repo path (no subpath after repo name)
150
+ const repoPathMatch = reqPath.match(/^\/api\/repos\/[^/]+$/);
151
+ if (repoPathMatch && (method === 'PUT' || method === 'DELETE')) {
152
+ await next();
153
+ return;
154
+ }
155
+ // Skip validation for delete status endpoint (repo may already be deleted)
156
+ const deleteStatusMatch = reqPath.match(/^\/api\/repos\/[^/]+\/delete\/[^/]+$/);
157
+ if (deleteStatusMatch) {
158
+ await next();
159
+ return;
160
+ }
161
+ const repo = c.req.param('repo');
162
+ // Check repo metadata for status
163
+ const metadata = await storage.repos.getMetadata(repo);
164
+ if (!metadata) {
165
+ return c.json({ error: 'not_found', message: `Repository '${repo}' not found` }, 404);
166
+ }
167
+ // If repo is in 'deleting' state, treat as not found for most operations
168
+ // Exception: status endpoint shows 'deleting' state (but we still check repo exists above)
169
+ const statusMatch = reqPath.match(/^\/api\/repos\/[^/]+\/status$/);
170
+ if (metadata.status === 'deleting' && !statusMatch) {
171
+ return c.json({ error: 'not_found', message: `Repository '${repo}' not found` }, 404);
172
+ }
173
+ // Also validate the repo structure (for backwards compat with repos without metadata)
174
+ const repoPath = getRepoPath(repo);
175
+ try {
176
+ await storage.validateRepository(repoPath);
177
+ }
178
+ catch (err) {
179
+ if (err instanceof RepoNotFoundError) {
180
+ return c.json({ error: 'not_found', message: `Repository '${repo}' not found` }, 404);
181
+ }
182
+ throw err;
183
+ }
184
+ await next();
185
+ });
186
+ }
187
+ // GET /api/repos - List available repositories
188
+ app.get('/api/repos', async () => {
189
+ if (isSingleRepoMode) {
190
+ return sendSuccess(ArrayType(StringType), ['default']);
191
+ }
192
+ try {
193
+ const repos = await storage.repos.list();
194
+ return sendSuccess(ArrayType(StringType), repos);
195
+ }
196
+ catch (err) {
197
+ return sendError(ArrayType(StringType), errorToVariant(err));
198
+ }
199
+ });
200
+ // PUT /api/repos/:repo - Create a new repository (multi-repo mode only)
201
+ // Note: Single-repo mode handler is registered earlier and takes precedence
202
+ if (!isSingleRepoMode) {
203
+ app.put('/api/repos/:repo', async (c) => {
204
+ const repo = c.req.param('repo');
205
+ try {
206
+ // Check if repo exists and is in 'deleting' state
207
+ const existing = await storage.repos.getMetadata(repo);
208
+ if (existing) {
209
+ if (existing.status === 'deleting') {
210
+ return sendError(StringType, variant('internal', { message: `Repository '${repo}' cleanup in progress, try later` }));
211
+ }
212
+ return sendError(StringType, variant('internal', { message: `Repository '${repo}' already exists` }));
213
+ }
214
+ await storage.repos.create(repo);
215
+ return sendSuccessWithStatus(StringType, repo, 201);
216
+ }
217
+ catch (err) {
218
+ if (err instanceof RepoAlreadyExistsError) {
219
+ return sendError(StringType, variant('internal', { message: `Repository '${repo}' already exists` }));
220
+ }
221
+ return sendError(StringType, errorToVariant(err));
222
+ }
223
+ });
224
+ // DELETE /api/repos/:repo - Remove a repository (async, multi-repo mode only)
225
+ // Uses the resumable deletion pattern:
226
+ // 1. Mark repo as 'deleting' (atomic tombstone)
227
+ // 2. Delete refs synchronously (fast)
228
+ // 3. Delete objects in batches
229
+ // 4. Remove repo metadata
230
+ // Note: For cloud (e3-aws), step 3 would be async via GC
231
+ app.delete('/api/repos/:repo', async (c) => {
232
+ const repo = c.req.param('repo');
233
+ try {
234
+ // Check if repo exists
235
+ const existing = await storage.repos.getMetadata(repo);
236
+ if (!existing) {
237
+ return sendError(NullType, variant('repository_not_found', { repo }));
238
+ }
239
+ // If already deleting, return success (idempotent)
240
+ if (existing.status === 'deleting') {
241
+ return sendSuccess(NullType, null);
242
+ }
243
+ // 1. Atomically mark as 'deleting'
244
+ await storage.repos.setStatus(repo, 'deleting', 'active');
245
+ // 2. Delete refs synchronously (fast for local storage)
246
+ let cursor;
247
+ do {
248
+ const result = await storage.repos.deleteRefsBatch(repo, cursor);
249
+ cursor = result.status === 'continue' ? result.cursor : undefined;
250
+ } while (cursor);
251
+ // 3. Delete objects in batches (for local storage, this is synchronous)
252
+ cursor = undefined;
253
+ do {
254
+ const result = await storage.repos.deleteObjectsBatch(repo, cursor);
255
+ cursor = result.status === 'continue' ? result.cursor : undefined;
256
+ } while (cursor);
257
+ // 4. Remove repo metadata/directory
258
+ await storage.repos.remove(repo);
259
+ return sendSuccess(NullType, null);
260
+ }
261
+ catch (err) {
262
+ if (err instanceof RepoNotFoundError) {
263
+ return sendError(NullType, variant('repository_not_found', { repo }));
264
+ }
265
+ return sendError(NullType, errorToVariant(err));
266
+ }
267
+ });
26
268
  }
27
- // Repository routes: /api/status, /api/gc
28
- app.route('/api', createRepositoryRoutes(repoPath));
29
- // Package routes: /api/packages/*
30
- app.route('/api/packages', createPackageRoutes(repoPath));
31
- // Workspace routes: /api/workspaces/*
32
- const workspaceRoutes = createWorkspaceRoutes(repoPath);
33
- app.route('/api/workspaces', workspaceRoutes);
34
- // Dataset routes mounted under workspaces: /api/workspaces/:ws/list, /get, /set
35
- const datasetRoutes = createDatasetRoutes(repoPath);
36
- app.route('/api/workspaces/:ws', datasetRoutes);
37
- // Task routes: /api/workspaces/:ws/tasks/*
38
- const taskRoutes = createTaskRoutes(repoPath);
39
- app.route('/api/workspaces/:ws/tasks', taskRoutes);
40
- // Execution routes: /api/workspaces/:ws/start, /status, /graph, /logs/:task
41
- const executionRoutes = createExecutionRoutes(repoPath);
42
- app.route('/api/workspaces/:ws', executionRoutes);
269
+ // Mount repository-specific routes
270
+ // Each route file creates a sub-app that uses getRepoPath to resolve the repo
271
+ // Repository status and GC: /api/repos/:repo/status, /api/repos/:repo/gc
272
+ app.route('/api/repos/:repo', createRepositoryRoutes(storage, getRepoPath));
273
+ // Package transfer routes: repo-level import/export + package-level export trigger
274
+ app.route('/api/repos/:repo', pkgTransfer.repoApi);
275
+ app.route('/api/repos/:repo/packages', pkgTransfer.pkgApi);
276
+ // Package routes: /api/repos/:repo/packages/*
277
+ app.route('/api/repos/:repo/packages', createPackageRoutes(storage, getRepoPath));
278
+ // Workspace routes: /api/repos/:repo/workspaces/*
279
+ app.route('/api/repos/:repo/workspaces', createWorkspaceRoutes(storage, getRepoPath));
280
+ // Dataset transfer auth routes (init + commit) mount alongside dataset routes
281
+ app.route('/api/repos/:repo/workspaces/:ws/datasets', dsTransfer.api);
282
+ // Dataset routes: /api/repos/:repo/workspaces/:ws/datasets/*
283
+ app.route('/api/repos/:repo/workspaces/:ws/datasets', createDatasetRoutes(storage, getRepoPath, transferBackend));
284
+ // Task routes: /api/repos/:repo/workspaces/:ws/tasks/*
285
+ app.route('/api/repos/:repo/workspaces/:ws/tasks', createTaskRoutes(storage, getRepoPath));
286
+ // Execution/Dataflow routes: /api/repos/:repo/workspaces/:ws/dataflow/*
287
+ app.route('/api/repos/:repo/workspaces/:ws/dataflow', createExecutionRoutes(storage, getRepoPath));
288
+ // Object routes: /api/repos/:repo/objects/:hash
289
+ app.route('/api/repos/:repo/objects', createObjectRoutes(storage, getRepoPath));
43
290
  let httpServer = null;
44
291
  let actualPort = port;
45
292
  const server = {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}