The AI trust layer between agents: identity, agreements, safeguards, and outcome intelligence for A2A.

Viewing files at commit 18afdc33bab8Commit detailsView latest

api/index.ts 44 lines · 2.0 KB · typescript
1
import type { IncomingMessage, ServerResponse } from 'node:http';
2
import { buildApi } from '../apps/api/src/app.js';
3
import { TrustEngine } from '../packages/core/src/index.js';
4
import { HostedRepository } from '../packages/persistence/src/hosted.js';
5
import { dashboardTokenFromCookie, loadAuth0Profile, verifyAuth0Token } from './auth0.js';
6
7
const databaseUrl = process.env.DATABASE_URL;
8
const repository = databaseUrl ? new HostedRepository(databaseUrl) : undefined;
9
const app = buildApi(new TrustEngine(), undefined, repository);
10
const ready = app.ready();
11
12
export default async function handler(request: IncomingMessage, response: ServerResponse) {
13
  const incoming = new URL(request.url ?? '/', 'https://openclasp.local');
14
  const target = incoming.searchParams.get('path');
15
  if (target) request.url = target;
16
  if ((request.url ?? '').startsWith('/v0.1/')) {
17
    const authorization = request.headers.authorization;
18
    const token = authorization?.startsWith('Bearer ')
19
      ? authorization.slice(7)
20
      : dashboardTokenFromCookie(request.headers.cookie);
21
    if (!token) {
22
      response.statusCode = 401;
23
      response.setHeader('content-type', 'application/json');
24
      response.end(JSON.stringify({ error: 'authentication_required' }));
25
      return;
26
    }
27
    try {
28
      const authentication = await verifyAuth0Token(token, { dashboard: true });
29
      request.headers['x-openclasp-operator'] = authentication.payload.sub!;
30
      if ((request.url ?? '').startsWith('/v0.1/account')) {
31
        const user = await loadAuth0Profile(token);
32
        request.headers['x-openclasp-email'] = encodeURIComponent(user.email ?? '');
33
        request.headers['x-openclasp-name'] = encodeURIComponent(user.name ?? '');
34
      }
35
    } catch {
36
      response.statusCode = 401;
37
      response.setHeader('content-type', 'application/json');
38
      response.end(JSON.stringify({ error: 'invalid_session' }));
39
      return;
40
    }
41
  }
42
  await ready;
43
  app.server.emit('request', request, response);
44
}