@okrlinkhub/agent-bridge 2.0.1 → 3.0.1

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
@@ -49,14 +49,12 @@ registerAgentBridgeRoutes(http);
49
49
  export default http;
50
50
  ```
51
51
 
52
- Se vuoi usare il flusso multi-app gestito dal bridge, passa anche la service key:
52
+ Configura auth strict multi-service in `registerRoutes`:
53
53
 
54
54
  ```ts
55
55
  registerRoutes(http, components.agentBridge, bridgeConfig, {
56
56
  pathPrefix: "/agent",
57
- serviceKey:
58
- (globalThis as { process?: { env?: Record<string, string> } }).process?.env
59
- ?.AGENT_BRIDGE_SERVICE_KEY,
57
+ serviceKeysEnvVar: "AGENT_BRIDGE_SERVICE_KEYS_JSON",
60
58
  });
61
59
  ```
62
60
 
@@ -89,13 +87,20 @@ export default defineAgentBridgeConfig({
89
87
 
90
88
  ### `POST /agent/execute`
91
89
 
92
- Header richiesti (una delle due modalita):
90
+ Header richiesti (strict-only):
93
91
 
94
- - Legacy:
95
- - `X-Agent-API-Key: <api-key>`
96
- - Service-to-bridge (consigliato per OpenClaw multi-app):
97
- - `X-Agent-Service-Key: <shared-service-secret>`
98
- - `X-Agent-App: <app-key>` (es. `crm`, `billing`)
92
+ - `X-Agent-Service-Id: <service-id>`
93
+ - `X-Agent-Service-Key: <service-key>`
94
+ - `X-Agent-App: <app-key>` (es. `crm`, `billing`)
95
+
96
+ Header opzionale per contesto utente Convex:
97
+
98
+ - `Authorization: Bearer <user-jwt>`
99
+
100
+ Quando usarlo:
101
+
102
+ - Se la funzione target usa `ctx.auth.getUserIdentity()`, invia sempre `Authorization`.
103
+ - Se la funzione e service-only, `Authorization` puo essere omesso.
99
104
 
100
105
  Body richiesto:
101
106
 
@@ -113,16 +118,68 @@ Risposta:
113
118
 
114
119
  Codici principali: `401`, `403`, `404`, `429`, `500`.
115
120
 
121
+ ## User context cross-app (best practice)
122
+
123
+ Per usare Agent Bridge in app Convex con stack auth diversi, mantieni questo contratto:
124
+
125
+ 1. **Service auth** (sempre): `X-Agent-Service-Id`, `X-Agent-Service-Key`, `X-Agent-App`
126
+ 2. **User auth** (quando serve): `Authorization: Bearer <user-jwt>`
127
+
128
+ Token source comuni:
129
+
130
+ - `nextauth_convex`: leggi `session.convexToken` lato server
131
+ - `auth0`: usa access token Auth0 valido per Convex
132
+ - `custom_oidc`: usa token OIDC del provider dell'app
133
+
134
+ Il package include helper riusabili:
135
+
136
+ ```ts
137
+ import {
138
+ buildAgentBridgeStrictHeaders,
139
+ createAuth0TokenAdapter,
140
+ createCustomOidcTokenAdapter,
141
+ createNextAuthConvexTokenAdapter,
142
+ resolveUserToken,
143
+ validateJwtClaims,
144
+ } from "@okrlinkhub/agent-bridge";
145
+ ```
146
+
147
+ Esempio rapido:
148
+
149
+ ```ts
150
+ const tokenAdapter = createNextAuthConvexTokenAdapter({
151
+ getSession: async () => session,
152
+ });
153
+
154
+ const userToken = await resolveUserToken(tokenAdapter);
155
+ const validation = userToken
156
+ ? validateJwtClaims(userToken, { expectedAudience: "convex" })
157
+ : { valid: false };
158
+
159
+ const headers = buildAgentBridgeStrictHeaders({
160
+ serviceId: process.env.OPENCLAW_SERVICE_ID!,
161
+ serviceKey: process.env.OPENCLAW_SERVICE_KEY!,
162
+ appKey: "crm",
163
+ userToken: validation.valid ? userToken : null,
164
+ });
165
+ ```
166
+
167
+ Note:
168
+
169
+ - `validateJwtClaims` controlla solo claim (`exp`, `iss`, `aud`) e non sostituisce la validazione crittografica di Convex.
170
+ - Non loggare mai token utente o service key.
171
+
116
172
  ## Setup OpenClaw multi-app (semplice su Railway)
117
173
 
118
- Per un solo servizio OpenClaw che gestisce piu applicativi:
174
+ Per piu istanze OpenClaw che gestiscono piu applicativi:
119
175
 
120
- 1. In Railway imposta solo:
121
- - `AGENT_BRIDGE_SERVICE_KEY=<secret-unico>`
176
+ 1. In Convex imposta:
177
+ - `AGENT_BRIDGE_SERVICE_KEYS_JSON={"openclaw-prod":"<key>","openclaw-staging":"<key>"}`
122
178
  2. In Convex registra un agente per app con `appKey` univoco:
123
179
  - `crm`, `billing`, `warehouse`, ecc.
124
180
  3. OpenClaw invia per ogni chiamata:
125
- - `X-Agent-Service-Key` (sempre uguale)
181
+ - `X-Agent-Service-Id` (identita istanza)
182
+ - `X-Agent-Service-Key` (chiave della specifica istanza)
126
183
  - `X-Agent-App` (varia per app target)
127
184
 
128
185
  Puoi generare una service key con l'helper del package:
@@ -170,6 +227,13 @@ await ctx.runMutation(components.agentBridge.permissions.setAgentPermissions, {
170
227
  });
171
228
  ```
172
229
 
230
+ ## Breaking change strict-only
231
+
232
+ Da questa versione:
233
+ - `X-Agent-API-Key` non e piu supportato nel runtime HTTP;
234
+ - non esiste fallback single-key;
235
+ - e obbligatoria la triade `X-Agent-Service-Id` + `X-Agent-Service-Key` + `X-Agent-App`.
236
+
173
237
  ## Migrazione 0.2 -> next major
174
238
 
175
239
  Breaking changes principali:
@@ -181,7 +245,7 @@ Breaking changes principali:
181
245
  Nuovo flusso:
182
246
 
183
247
  1. config funzioni in `agent-bridge.config.ts`;
184
- 2. auth via `X-Agent-API-Key` (legacy) oppure `X-Agent-Service-Key + X-Agent-App` (multi-app);
248
+ 2. auth strict via `X-Agent-Service-Id + X-Agent-Service-Key + X-Agent-App`;
185
249
  3. policy in batch via mutation del componente;
186
250
  4. log centralizzato in `agentLogs`.
187
251
 
package/dist/cli/init.js CHANGED
@@ -52,9 +52,7 @@ export function registerAgentBridgeRoutes(
52
52
  ) {
53
53
  registerRoutes(http, components.agentBridge, config, {
54
54
  pathPrefix: "/agent",
55
- serviceKey:
56
- (globalThis as { process?: { env?: Record<string, string> } }).process?.env
57
- ?.AGENT_BRIDGE_SERVICE_KEY,
55
+ serviceKeysEnvVar: "AGENT_BRIDGE_SERVICE_KEYS_JSON",
58
56
  });
59
57
  }
60
58
  `;
@@ -85,10 +83,10 @@ export default http;
85
83
  - components.agentBridge.permissions.setAgentPermissions
86
84
  - components.agentBridge.permissions.setFunctionOverrides
87
85
 
88
- 4) For multi-app OpenClaw deployments, set one service secret in Railway:
89
- - AGENT_BRIDGE_SERVICE_KEY=<shared-secret>
90
- - OpenClaw sends X-Agent-Service-Key and X-Agent-App headers
91
- - Bridge resolves app -> agent internally (keep legacy X-Agent-API-Key for compatibility)
86
+ 4) Configure strict service auth map (required):
87
+ - AGENT_BRIDGE_SERVICE_KEYS_JSON={"openclaw-prod":"<key>","openclaw-staging":"<key>"}
88
+ - OpenClaw must send X-Agent-Service-Id, X-Agent-Service-Key and X-Agent-App
89
+ - Legacy X-Agent-API-Key is not supported in strict mode
92
90
  `;
93
91
  async function main() {
94
92
  const commandArg = process.argv[2];
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAE1B,KAAK,UAAU,MAAM,CAAC,UAAkB;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,YAAoB,EACpB,OAAe;IAEf,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBtB,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;CAc1B,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BxB,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,UAAU,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,mCAAmC,UAAU,IAAI,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,wBAAwB,EAAE,cAAc,CAAC,CAAC;IACpF,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;IAEvF,OAAO,CAAC,GAAG,CACT,0CAA0C,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAChH,CAAC;IACF,OAAO,CAAC,GAAG,CACT,yCAAyC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAC/G,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAE1B,KAAK,UAAU,MAAM,CAAC,UAAkB;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,YAAoB,EACpB,OAAe;IAEf,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBtB,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;CAY1B,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BxB,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,UAAU,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,mCAAmC,UAAU,IAAI,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,wBAAwB,EAAE,cAAc,CAAC,CAAC;IACpF,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;IAEvF,OAAO,CAAC,GAAG,CACT,0CAA0C,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAChH,CAAC;IACF,OAAO,CAAC,GAAG,CACT,yCAAyC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAC/G,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,IAAI,EAAE,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import type { GenericDataModel, GenericMutationCtx, HttpRouter } from "convex/server";
2
2
  import type { ComponentApi } from "../component/_generated/component.js";
3
+ export { buildAgentBridgeStrictHeaders, createAuth0TokenAdapter, createCustomOidcTokenAdapter, createNextAuthConvexTokenAdapter, decodeJwtClaims, resolveUserToken, validateJwtClaims, } from "./userAuth.js";
4
+ export type { AgentBridgeStrictHeadersInput, JwtClaimValidationOptions, JwtClaimValidationResult, JwtClaims, NextAuthSessionLike, TokenSource, TokenSourceAdapter, } from "./userAuth.js";
3
5
  export type AgentBridgeFunctionType = "query" | "mutation" | "action";
4
6
  type UnknownFunctionReference = unknown;
5
7
  export interface AgentBridgeFunctionDefinition {
@@ -30,8 +32,8 @@ export declare function detectFunctionType(fnRef: UnknownFunctionReference): Age
30
32
  export declare function normalizeAgentBridgeConfig(config: AgentBridgeConfig): NormalizedAgentBridgeConfig;
31
33
  type RegisterRoutesOptions = {
32
34
  pathPrefix?: string;
33
- serviceKey?: string;
34
- serviceKeyEnvVar?: string;
35
+ serviceKeys?: Record<string, string>;
36
+ serviceKeysEnvVar?: string;
35
37
  };
36
38
  export declare function registerRoutes(http: HttpRouter, component: ComponentApi, bridgeConfig: AgentBridgeConfig, options?: RegisterRoutesOptions): void;
37
39
  type PermissionRule = {
@@ -61,5 +63,4 @@ export declare function listConfiguredFunctions(config: AgentBridgeConfig): {
61
63
  type: AgentBridgeFunctionType;
62
64
  metadata: AgentBridgeFunctionMetadata | undefined;
63
65
  }[];
64
- export {};
65
66
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACX,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEzE,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEtE,KAAK,wBAAwB,GAAG,OAAO,CAAC;AAExC,MAAM,WAAW,6BAA6B;IAC5C,GAAG,EAAE,wBAAwB,CAAC;IAC9B,IAAI,CAAC,EAAE,uBAAuB,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CACf,MAAM,EACN,wBAAwB,GAAG,6BAA6B,CACzD,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;CACxD;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,iBAAiB,GACxB,iBAAiB,CAEnB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,MAAmB,GAAG,MAAM,CAEvE;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,GAAE,MAAmB,GAC1B,MAAM,CAER;AAWD,KAAK,4BAA4B,GAAG;IAClC,GAAG,EAAE,wBAAwB,CAAC;IAC9B,IAAI,EAAE,uBAAuB,CAAC;IAC9B,QAAQ,CAAC,EAAE,2BAA2B,CAAC;CACxC,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;CACzD,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,wBAAwB,GAC9B,uBAAuB,GAAG,IAAI,CAiBhC;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,iBAAiB,GACxB,2BAA2B,CAsC7B;AAQD,KAAK,qBAAqB,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,YAAY,EACvB,YAAY,EAAE,iBAAiB,EAC/B,OAAO,CAAC,EAAE,qBAAqB,QAuIhC;AAED,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,cAAc,CAAC;IAC9C,eAAe,CAAC,EAAE;QAChB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH,CAAC;AAEF,KAAK,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,CAAC;AAE7E,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE,iBAAiB,CAAC;CAC3B,mBAQF;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE;IACJ,SAAS,EAAE,KAAK,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,OAAO,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;IACH,MAAM,EAAE,iBAAiB,CAAC;CAC3B,mBAOF;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB;;;;IAShE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { httpActionGeneric } from "convex/server";
2
+ export { buildAgentBridgeStrictHeaders, createAuth0TokenAdapter, createCustomOidcTokenAdapter, createNextAuthConvexTokenAdapter, decodeJwtClaims, resolveUserToken, validateJwtClaims, } from "./userAuth.js";
2
3
  export function defineAgentBridgeConfig(config) {
3
4
  return config;
4
5
  }
@@ -63,15 +64,16 @@ export function normalizeAgentBridgeConfig(config) {
63
64
  }
64
65
  export function registerRoutes(http, component, bridgeConfig, options) {
65
66
  const prefix = options?.pathPrefix ?? "/agent";
66
- const expectedServiceKey = options?.serviceKey ??
67
- readRuntimeEnv(options?.serviceKeyEnvVar ?? "AGENT_BRIDGE_SERVICE_KEY");
67
+ const configuredServiceKeys = resolveConfiguredServiceKeys({
68
+ serviceKeys: options?.serviceKeys,
69
+ serviceKeysEnvVar: options?.serviceKeysEnvVar ?? "AGENT_BRIDGE_SERVICE_KEYS_JSON",
70
+ });
68
71
  const normalizedConfig = normalizeAgentBridgeConfig(bridgeConfig);
69
72
  const availableFunctionKeys = Object.keys(normalizedConfig.functions);
70
73
  http.route({
71
74
  path: `${prefix}/execute`,
72
75
  method: "POST",
73
76
  handler: httpActionGeneric(async (ctx, request) => {
74
- const apiKey = request.headers.get("X-Agent-API-Key");
75
77
  let body;
76
78
  try {
77
79
  body = await request.json();
@@ -87,21 +89,18 @@ export function registerRoutes(http, component, bridgeConfig, options) {
87
89
  if (!functionDef) {
88
90
  return jsonResponse({ success: false, error: `Function "${functionKey}" not found` }, 404);
89
91
  }
90
- const authResult = apiKey
91
- ? await ctx.runMutation(component.gateway.authorizeRequest, {
92
- apiKey,
93
- functionKey,
94
- estimatedCost: body.estimatedCost,
95
- })
96
- : await authorizeWithServiceHeaders({
97
- request,
98
- expectedServiceKey,
99
- authorizeByAppKey: (appKey) => ctx.runMutation(component.gateway.authorizeByAppKey, {
100
- appKey,
101
- functionKey,
102
- estimatedCost: body.estimatedCost,
103
- }),
104
- });
92
+ const headerValidation = validateStrictServiceHeaders({
93
+ request,
94
+ configuredServiceKeys,
95
+ });
96
+ if (!headerValidation.valid) {
97
+ return jsonResponse({ success: false, error: headerValidation.error }, headerValidation.statusCode);
98
+ }
99
+ const authResult = await ctx.runMutation(component.gateway.authorizeByAppKey, {
100
+ appKey: headerValidation.appKey,
101
+ functionKey,
102
+ estimatedCost: body.estimatedCost,
103
+ });
105
104
  if (!authResult.authorized) {
106
105
  const response = jsonResponse({ success: false, error: authResult.error }, authResult.statusCode);
107
106
  if (authResult.statusCode === 429) {
@@ -124,6 +123,7 @@ export function registerRoutes(http, component, bridgeConfig, options) {
124
123
  }
125
124
  await ctx.runMutation(component.gateway.logAccess, {
126
125
  agentId: authResult.agentId,
126
+ serviceId: headerValidation.serviceId,
127
127
  functionKey,
128
128
  args,
129
129
  result,
@@ -138,6 +138,7 @@ export function registerRoutes(http, component, bridgeConfig, options) {
138
138
  : "Unknown error";
139
139
  await ctx.runMutation(component.gateway.logAccess, {
140
140
  agentId: authResult.agentId,
141
+ serviceId: headerValidation.serviceId,
141
142
  functionKey,
142
143
  args: body.args ?? {},
143
144
  error: errorMessage,
@@ -190,38 +191,60 @@ function jsonResponse(data, status) {
190
191
  headers: { "Content-Type": "application/json" },
191
192
  });
192
193
  }
193
- async function authorizeWithServiceHeaders(args) {
194
- const providedServiceKey = args.request.headers.get("X-Agent-Service-Key");
195
- const appKey = args.request.headers.get("X-Agent-App");
194
+ function validateStrictServiceHeaders(args) {
195
+ const serviceId = args.request.headers.get("X-Agent-Service-Id")?.trim();
196
+ const providedServiceKey = args.request.headers
197
+ .get("X-Agent-Service-Key")
198
+ ?.trim();
199
+ const appKey = args.request.headers.get("X-Agent-App")?.trim();
200
+ if (!serviceId) {
201
+ return {
202
+ valid: false,
203
+ error: "Missing required header: X-Agent-Service-Id",
204
+ statusCode: 400,
205
+ };
206
+ }
196
207
  if (!providedServiceKey) {
197
208
  return {
198
- authorized: false,
199
- error: "Missing authentication header: X-Agent-Service-Key",
200
- statusCode: 401,
209
+ valid: false,
210
+ error: "Missing required header: X-Agent-Service-Key",
211
+ statusCode: 400,
201
212
  };
202
213
  }
203
214
  if (!appKey) {
204
215
  return {
205
- authorized: false,
206
- error: "Missing routing header: X-Agent-App",
216
+ valid: false,
217
+ error: "Missing required header: X-Agent-App",
207
218
  statusCode: 400,
208
219
  };
209
220
  }
210
- if (!args.expectedServiceKey) {
221
+ if (!args.configuredServiceKeys.ok) {
211
222
  return {
212
- authorized: false,
213
- error: "Bridge service key is not configured. Set AGENT_BRIDGE_SERVICE_KEY or pass registerRoutes({ serviceKey })",
223
+ valid: false,
224
+ error: args.configuredServiceKeys.error,
214
225
  statusCode: 500,
215
226
  };
216
227
  }
217
- if (providedServiceKey !== args.expectedServiceKey) {
228
+ const expectedServiceKey = args.configuredServiceKeys.keysByServiceId[serviceId];
229
+ if (!expectedServiceKey) {
230
+ return {
231
+ valid: false,
232
+ error: `Unknown service id: ${serviceId}`,
233
+ statusCode: 401,
234
+ };
235
+ }
236
+ if (providedServiceKey !== expectedServiceKey) {
218
237
  return {
219
- authorized: false,
238
+ valid: false,
220
239
  error: "Invalid service key",
221
240
  statusCode: 401,
222
241
  };
223
242
  }
224
- return await args.authorizeByAppKey(appKey);
243
+ return {
244
+ valid: true,
245
+ serviceId,
246
+ appKey,
247
+ };
225
248
  }
226
249
  function readRuntimeEnv(name) {
227
250
  const maybeProcess = globalThis
@@ -233,4 +256,60 @@ function readRuntimeEnv(name) {
233
256
  const trimmed = value.trim();
234
257
  return trimmed.length > 0 ? trimmed : undefined;
235
258
  }
259
+ function resolveConfiguredServiceKeys(args) {
260
+ if (args.serviceKeys) {
261
+ return sanitizeServiceKeysMap(args.serviceKeys);
262
+ }
263
+ const json = readRuntimeEnv(args.serviceKeysEnvVar);
264
+ if (!json) {
265
+ return {
266
+ ok: false,
267
+ error: `Bridge service keys are not configured. Provide registerRoutes({ serviceKeys }) or set ${args.serviceKeysEnvVar}`,
268
+ };
269
+ }
270
+ let parsed;
271
+ try {
272
+ parsed = JSON.parse(json);
273
+ }
274
+ catch {
275
+ return {
276
+ ok: false,
277
+ error: `Invalid JSON in ${args.serviceKeysEnvVar}`,
278
+ };
279
+ }
280
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
281
+ return {
282
+ ok: false,
283
+ error: `${args.serviceKeysEnvVar} must be a JSON object mapping serviceId to serviceKey`,
284
+ };
285
+ }
286
+ return sanitizeServiceKeysMap(parsed);
287
+ }
288
+ function sanitizeServiceKeysMap(input) {
289
+ const keysByServiceId = {};
290
+ for (const [serviceIdRaw, serviceKeyRaw] of Object.entries(input)) {
291
+ if (typeof serviceKeyRaw !== "string") {
292
+ return {
293
+ ok: false,
294
+ error: `Invalid service key value for "${serviceIdRaw}"`,
295
+ };
296
+ }
297
+ const serviceId = serviceIdRaw.trim();
298
+ const serviceKey = serviceKeyRaw.trim();
299
+ if (!serviceId || !serviceKey) {
300
+ return {
301
+ ok: false,
302
+ error: "Service ids and service keys cannot be empty",
303
+ };
304
+ }
305
+ keysByServiceId[serviceId] = serviceKey;
306
+ }
307
+ if (Object.keys(keysByServiceId).length === 0) {
308
+ return {
309
+ ok: false,
310
+ error: "At least one service key must be configured",
311
+ };
312
+ }
313
+ return { ok: true, keysByServiceId };
314
+ }
236
315
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export type TokenSource = "nextauth_convex" | "auth0" | "custom_oidc";
2
+ export type JwtAudience = string | Array<string>;
3
+ export interface JwtClaims {
4
+ sub?: string;
5
+ iss?: string;
6
+ aud?: JwtAudience;
7
+ exp?: number;
8
+ [key: string]: unknown;
9
+ }
10
+ export interface JwtClaimValidationOptions {
11
+ expectedIssuer?: string;
12
+ expectedAudience?: string;
13
+ nowMs?: number;
14
+ }
15
+ export interface JwtClaimValidationResult {
16
+ valid: boolean;
17
+ reason?: "malformed_token" | "expired" | "issuer_mismatch" | "audience_mismatch";
18
+ claims: JwtClaims | null;
19
+ }
20
+ export interface AgentBridgeStrictHeadersInput {
21
+ serviceId: string;
22
+ serviceKey: string;
23
+ appKey: string;
24
+ userToken?: string | null;
25
+ }
26
+ export interface NextAuthSessionLike {
27
+ convexToken?: string | null;
28
+ }
29
+ export type UserTokenResolver = () => Promise<string | null>;
30
+ export interface TokenSourceAdapter {
31
+ tokenSource: TokenSource;
32
+ resolveUserToken: UserTokenResolver;
33
+ }
34
+ export declare function buildAgentBridgeStrictHeaders(input: AgentBridgeStrictHeadersInput): Record<string, string>;
35
+ export declare function decodeJwtClaims(token: string): JwtClaims | null;
36
+ export declare function validateJwtClaims(token: string, options?: JwtClaimValidationOptions): JwtClaimValidationResult;
37
+ export declare function createNextAuthConvexTokenAdapter(args: {
38
+ getSession: () => Promise<NextAuthSessionLike | null | undefined>;
39
+ }): TokenSourceAdapter;
40
+ export declare function createAuth0TokenAdapter(args: {
41
+ getAccessToken: () => Promise<string | null | undefined>;
42
+ }): TokenSourceAdapter;
43
+ export declare function createCustomOidcTokenAdapter(args: {
44
+ getToken: () => Promise<string | null | undefined>;
45
+ }): TokenSourceAdapter;
46
+ export declare function resolveUserToken(adapter: TokenSourceAdapter): Promise<string | null>;
47
+ //# sourceMappingURL=userAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userAuth.d.ts","sourceRoot":"","sources":["../../src/client/userAuth.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,OAAO,GAAG,aAAa,CAAC;AAEtE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;IACjF,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,iBAAiB,CAAC;CACrC;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,6BAA6B,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAa/D;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,yBAAyB,GAClC,wBAAwB,CAiD1B;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACrD,UAAU,EAAE,MAAM,OAAO,CAAC,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACnE,GAAG,kBAAkB,CAYrB;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CAC1D,GAAG,kBAAkB,CAWrB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACpD,GAAG,kBAAkB,CAWrB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExB"}
@@ -0,0 +1,122 @@
1
+ export function buildAgentBridgeStrictHeaders(input) {
2
+ const headers = {
3
+ "Content-Type": "application/json",
4
+ "X-Agent-Service-Id": input.serviceId,
5
+ "X-Agent-Service-Key": input.serviceKey,
6
+ "X-Agent-App": input.appKey,
7
+ };
8
+ if (input.userToken) {
9
+ headers.Authorization = `Bearer ${input.userToken}`;
10
+ }
11
+ return headers;
12
+ }
13
+ export function decodeJwtClaims(token) {
14
+ const parts = token.split(".");
15
+ if (parts.length !== 3 || !parts[1]) {
16
+ return null;
17
+ }
18
+ try {
19
+ const payload = decodeBase64Url(parts[1]);
20
+ const claims = JSON.parse(payload);
21
+ return claims;
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ export function validateJwtClaims(token, options) {
28
+ const claims = decodeJwtClaims(token);
29
+ if (!claims) {
30
+ return {
31
+ valid: false,
32
+ reason: "malformed_token",
33
+ claims: null,
34
+ };
35
+ }
36
+ const nowMs = options?.nowMs ?? Date.now();
37
+ if (typeof claims.exp === "number") {
38
+ const expiresAtMs = claims.exp * 1000;
39
+ if (expiresAtMs <= nowMs) {
40
+ return {
41
+ valid: false,
42
+ reason: "expired",
43
+ claims,
44
+ };
45
+ }
46
+ }
47
+ if (options?.expectedIssuer && claims.iss !== options.expectedIssuer) {
48
+ return {
49
+ valid: false,
50
+ reason: "issuer_mismatch",
51
+ claims,
52
+ };
53
+ }
54
+ if (options?.expectedAudience) {
55
+ const audience = claims.aud;
56
+ const hasAudienceMatch = Array.isArray(audience)
57
+ ? audience.includes(options.expectedAudience)
58
+ : audience === options.expectedAudience;
59
+ if (!hasAudienceMatch) {
60
+ return {
61
+ valid: false,
62
+ reason: "audience_mismatch",
63
+ claims,
64
+ };
65
+ }
66
+ }
67
+ return {
68
+ valid: true,
69
+ claims,
70
+ };
71
+ }
72
+ export function createNextAuthConvexTokenAdapter(args) {
73
+ return {
74
+ tokenSource: "nextauth_convex",
75
+ resolveUserToken: async () => {
76
+ const session = await args.getSession();
77
+ const token = session?.convexToken;
78
+ if (typeof token !== "string" || token.trim().length === 0) {
79
+ return null;
80
+ }
81
+ return token;
82
+ },
83
+ };
84
+ }
85
+ export function createAuth0TokenAdapter(args) {
86
+ return {
87
+ tokenSource: "auth0",
88
+ resolveUserToken: async () => {
89
+ const token = await args.getAccessToken();
90
+ if (typeof token !== "string" || token.trim().length === 0) {
91
+ return null;
92
+ }
93
+ return token;
94
+ },
95
+ };
96
+ }
97
+ export function createCustomOidcTokenAdapter(args) {
98
+ return {
99
+ tokenSource: "custom_oidc",
100
+ resolveUserToken: async () => {
101
+ const token = await args.getToken();
102
+ if (typeof token !== "string" || token.trim().length === 0) {
103
+ return null;
104
+ }
105
+ return token;
106
+ },
107
+ };
108
+ }
109
+ export async function resolveUserToken(adapter) {
110
+ return await adapter.resolveUserToken();
111
+ }
112
+ function decodeBase64Url(value) {
113
+ const normalized = value.replace(/-/g, "+").replace(/_/g, "/");
114
+ const paddingLength = (4 - (normalized.length % 4)) % 4;
115
+ const padded = normalized + "=".repeat(paddingLength);
116
+ if (typeof atob === "function") {
117
+ return atob(padded);
118
+ }
119
+ const buffer = Buffer.from(padded, "base64");
120
+ return buffer.toString("utf-8");
121
+ }
122
+ //# sourceMappingURL=userAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userAuth.js","sourceRoot":"","sources":["../../src/client/userAuth.ts"],"names":[],"mappings":"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"}