@autonoma-ai/server-express 0.1.0 → 0.1.3

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 ADDED
@@ -0,0 +1,72 @@
1
+ # @autonoma-ai/server-express
2
+
3
+ Express/Fastify server adapter for the Autonoma SDK.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @autonoma-ai/sdk @autonoma-ai/sdk-prisma @autonoma-ai/server-express
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Express
14
+
15
+ ```typescript
16
+ import express from 'express'
17
+ import { createExpressHandler } from '@autonoma-ai/server-express'
18
+ import { prismaAdapter } from '@autonoma-ai/sdk-prisma'
19
+ import { prisma } from './db'
20
+
21
+ const app = express()
22
+
23
+ app.post('/api/autonoma', createExpressHandler({
24
+ adapter: prismaAdapter(prisma, { scopeField: 'organizationId' }),
25
+ sharedSecret: process.env.AUTONOMA_SHARED_SECRET!,
26
+ signingSecret: process.env.AUTONOMA_SIGNING_SECRET!,
27
+ auth: async (user) => {
28
+ const session = await createSession(user.id as string)
29
+ return { token: session.token }
30
+ },
31
+ }))
32
+ ```
33
+
34
+ ### Fastify
35
+
36
+ ```typescript
37
+ import Fastify from 'fastify'
38
+ import { createExpressHandler } from '@autonoma-ai/server-express'
39
+
40
+ const app = Fastify()
41
+ const handler = createExpressHandler(config)
42
+
43
+ app.post('/api/autonoma', async (req, reply) => {
44
+ await handler(req.raw, reply.raw)
45
+ })
46
+ ```
47
+
48
+ > **Note:** Do not add `express.json()` middleware before this route. The adapter needs the raw body string to verify the HMAC signature.
49
+
50
+ ## Auth callback
51
+
52
+ The `auth` callback receives the first `User` created during setup and must return real credentials that the test runner can use to log in:
53
+
54
+ ```typescript
55
+ // Session cookie
56
+ auth: async (user) => {
57
+ const session = await createSession(user.id as string)
58
+ return {
59
+ cookies: [{ name: 'session', value: session.token, httpOnly: true, sameSite: 'lax', path: '/' }],
60
+ }
61
+ }
62
+
63
+ // Bearer token
64
+ auth: async (user) => {
65
+ const token = jwt.sign({ sub: user.id }, SECRET)
66
+ return { token }
67
+ }
68
+ ```
69
+
70
+ ## Documentation
71
+
72
+ Full docs: [docs/](../../docs/) — see [setup guide](../../docs/setup.txt).
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // src/index.ts
2
2
  import { handleRequest } from "@autonoma-ai/sdk";
3
3
  function createExpressHandler(config) {
4
+ const enrichedConfig = { ...config, sdk: { ...config.sdk, server: "express" } };
4
5
  return async (req, res) => {
5
6
  const body = await readBody(req);
6
7
  const headers = {};
@@ -9,7 +10,7 @@ function createExpressHandler(config) {
9
10
  else if (Array.isArray(val)) headers[key.toLowerCase()] = val[0] ?? "";
10
11
  }
11
12
  const handlerReq = { body, headers };
12
- const result = await handleRequest(config, handlerReq);
13
+ const result = await handleRequest(enrichedConfig, handlerReq);
13
14
  res.status(result.status).json(result.body);
14
15
  };
15
16
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { handleRequest } from '@autonoma-ai/sdk'\nimport type { HandlerConfig, HandlerRequest } from '@autonoma-ai/sdk'\n\ninterface ExpressRequest {\n body?: unknown\n headers: Record<string, string | string[] | undefined>\n on(event: string, listener: (...args: unknown[]) => void): void\n}\n\ninterface ExpressResponse {\n status(code: number): ExpressResponse\n json(body: unknown): void\n}\n\n/**\n * Create an Express-compatible handler.\n *\n * @example\n * ```ts\n * import { createExpressHandler } from '@autonoma-ai/server-express'\n * app.post('/api/autonoma', createExpressHandler(config))\n * ```\n */\nexport function createExpressHandler(config: HandlerConfig) {\n return async (req: ExpressRequest, res: ExpressResponse): Promise<void> => {\n const body = await readBody(req)\n const headers: Record<string, string> = {}\n for (const [key, val] of Object.entries(req.headers)) {\n if (typeof val === 'string') headers[key.toLowerCase()] = val\n else if (Array.isArray(val)) headers[key.toLowerCase()] = val[0] ?? ''\n }\n\n const handlerReq: HandlerRequest = { body, headers }\n const result = await handleRequest(config, handlerReq)\n res.status(result.status).json(result.body)\n }\n}\n\nfunction readBody(req: ExpressRequest): Promise<string> {\n if (req.body !== undefined && req.body !== null) {\n return Promise.resolve(\n typeof req.body === 'string' ? req.body : JSON.stringify(req.body),\n )\n }\n\n return new Promise((resolve, reject) => {\n const chunks: unknown[] = []\n req.on('data', (...args: unknown[]) => chunks.push(args[0]))\n req.on('end', () => resolve(Buffer.concat(chunks as Uint8Array[]).toString()))\n req.on('error', (...args: unknown[]) => reject(args[0]))\n })\n}\n"],"mappings":";AAAA,SAAS,qBAAqB;AAuBvB,SAAS,qBAAqB,QAAuB;AAC1D,SAAO,OAAO,KAAqB,QAAwC;AACzE,UAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,UAAM,UAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACpD,UAAI,OAAO,QAAQ,SAAU,SAAQ,IAAI,YAAY,CAAC,IAAI;AAAA,eACjD,MAAM,QAAQ,GAAG,EAAG,SAAQ,IAAI,YAAY,CAAC,IAAI,IAAI,CAAC,KAAK;AAAA,IACtE;AAEA,UAAM,aAA6B,EAAE,MAAM,QAAQ;AACnD,UAAM,SAAS,MAAM,cAAc,QAAQ,UAAU;AACrD,QAAI,OAAO,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,EAC5C;AACF;AAEA,SAAS,SAAS,KAAsC;AACtD,MAAI,IAAI,SAAS,UAAa,IAAI,SAAS,MAAM;AAC/C,WAAO,QAAQ;AAAA,MACb,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,IACnE;AAAA,EACF;AAEA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAoB,CAAC;AAC3B,QAAI,GAAG,QAAQ,IAAI,SAAoB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC;AAC3D,QAAI,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAsB,EAAE,SAAS,CAAC,CAAC;AAC7E,QAAI,GAAG,SAAS,IAAI,SAAoB,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,EACzD,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { handleRequest } from '@autonoma-ai/sdk'\nimport type { HandlerConfig, HandlerRequest } from '@autonoma-ai/sdk'\n\ninterface ExpressRequest {\n body?: unknown\n headers: Record<string, string | string[] | undefined>\n on(event: string, listener: (...args: unknown[]) => void): void\n}\n\ninterface ExpressResponse {\n status(code: number): ExpressResponse\n json(body: unknown): void\n}\n\n/**\n * Create an Express-compatible handler.\n *\n * @example\n * ```ts\n * import { createExpressHandler } from '@autonoma-ai/server-express'\n * app.post('/api/autonoma', createExpressHandler(config))\n * ```\n */\nexport function createExpressHandler(config: HandlerConfig) {\n const enrichedConfig = { ...config, sdk: { ...config.sdk, server: 'express' } }\n return async (req: ExpressRequest, res: ExpressResponse): Promise<void> => {\n const body = await readBody(req)\n const headers: Record<string, string> = {}\n for (const [key, val] of Object.entries(req.headers)) {\n if (typeof val === 'string') headers[key.toLowerCase()] = val\n else if (Array.isArray(val)) headers[key.toLowerCase()] = val[0] ?? ''\n }\n\n const handlerReq: HandlerRequest = { body, headers }\n const result = await handleRequest(enrichedConfig, handlerReq)\n res.status(result.status).json(result.body)\n }\n}\n\nfunction readBody(req: ExpressRequest): Promise<string> {\n if (req.body !== undefined && req.body !== null) {\n return Promise.resolve(\n typeof req.body === 'string' ? req.body : JSON.stringify(req.body),\n )\n }\n\n return new Promise((resolve, reject) => {\n const chunks: unknown[] = []\n req.on('data', (...args: unknown[]) => chunks.push(args[0]))\n req.on('end', () => resolve(Buffer.concat(chunks as Uint8Array[]).toString()))\n req.on('error', (...args: unknown[]) => reject(args[0]))\n })\n}\n"],"mappings":";AAAA,SAAS,qBAAqB;AAuBvB,SAAS,qBAAqB,QAAuB;AAC1D,QAAM,iBAAiB,EAAE,GAAG,QAAQ,KAAK,EAAE,GAAG,OAAO,KAAK,QAAQ,UAAU,EAAE;AAC9E,SAAO,OAAO,KAAqB,QAAwC;AACzE,UAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,UAAM,UAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACpD,UAAI,OAAO,QAAQ,SAAU,SAAQ,IAAI,YAAY,CAAC,IAAI;AAAA,eACjD,MAAM,QAAQ,GAAG,EAAG,SAAQ,IAAI,YAAY,CAAC,IAAI,IAAI,CAAC,KAAK;AAAA,IACtE;AAEA,UAAM,aAA6B,EAAE,MAAM,QAAQ;AACnD,UAAM,SAAS,MAAM,cAAc,gBAAgB,UAAU;AAC7D,QAAI,OAAO,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,EAC5C;AACF;AAEA,SAAS,SAAS,KAAsC;AACtD,MAAI,IAAI,SAAS,UAAa,IAAI,SAAS,MAAM;AAC/C,WAAO,QAAQ;AAAA,MACb,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,IACnE;AAAA,EACF;AAEA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAoB,CAAC;AAC3B,QAAI,GAAG,QAAQ,IAAI,SAAoB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC;AAC3D,QAAI,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAsB,EAAE,SAAS,CAAC,CAAC;AAC7E,QAAI,GAAG,SAAS,IAAI,SAAoB,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,EACzD,CAAC;AACH;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autonoma-ai/server-express",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "Express/Fastify server adapter for Autonoma SDK",
5
5
  "type": "module",
6
6
  "exports": {
@@ -16,7 +16,7 @@
16
16
  "access": "public"
17
17
  },
18
18
  "dependencies": {
19
- "@autonoma-ai/sdk": "0.1.0"
19
+ "@autonoma-ai/sdk": "0.1.3"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/node": "^22.0.0",