ai-browser 0.2.2 → 0.2.4

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.
package/README.md CHANGED
@@ -33,6 +33,10 @@ Open `http://localhost:3000` — the homepage provides a semantic analysis demo
33
33
 
34
34
  Click **Settings** in the Agent page to set your LLM API key, base URL, and model. The Agent supports any OpenAI-compatible API.
35
35
 
36
+ Task-oriented pages:
37
+ - `http://localhost:3000/tasks.html` — submit TaskAgent tasks
38
+ - `http://localhost:3000/task-result.html?taskId=...` — inspect task status/result/event stream
39
+
36
40
  ### 3. Use with Claude Desktop (stdio MCP)
37
41
 
38
42
  Add to your `claude_desktop_config.json`:
@@ -251,9 +255,30 @@ Error responses include an `errorCode` field for programmatic handling:
251
255
  | `GET` | `/v1/sessions/:id/tabs` | List all tabs |
252
256
  | `POST` | `/v1/agent/run` | Start an agent task |
253
257
  | `GET` | `/v1/agent/:id/events` | SSE stream of agent events |
258
+ | `POST` | `/v1/tasks` | Submit a TaskAgent task |
259
+ | `GET` | `/v1/tasks/:taskId` | Query task status and result |
260
+ | `GET` | `/v1/tasks/:taskId/events` | SSE stream of task events |
254
261
  | `GET` | `/mcp/sse` | SSE MCP connection |
255
262
  | `POST` | `/mcp/message` | SSE MCP message endpoint |
256
263
 
264
+
265
+ ## Task API Quick Start
266
+
267
+ Submit a task:
268
+
269
+ ```bash
270
+ curl -sX POST http://127.0.0.1:3000/v1/tasks \
271
+ -H 'content-type: application/json' \
272
+ -d '{
273
+ "goal": "Batch extract page summaries",
274
+ "inputs": { "urls": ["https://example.com"] },
275
+ "constraints": { "maxDurationMs": 30000, "maxSteps": 20 },
276
+ "budget": { "maxRetries": 1, "maxToolCalls": 120 }
277
+ }'
278
+ ```
279
+
280
+ Then poll status by `taskId` (`GET /v1/tasks/:taskId`) or subscribe to events (`GET /v1/tasks/:taskId/events`).
281
+
257
282
  ## Headless / Headful Mode
258
283
 
259
284
  By default the browser runs in headless mode. To use headful mode (e.g. for manual login):
@@ -272,7 +297,7 @@ AI Browser uses a **trust level** system to control security policies across dif
272
297
 
273
298
  | Level | Entry Point | Description |
274
299
  |-------|-------------|-------------|
275
- | `local` | stdio MCP (`ai-browser-mcp`), Agent API | Full access — allows `file:` URLs, no private IP blocking |
300
+ | `local` | stdio MCP (`ai-browser-mcp`), Agent API, Task API (`/v1/tasks`) | Full access — allows `file:` URLs, no private IP blocking |
276
301
  | `remote` | SSE MCP (`/mcp/sse`) | Restricted — blocks private/loopback IPs, DNS rebinding protection, disables `upload_file` and `execute_javascript` |
277
302
 
278
303
  ### SSE Endpoint Restrictions (remote mode)
@@ -305,10 +330,12 @@ AI Browser is designed as a **single-user local tool**. All sessions share a sin
305
330
  git clone https://github.com/chenpu17/ai-browser.git
306
331
  cd ai-browser
307
332
  npm install
308
- npm run dev # Dev server with hot reload
309
- npm run build # Build TypeScript
310
- npm test # Run tests
311
- npm run test:run # Run tests once
333
+ npm run dev # Dev server with hot reload
334
+ npm run build # Build TypeScript
335
+ npm test # Run tests
336
+ npm run test:run # Run tests once
337
+ npm run baseline:v1 # Collect v1 baseline report
338
+ npm run stress:v1 # Run 100-task stress report
312
339
  ```
313
340
 
314
341
  ## License
@@ -0,0 +1,89 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
+ export interface TaskSpec {
4
+ taskId?: string;
5
+ goal: string;
6
+ inputs?: Record<string, unknown>;
7
+ constraints?: {
8
+ maxDurationMs?: number;
9
+ maxSteps?: number;
10
+ allowHumanInput?: boolean;
11
+ };
12
+ budget?: {
13
+ maxToolCalls?: number;
14
+ maxRetries?: number;
15
+ };
16
+ outputSchema?: Record<string, unknown>;
17
+ }
18
+ export type PlanStep = {
19
+ id: string;
20
+ type: 'template' | 'agent_goal';
21
+ templateId?: string;
22
+ inputs?: Record<string, unknown>;
23
+ goal?: string;
24
+ fallbackStepIds?: string[];
25
+ dependsOn?: string[];
26
+ };
27
+ export type PlannerRule = {
28
+ id: string;
29
+ match: (taskSpec: TaskSpec) => boolean;
30
+ buildStep: (taskSpec: TaskSpec) => PlanStep;
31
+ };
32
+ export type PlannerSource = 'rules' | 'llm_fallback' | 'fallback_agent_goal';
33
+ export type VerifyResult = {
34
+ pass: boolean;
35
+ score: number;
36
+ missingFields: string[];
37
+ typeMismatches: string[];
38
+ reason?: string;
39
+ };
40
+ export type TaskAgentResult = {
41
+ success: boolean;
42
+ runId?: string;
43
+ summary: string;
44
+ result?: unknown;
45
+ artifacts: string[];
46
+ verification: VerifyResult;
47
+ iterations: number;
48
+ traceId: string;
49
+ error?: string;
50
+ };
51
+ type GoalRunner = (goal: string) => Promise<{
52
+ success: boolean;
53
+ result?: unknown;
54
+ error?: string;
55
+ iterations?: number;
56
+ }>;
57
+ type PlannerClassifier = (taskSpec: TaskSpec) => Promise<PlanStep | null>;
58
+ export declare class TaskAgent extends EventEmitter {
59
+ private mcpClient;
60
+ private pollIntervalMs;
61
+ private runAgentGoal?;
62
+ private traceId;
63
+ private plannerRules;
64
+ private enableLlmFallback;
65
+ private classifyWithLlm?;
66
+ constructor(options: {
67
+ mcpClient: Client;
68
+ pollIntervalMs?: number;
69
+ runAgentGoal?: GoalRunner;
70
+ plannerRules?: PlannerRule[];
71
+ enableLlmFallback?: boolean;
72
+ classifyWithLlm?: PlannerClassifier;
73
+ });
74
+ resetTraceId(): string;
75
+ getTraceId(): string;
76
+ planResolved(taskSpec: TaskSpec): Promise<{
77
+ plan: PlanStep[];
78
+ source: PlannerSource;
79
+ }>;
80
+ plan(taskSpec: TaskSpec): PlanStep[];
81
+ repair(verify: VerifyResult, _lastRunContext: unknown): PlanStep[];
82
+ run(taskSpec: TaskSpec): Promise<TaskAgentResult>;
83
+ private planWithFallback;
84
+ private emitTaskEvent;
85
+ private executeTemplateStep;
86
+ private executeGoalStep;
87
+ }
88
+ export {};
89
+ //# sourceMappingURL=task-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-agent.d.ts","sourceRoot":"","sources":["../../src/agent/task-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,448 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { EventEmitter } from 'node:events';
3
+ const TERMINAL_STATUSES = new Set([
4
+ 'succeeded',
5
+ 'failed',
6
+ 'partial_success',
7
+ 'canceled',
8
+ ]);
9
+ export class TaskAgent extends EventEmitter {
10
+ mcpClient;
11
+ pollIntervalMs;
12
+ runAgentGoal;
13
+ traceId;
14
+ plannerRules;
15
+ enableLlmFallback;
16
+ classifyWithLlm;
17
+ constructor(options) {
18
+ super();
19
+ this.mcpClient = options.mcpClient;
20
+ this.pollIntervalMs = options.pollIntervalMs ?? 500;
21
+ this.runAgentGoal = options.runAgentGoal;
22
+ this.traceId = createTraceId();
23
+ this.plannerRules = options.plannerRules ?? defaultPlannerRules();
24
+ this.enableLlmFallback = options.enableLlmFallback ?? false;
25
+ this.classifyWithLlm = options.classifyWithLlm;
26
+ }
27
+ resetTraceId() {
28
+ this.traceId = createTraceId();
29
+ return this.traceId;
30
+ }
31
+ getTraceId() {
32
+ return this.traceId;
33
+ }
34
+ async planResolved(taskSpec) {
35
+ return this.planWithFallback(taskSpec);
36
+ }
37
+ plan(taskSpec) {
38
+ for (const rule of this.plannerRules) {
39
+ if (!rule.match(taskSpec))
40
+ continue;
41
+ return [rule.buildStep(taskSpec)];
42
+ }
43
+ return [{
44
+ id: 'step_1',
45
+ type: 'agent_goal',
46
+ goal: taskSpec.goal,
47
+ }];
48
+ }
49
+ repair(verify, _lastRunContext) {
50
+ if (verify.pass)
51
+ return [];
52
+ if (verify.missingFields.length === 0 && verify.typeMismatches.length === 0) {
53
+ return [];
54
+ }
55
+ return [{
56
+ id: 'repair_1',
57
+ type: 'agent_goal',
58
+ goal: `Please fill missing fields and fix type mismatches: missing=${verify.missingFields.join(',')}; type=${verify.typeMismatches.join(',')}`,
59
+ }];
60
+ }
61
+ async run(taskSpec) {
62
+ const planResult = await this.planResolved(taskSpec);
63
+ this.emitTaskEvent({ type: 'plan_created', plan: planResult.plan, plannerSource: planResult.source });
64
+ const maxRetries = Math.max(0, taskSpec.budget?.maxRetries ?? 0);
65
+ const maxSteps = Math.max(1, taskSpec.constraints?.maxSteps ?? Number.MAX_SAFE_INTEGER);
66
+ const usage = {
67
+ toolCalls: 0,
68
+ maxToolCalls: Math.max(1, taskSpec.budget?.maxToolCalls ?? Number.MAX_SAFE_INTEGER),
69
+ };
70
+ let retries = 0;
71
+ let currentPlan = planResult.plan;
72
+ let lastResult = null;
73
+ let lastArtifacts = [];
74
+ let lastRunId;
75
+ let iterations = 0;
76
+ const finalize = (result) => {
77
+ this.emitTaskEvent({
78
+ type: 'done',
79
+ success: result.success,
80
+ runId: result.runId,
81
+ summary: result.summary,
82
+ error: result.error,
83
+ iterations: result.iterations,
84
+ });
85
+ return result;
86
+ };
87
+ try {
88
+ while (true) {
89
+ for (const step of currentPlan) {
90
+ if (iterations >= maxSteps) {
91
+ const failVerify = {
92
+ pass: false,
93
+ score: 0,
94
+ missingFields: [],
95
+ typeMismatches: [],
96
+ reason: `maxSteps exceeded: ${maxSteps}`,
97
+ };
98
+ return finalize({
99
+ success: false,
100
+ runId: lastRunId,
101
+ summary: 'Task stopped by maxSteps budget',
102
+ result: lastResult,
103
+ artifacts: lastArtifacts,
104
+ verification: failVerify,
105
+ iterations,
106
+ traceId: this.traceId,
107
+ error: failVerify.reason,
108
+ });
109
+ }
110
+ iterations += 1;
111
+ if (step.type === 'template') {
112
+ const { runId, result, artifactIds } = await this.executeTemplateStep(step, taskSpec, usage);
113
+ lastRunId = runId;
114
+ lastResult = result;
115
+ lastArtifacts = artifactIds;
116
+ continue;
117
+ }
118
+ const goalResult = await this.executeGoalStep(step);
119
+ if (!goalResult.success) {
120
+ const failVerify = {
121
+ pass: false,
122
+ score: 0,
123
+ missingFields: [],
124
+ typeMismatches: [],
125
+ reason: goalResult.error || 'agent_goal execution failed',
126
+ };
127
+ return finalize({
128
+ success: false,
129
+ summary: 'Task failed in agent_goal execution',
130
+ result: goalResult.result,
131
+ artifacts: [],
132
+ verification: failVerify,
133
+ iterations,
134
+ traceId: this.traceId,
135
+ error: failVerify.reason,
136
+ });
137
+ }
138
+ lastResult = goalResult.result;
139
+ lastArtifacts = [];
140
+ }
141
+ const verification = verifyAgainstSchema(lastResult, taskSpec.outputSchema);
142
+ this.emitTaskEvent({ type: 'verification_result', verification });
143
+ if (verification.pass || retries >= maxRetries) {
144
+ return finalize({
145
+ success: verification.pass,
146
+ runId: lastRunId,
147
+ summary: verification.pass ? 'Task completed and verified' : 'Task completed but verification failed',
148
+ result: lastResult,
149
+ artifacts: lastArtifacts,
150
+ verification,
151
+ iterations,
152
+ traceId: this.traceId,
153
+ error: verification.pass ? undefined : verification.reason,
154
+ });
155
+ }
156
+ const patchPlan = this.repair(verification, { result: lastResult, runId: lastRunId });
157
+ if (patchPlan.length === 0) {
158
+ return finalize({
159
+ success: false,
160
+ runId: lastRunId,
161
+ summary: 'Verification failed and no repair plan generated',
162
+ result: lastResult,
163
+ artifacts: lastArtifacts,
164
+ verification,
165
+ iterations,
166
+ traceId: this.traceId,
167
+ error: verification.reason,
168
+ });
169
+ }
170
+ this.emitTaskEvent({ type: 'repair_attempted', retry: retries + 1, patchPlan, verification });
171
+ currentPlan = patchPlan;
172
+ retries += 1;
173
+ }
174
+ }
175
+ catch (err) {
176
+ const failVerify = {
177
+ pass: false,
178
+ score: 0,
179
+ missingFields: [],
180
+ typeMismatches: [],
181
+ reason: err?.message || 'task execution failed',
182
+ };
183
+ return finalize({
184
+ success: false,
185
+ runId: lastRunId,
186
+ summary: 'Task execution failed',
187
+ result: lastResult,
188
+ artifacts: lastArtifacts,
189
+ verification: failVerify,
190
+ iterations,
191
+ traceId: this.traceId,
192
+ error: failVerify.reason,
193
+ });
194
+ }
195
+ }
196
+ async planWithFallback(taskSpec) {
197
+ const rulePlan = this.plan(taskSpec);
198
+ if (rulePlan[0]?.type === 'template') {
199
+ return { plan: rulePlan, source: 'rules' };
200
+ }
201
+ if (!this.enableLlmFallback || !this.classifyWithLlm) {
202
+ return { plan: rulePlan, source: 'fallback_agent_goal' };
203
+ }
204
+ try {
205
+ const llmStep = await this.classifyWithLlm(taskSpec);
206
+ const normalized = normalizeClassifierStep(llmStep, taskSpec);
207
+ if (!normalized) {
208
+ return { plan: rulePlan, source: 'fallback_agent_goal' };
209
+ }
210
+ return { plan: [normalized], source: 'llm_fallback' };
211
+ }
212
+ catch {
213
+ return { plan: rulePlan, source: 'fallback_agent_goal' };
214
+ }
215
+ }
216
+ emitTaskEvent(payload) {
217
+ this.emit('event', {
218
+ traceId: this.traceId,
219
+ ts: new Date().toISOString(),
220
+ ...payload,
221
+ });
222
+ }
223
+ async executeTemplateStep(step, taskSpec, usage) {
224
+ if (!step.templateId) {
225
+ throw new Error('Template step missing templateId');
226
+ }
227
+ const timeoutMs = taskSpec.constraints?.maxDurationMs;
228
+ const runOptions = { mode: 'async' };
229
+ if (typeof timeoutMs === 'number' && timeoutMs > 0) {
230
+ runOptions.timeoutMs = timeoutMs;
231
+ }
232
+ if (taskSpec.outputSchema) {
233
+ runOptions.outputSchema = taskSpec.outputSchema;
234
+ }
235
+ usage.toolCalls += 1;
236
+ if (usage.toolCalls > usage.maxToolCalls) {
237
+ throw new Error(`maxToolCalls exceeded: ${usage.maxToolCalls}`);
238
+ }
239
+ const runResp = await this.mcpClient.callTool({
240
+ name: 'run_task_template',
241
+ arguments: {
242
+ templateId: step.templateId,
243
+ inputs: step.inputs ?? {},
244
+ options: runOptions,
245
+ },
246
+ });
247
+ const runData = parseTextJson(runResp, 'run_task_template');
248
+ const runId = runData?.runId;
249
+ if (!runId) {
250
+ throw new Error('run_task_template did not return runId');
251
+ }
252
+ const startedAt = Date.now();
253
+ const maxDurationMs = taskSpec.constraints?.maxDurationMs ?? 300_000;
254
+ while (true) {
255
+ const pollResp = await this.mcpClient.callTool({
256
+ name: 'get_task_run',
257
+ arguments: { runId },
258
+ });
259
+ const run = parseTextJson(pollResp, `get_task_run(${runId})`);
260
+ this.emitTaskEvent({ type: 'task_progress', runId, status: run?.status, progress: run?.progress });
261
+ if (TERMINAL_STATUSES.has(run?.status)) {
262
+ if (run.status === 'failed' || run.status === 'canceled') {
263
+ throw new Error(run?.error?.message || `run ${runId} failed with status ${run.status}`);
264
+ }
265
+ return {
266
+ runId,
267
+ result: run?.result,
268
+ artifactIds: Array.isArray(run?.artifactIds) ? run.artifactIds : [],
269
+ };
270
+ }
271
+ if (Date.now() - startedAt > maxDurationMs) {
272
+ throw new Error(`task step timeout after ${maxDurationMs}ms`);
273
+ }
274
+ await sleep(this.pollIntervalMs);
275
+ }
276
+ }
277
+ async executeGoalStep(step) {
278
+ if (!step.goal) {
279
+ return { success: false, error: 'agent_goal step missing goal' };
280
+ }
281
+ if (!this.runAgentGoal) {
282
+ return { success: false, error: 'runAgentGoal is not configured' };
283
+ }
284
+ try {
285
+ return await this.runAgentGoal(step.goal);
286
+ }
287
+ catch (err) {
288
+ return {
289
+ success: false,
290
+ error: err?.message || 'runAgentGoal execution failed',
291
+ };
292
+ }
293
+ }
294
+ }
295
+ function normalizeClassifierStep(step, taskSpec) {
296
+ if (!step)
297
+ return null;
298
+ if (step.type === 'template') {
299
+ if (!step.templateId)
300
+ return null;
301
+ return {
302
+ id: step.id || 'step_1',
303
+ type: 'template',
304
+ templateId: step.templateId,
305
+ inputs: step.inputs ?? taskSpec.inputs,
306
+ fallbackStepIds: step.fallbackStepIds,
307
+ dependsOn: step.dependsOn,
308
+ };
309
+ }
310
+ if (step.type === 'agent_goal') {
311
+ return {
312
+ id: step.id || 'step_1',
313
+ type: 'agent_goal',
314
+ goal: step.goal || taskSpec.goal,
315
+ fallbackStepIds: step.fallbackStepIds,
316
+ dependsOn: step.dependsOn,
317
+ };
318
+ }
319
+ return null;
320
+ }
321
+ function defaultPlannerRules() {
322
+ return [
323
+ {
324
+ id: 'compare_by_urls_or_goal',
325
+ match(taskSpec) {
326
+ const goal = taskSpec.goal.toLowerCase();
327
+ const urls = taskSpec.inputs?.urls;
328
+ return (Array.isArray(urls) && urls.length >= 2 && (goal.includes('对比') ||
329
+ goal.includes('比较') ||
330
+ goal.includes('compare') ||
331
+ goal.includes('diff')));
332
+ },
333
+ buildStep(taskSpec) {
334
+ return {
335
+ id: 'step_1',
336
+ type: 'template',
337
+ templateId: 'multi_tab_compare',
338
+ inputs: taskSpec.inputs,
339
+ };
340
+ },
341
+ },
342
+ {
343
+ id: 'batch_extract_by_urls',
344
+ match(taskSpec) {
345
+ const urls = taskSpec.inputs?.urls;
346
+ return Array.isArray(urls) && urls.length > 0;
347
+ },
348
+ buildStep(taskSpec) {
349
+ return {
350
+ id: 'step_1',
351
+ type: 'template',
352
+ templateId: 'batch_extract_pages',
353
+ inputs: taskSpec.inputs,
354
+ };
355
+ },
356
+ },
357
+ {
358
+ id: 'login_keep_session_by_goal',
359
+ match(taskSpec) {
360
+ const goal = taskSpec.goal.toLowerCase();
361
+ return goal.includes('login') || goal.includes('登录');
362
+ },
363
+ buildStep(taskSpec) {
364
+ return {
365
+ id: 'step_1',
366
+ type: 'template',
367
+ templateId: 'login_keep_session',
368
+ inputs: taskSpec.inputs,
369
+ };
370
+ },
371
+ },
372
+ ];
373
+ }
374
+ function parseTextJson(resp, context = 'tool response') {
375
+ const text = resp?.content?.[0]?.text;
376
+ if (!text)
377
+ return null;
378
+ try {
379
+ return JSON.parse(text);
380
+ }
381
+ catch (err) {
382
+ throw new Error(`Invalid JSON from ${context}: ${err?.message || 'parse failed'}`);
383
+ }
384
+ }
385
+ function sleep(ms) {
386
+ return new Promise((resolve) => setTimeout(resolve, ms));
387
+ }
388
+ function createTraceId() {
389
+ return `trace_${randomUUID()}`;
390
+ }
391
+ function verifyAgainstSchema(data, schema) {
392
+ if (!schema) {
393
+ return {
394
+ pass: true,
395
+ score: 1,
396
+ missingFields: [],
397
+ typeMismatches: [],
398
+ };
399
+ }
400
+ const missingFields = [];
401
+ const typeMismatches = [];
402
+ if (schema.type === 'object') {
403
+ if (!data || typeof data !== 'object' || Array.isArray(data)) {
404
+ return {
405
+ pass: false,
406
+ score: 0,
407
+ missingFields: schema.required ?? [],
408
+ typeMismatches: ['root'],
409
+ reason: 'result is not an object',
410
+ };
411
+ }
412
+ const obj = data;
413
+ for (const field of schema.required ?? []) {
414
+ if (obj[field] === undefined || obj[field] === null) {
415
+ missingFields.push(field);
416
+ }
417
+ }
418
+ for (const [key, fieldSchema] of Object.entries(schema.properties ?? {})) {
419
+ if (obj[key] === undefined || obj[key] === null || !fieldSchema.type)
420
+ continue;
421
+ if (!matchType(obj[key], fieldSchema.type)) {
422
+ typeMismatches.push(key);
423
+ }
424
+ }
425
+ }
426
+ const pass = missingFields.length === 0 && typeMismatches.length === 0;
427
+ const total = (schema.required?.length ?? 0) + Object.keys(schema.properties ?? {}).length || 1;
428
+ const failed = missingFields.length + typeMismatches.length;
429
+ return {
430
+ pass,
431
+ score: Math.max(0, 1 - failed / total),
432
+ missingFields,
433
+ typeMismatches,
434
+ reason: pass ? undefined : 'schema verification failed',
435
+ };
436
+ }
437
+ function matchType(value, expected) {
438
+ if (expected === 'array')
439
+ return Array.isArray(value);
440
+ if (expected === 'number')
441
+ return typeof value === 'number' && Number.isFinite(value);
442
+ if (expected === 'integer')
443
+ return typeof value === 'number' && Number.isInteger(value);
444
+ if (expected === 'object')
445
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
446
+ return typeof value === expected;
447
+ }
448
+ //# sourceMappingURL=task-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-agent.js","sourceRoot":"","sources":["../../src/agent/task-agent.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAcrD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAMxD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,eAAe,EACpB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,QA6pBzB"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAerD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAMxD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,eAAe,EACpB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,QAq7BzB"}