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

Viewing files at commit a93dad91899fCommit detailsView latest

api/index.ts 40 lines · 1.8 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 { 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 ') ? authorization.slice(7) : undefined;
19
    if (!token) {
20
      response.statusCode = 401;
21
      response.setHeader('content-type', 'application/json');
22
      response.end(JSON.stringify({ error: 'authentication_required' }));
23
      return;
24
    }
25
    try {
26
      const authentication = await verifyAuth0Token(token, { dashboard: true });
27
      request.headers['x-openclasp-operator'] = authentication.payload.sub!;
28
      const user = await loadAuth0Profile(token);
29
      request.headers['x-openclasp-email'] = encodeURIComponent(user.email ?? '');
30
      request.headers['x-openclasp-name'] = encodeURIComponent(user.name ?? '');
31
    } catch {
32
      response.statusCode = 401;
33
      response.setHeader('content-type', 'application/json');
34
      response.end(JSON.stringify({ error: 'invalid_session' }));
35
      return;
36
    }
37
  }
38
  await ready;
39
  app.server.emit('request', request, response);
40
}