@gnomondigital/nebulas-kit-core 0.4.1 → 0.5.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.
Files changed (54) hide show
  1. package/README.md +22 -20
  2. package/dist/index.d.ts +2 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -4
  5. package/dist/nextjs-api.d.ts +5 -0
  6. package/dist/nextjs-api.d.ts.map +1 -0
  7. package/dist/nextjs-api.js +4 -0
  8. package/dist/server/auth-handler.d.ts +1 -16
  9. package/dist/server/auth-handler.d.ts.map +1 -1
  10. package/dist/server/auth-handler.js +1 -35
  11. package/dist/server/auth-strategies.d.ts +2 -9
  12. package/dist/server/auth-strategies.d.ts.map +1 -1
  13. package/dist/server/auth-strategies.js +37 -61
  14. package/dist/server/auth0/auth-handler.d.ts +17 -0
  15. package/dist/server/auth0/auth-handler.d.ts.map +1 -0
  16. package/dist/server/auth0/auth-handler.js +37 -0
  17. package/dist/server/auth0/auth-strategies.d.ts +16 -0
  18. package/dist/server/auth0/auth-strategies.d.ts.map +1 -0
  19. package/dist/server/auth0/auth-strategies.js +83 -0
  20. package/dist/server/auth0/client-credentials.d.ts +5 -0
  21. package/dist/server/auth0/client-credentials.d.ts.map +1 -0
  22. package/dist/server/auth0/client-credentials.js +39 -0
  23. package/dist/server/auth0/env-service-token.d.ts +5 -0
  24. package/dist/server/auth0/env-service-token.d.ts.map +1 -0
  25. package/dist/server/auth0/env-service-token.js +11 -0
  26. package/dist/server/config-handler.d.ts.map +1 -1
  27. package/dist/server/config-handler.js +4 -4
  28. package/dist/server/entra/env-service-token.d.ts +5 -0
  29. package/dist/server/entra/env-service-token.d.ts.map +1 -0
  30. package/dist/server/entra/env-service-token.js +104 -0
  31. package/dist/server/entra/session-token.d.ts +5 -0
  32. package/dist/server/entra/session-token.d.ts.map +1 -0
  33. package/dist/server/entra/session-token.js +104 -0
  34. package/dist/server/env-rop-token.d.ts +9 -3
  35. package/dist/server/env-rop-token.d.ts.map +1 -1
  36. package/dist/server/env-rop-token.js +131 -4
  37. package/dist/server/env-service-token.d.ts +12 -0
  38. package/dist/server/env-service-token.d.ts.map +1 -0
  39. package/dist/server/env-service-token.js +51 -0
  40. package/dist/server/express.d.ts +0 -7
  41. package/dist/server/express.d.ts.map +1 -1
  42. package/dist/server/express.js +30 -60
  43. package/dist/server/nebulas-proxy-handler.d.ts.map +1 -1
  44. package/dist/server/nebulas-proxy-handler.js +13 -12
  45. package/dist/server/nextjs.d.ts +17 -21
  46. package/dist/server/nextjs.d.ts.map +1 -1
  47. package/dist/server/nextjs.js +108 -176
  48. package/dist/server/proxy-handler.d.ts +3 -0
  49. package/dist/server/proxy-handler.d.ts.map +1 -1
  50. package/dist/server/proxy-handler.js +6 -5
  51. package/dist/server/runtime-config.d.ts +45 -0
  52. package/dist/server/runtime-config.d.ts.map +1 -0
  53. package/dist/server/runtime-config.js +20 -0
  54. package/package.json +5 -1
package/README.md CHANGED
@@ -12,7 +12,8 @@ npm install @gnomondigital/nebulas-kit-core
12
12
 
13
13
  | Import path | Use |
14
14
  |-------------|-----|
15
- | `@gnomondigital/nebulas-kit-core` | Full API (Next.js, Express, proxy handlers). |
15
+ | `@gnomondigital/nebulas-kit-core` | Framework-agnostic API (clients, shared handlers/types). |
16
+ | `@gnomondigital/nebulas-kit-core/nextjs` | Next.js route handlers and helpers (`next/server` based). |
16
17
  | `@gnomondigital/nebulas-kit-core/client` | Browser-only: `sendMessageStream`, Nebulas client, types. **Use from React/Vite** so `next/server` is never bundled. |
17
18
  | `@gnomondigital/nebulas-kit-core/express` | Express router only; no Next.js. |
18
19
 
@@ -23,14 +24,24 @@ npm install @gnomondigital/nebulas-kit-core
23
24
  | Variable | Required | Description |
24
25
  |----------|----------|-------------|
25
26
  | `A2A_URL` | Yes | A2A agent base URL |
26
- | `A2A_AUTH_STRATEGY` | Yes | `session` \| `client_credentials` \| `resource_owner_password` \| `api_key_only` |
27
- | `A2A_API_KEY` | For api_key_only, or fallback | x-api-key header |
27
+ | `A2A_AUTH_STRATEGY` | Yes | `session` \| `client_credentials` \| `resource_owner_password` |
28
+ | `A2A_API_KEY` | Optional fallback | x-api-key header |
28
29
  | `AUTH0_DOMAIN` | For Auth0 strategies | Auth0 tenant domain |
29
30
  | `AUTH0_CLIENT_ID` | For client_credentials, ROP | Auth0 client ID |
30
31
  | `AUTH0_CLIENT_SECRET` | For client_credentials, ROP | Auth0 client secret |
31
32
  | `AUTH0_A2A_AUDIENCE` | For Auth0 strategies | API audience |
32
33
  | `AUTH0_ROP_USERNAME` | For env ROP (`createA2AProxyHandlerFromEnvROP`) | Service user username (server secret) |
33
34
  | `AUTH0_ROP_PASSWORD` | For env ROP | Service user password (server secret) |
35
+ | `AUTH_PROVIDER` | For env service auth | `auth0` \| `entra` |
36
+ | `ENTRA_TENANT_ID` | For Entra service auth | Entra tenant ID |
37
+ | `ENTRA_CLIENT_ID` | For Entra service auth | Entra app/client ID |
38
+ | `ENTRA_CLIENT_SECRET` | Optional for Entra service auth | Secret (if not using certificate) |
39
+ | `ENTRA_CLIENT_CERTIFICATE` / `_PATH` | Optional for Entra service auth | PEM certificate (inline or file path) |
40
+ | `ENTRA_CLIENT_PRIVATE_KEY` / `_PATH` | Optional for Entra service auth | PEM private key (inline or file path) |
41
+ | `ENTRA_A2A_SCOPE` | For Entra service auth | Scope for app/service token request (often `api://<app-id>/.default`) |
42
+ | `ENTRA_OBO_SCOPE` | For Entra OBO/session auth | Delegated downstream API scope for OBO (for example `api://<app-id>/user_impersonation`) |
43
+ | `ENTRA_OBO_CLIENT_ID` | For Entra OBO/session auth | client requesting OBO(upstream API) |
44
+ | `ENTRA_OBO_CLIENT_SECRET` | For Entra OBO/session auth | |
34
45
  | `NEBULAS_API_URL` | For Nebulas | Conversation API base URL |
35
46
  | `NEBULAS_API_KEY` | For Nebulas proxy | x-api-key fallback when no session token |
36
47
  | `NEBULAS_PROJECT_ID` | For Nebulas | Project ID |
@@ -39,8 +50,8 @@ npm install @gnomondigital/nebulas-kit-core
39
50
 
40
51
  | Mode | When to use | Exports |
41
52
  |------|-------------|---------|
42
- | **Auth0 session** | User signs in with `@auth0/nextjs-auth0`; access token for `AUTH0_A2A_AUDIENCE` comes from the session. | `createA2AProxyHandler`, `createGetHeadersForAuth0`, `handleA2AAuthNextJsPOST` (body ROP, optional) |
43
- | **Env ROP** | No browser Auth0; a fixed **service user** in env performs Resource Owner Password; token is cached per process. | `createA2AProxyHandlerFromEnvROP`, `createGetHeadersFromEnvROP`, `getCachedAccessTokenFromEnvROP` |
53
+ | **Auth0 session** | User signs in with `@auth0/nextjs-auth0`; access token for `AUTH0_A2A_AUDIENCE` comes from the session. | `createA2AProxyHandler`, `createGetHeadersForSession` |
54
+ | **Env service auth** | No browser session; uses Auth0 ROP service user (`AUTH_PROVIDER=auth0`) or Entra client credentials (`AUTH_PROVIDER=entra`, secret or certificate). Token is cached per process. | `createA2AProxyHandlerFromEnvService`, `createGetHeadersFromEnvService`, `getCachedAccessTokenFromEnvService` |
44
55
 
45
56
  Env ROP example:
46
57
 
@@ -58,10 +69,10 @@ export const POST = createA2AProxyHandlerFromEnvROP({
58
69
  import type { NextRequest } from "next/server";
59
70
  import {
60
71
  handleA2AConfigNextJsGET,
61
- createGetHeadersFromEnvROP,
62
- } from "@gnomondigital/nebulas-kit-core";
72
+ createGetHeadersFromEnvService,
73
+ } from "@gnomondigital/nebulas-kit-core/nextjs";
63
74
 
64
- const getHeaders = createGetHeadersFromEnvROP({
75
+ const getHeaders = createGetHeadersFromEnvService({
65
76
  apiKey: process.env.A2A_API_KEY,
66
77
  });
67
78
 
@@ -94,25 +105,16 @@ const content = await sendMessageStream(
94
105
 
95
106
  ```ts
96
107
  // app/api/a2a/route.ts
97
- import { handleA2ANextJsPOST } from "@nebulas-kit/core";
108
+ import { handleA2ANextJsPOST } from "@gnomondigital/nebulas-kit-core/nextjs";
98
109
 
99
110
  export async function POST(req: NextRequest) {
100
111
  return handleA2ANextJsPOST(req);
101
112
  }
102
113
  ```
103
114
 
104
- ```ts
105
- // app/api/a2a/auth/route.ts
106
- import { handleA2AAuthNextJsPOST } from "@gnomondigital/nebulas-kit-core";
107
-
108
- export async function POST(req: NextRequest) {
109
- return handleA2AAuthNextJsPOST(req);
110
- }
111
- ```
112
-
113
115
  ```ts
114
116
  // app/api/a2a/config/route.ts
115
- import { handleA2AConfigNextJsGET } from "@gnomondigital/nebulas-kit-core";
117
+ import { handleA2AConfigNextJsGET } from "@gnomondigital/nebulas-kit-core/nextjs";
116
118
 
117
119
  export async function GET() {
118
120
  return handleA2AConfigNextJsGET();
@@ -121,7 +123,7 @@ export async function GET() {
121
123
 
122
124
  ```ts
123
125
  // app/api/nebulas/[...path]/route.ts - proxies to Nebulas API (conversations, chat_messages)
124
- import { createNebulasProxyHandler } from "@gnomondigital/nebulas-kit-core";
126
+ import { createNebulasProxyHandler } from "@gnomondigital/nebulas-kit-core/nextjs";
125
127
  import { auth0 } from "@/lib/auth";
126
128
 
127
129
  const handler = createNebulasProxyHandler({
package/dist/index.d.ts CHANGED
@@ -8,10 +8,9 @@ export { transformUtcDatesToLocal, } from "./utils/date-timezone.js";
8
8
  export type { ChatMessage, ChatMessagePayload, SendMessageStreamOptions } from "./types.js";
9
9
  export { handleA2AProxy, type ProxyRequest, type ProxyResponse, type ProxyHandlerOptions, } from "./server/proxy-handler.js";
10
10
  export { getAuthStrategy, getAuthHeaders, type AuthStrategy, } from "./server/auth-strategies.js";
11
- export { exchangePasswordForToken, type ROPAuthRequest, type ROPAuthResponse, } from "./server/auth-handler.js";
12
11
  export { createConfigResponse, type ConfigResponse, type AgentCard, type AgentCardCapabilities, } from "./server/config-handler.js";
13
12
  export { createA2AExpressRouter, type A2AExpressRouterOptions, } from "./server/express.js";
14
- export { handleA2ANextJsPOST, handleA2AAuthNextJsPOST, handleA2AConfigNextJsGET, createGetHeadersForAuth0, createGetHeadersFromEnvROP, createA2AProxyHandler, createA2AProxyHandlerFromEnvROP, createNebulasProxyHandler, type HandleA2AConfigOptions, type Auth0ClientInterface, type CreateA2AProxyHandlerOptions, type CreateA2AProxyHandlerFromEnvROPOptions, type CreateGetHeadersFromEnvROPOptions, type CreateNebulasProxyHandlerOptions, } from "./server/nextjs.js";
15
- export { getCachedAccessTokenFromEnvROP } from "./server/env-rop-token.js";
13
+ export { configureNebulasServer, getNebulasServerConfig, type NebulasServerRuntimeConfig, } from "./server/runtime-config.js";
14
+ export { getCachedAccessTokenFromEnvService, } from "./server/env-service-token.js";
16
15
  export { handleNebulasProxy, isRefreshTokenInvalid, type NebulasProxyRequest, type NebulasProxyResponse, type NebulasProxyHandlerOptions, } from "./server/nebulas-proxy-handler.js";
17
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE5F,OAAO,EACL,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,eAAe,EACf,cAAc,EACd,KAAK,YAAY,GAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,wBAAwB,EACxB,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,qBAAqB,GAC3B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,sBAAsB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,EACrB,+BAA+B,EAC/B,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,sCAAsC,EAC3C,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,GACtC,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAE3E,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,GAChC,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE5F,OAAO,EACL,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,eAAe,EACf,cAAc,EACd,KAAK,YAAY,GAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,qBAAqB,GAC3B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,sBAAsB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,0BAA0B,GAChC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,kCAAkC,GACnC,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,GAChC,MAAM,mCAAmC,CAAC"}
package/dist/index.js CHANGED
@@ -7,10 +7,8 @@ export { createNebulasClient, nebulasClient, } from "./nebulas-client.js";
7
7
  export { transformUtcDatesToLocal, } from "./utils/date-timezone.js";
8
8
  export { handleA2AProxy, } from "./server/proxy-handler.js";
9
9
  export { getAuthStrategy, getAuthHeaders, } from "./server/auth-strategies.js";
10
- export { exchangePasswordForToken, } from "./server/auth-handler.js";
11
10
  export { createConfigResponse, } from "./server/config-handler.js";
12
11
  export { createA2AExpressRouter, } from "./server/express.js";
13
- // Express-only apps: import from "@gnomondigital/nebulas-kit-core/express" to avoid loading Next.js.
14
- export { handleA2ANextJsPOST, handleA2AAuthNextJsPOST, handleA2AConfigNextJsGET, createGetHeadersForAuth0, createGetHeadersFromEnvROP, createA2AProxyHandler, createA2AProxyHandlerFromEnvROP, createNebulasProxyHandler, } from "./server/nextjs.js";
15
- export { getCachedAccessTokenFromEnvROP } from "./server/env-rop-token.js";
12
+ export { configureNebulasServer, getNebulasServerConfig, } from "./server/runtime-config.js";
13
+ export { getCachedAccessTokenFromEnvService, } from "./server/env-service-token.js";
16
14
  export { handleNebulasProxy, isRefreshTokenInvalid, } from "./server/nebulas-proxy-handler.js";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Next.js-only entry: avoids coupling the main package barrel to `next/server`.
3
+ */
4
+ export { handleA2ANextJsPOST, handleA2AConfigNextJsGET, createGetHeadersForSession, createGetHeadersROP as createGetHeadersFromEnvService, createA2AProxyHandler, createA2AProxyHandlerFromEnvService, createNebulasProxyHandler, type HandleA2AConfigOptions, type SessionAuthClientInterface, type CreateA2AProxyHandlerOptions, type CreateA2AProxyHandlerFromEnvServiceOptions, type CreateGetHeadersROPOptions as CreateGetHeadersFromEnvServiceOptions, type CreateNebulasProxyHandlerOptions, } from "./server/nextjs.js";
5
+ //# sourceMappingURL=nextjs-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-api.d.ts","sourceRoot":"","sources":["../src/nextjs-api.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,IAAI,8BAA8B,EACrD,qBAAqB,EACrB,mCAAmC,EACnC,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,0CAA0C,EAC/C,KAAK,0BAA0B,IAAI,qCAAqC,EACxE,KAAK,gCAAgC,GACtC,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Next.js-only entry: avoids coupling the main package barrel to `next/server`.
3
+ */
4
+ export { handleA2ANextJsPOST, handleA2AConfigNextJsGET, createGetHeadersForSession, createGetHeadersROP as createGetHeadersFromEnvService, createA2AProxyHandler, createA2AProxyHandlerFromEnvService, createNebulasProxyHandler, } from "./server/nextjs.js";
@@ -1,17 +1,2 @@
1
- /**
2
- * Auth handler for Resource Owner Password flow.
3
- * Exchanges username/password for Auth0 token.
4
- */
5
- export interface ROPAuthRequest {
6
- username: string;
7
- password: string;
8
- }
9
- export interface ROPAuthResponse {
10
- access_token: string;
11
- expires_in?: number;
12
- }
13
- /**
14
- * Exchange username/password for Auth0 access token.
15
- */
16
- export declare function exchangePasswordForToken(username: string, password: string): Promise<ROPAuthResponse>;
1
+ export { exchangePasswordForToken, type ROPAuthRequest, type ROPAuthResponse, } from "./auth0/auth-handler.js";
17
2
  //# sourceMappingURL=auth-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-handler.d.ts","sourceRoot":"","sources":["../../src/server/auth-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CA+B1B"}
1
+ {"version":3,"file":"auth-handler.d.ts","sourceRoot":"","sources":["../../src/server/auth-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAC"}
@@ -1,35 +1 @@
1
- /**
2
- * Auth handler for Resource Owner Password flow.
3
- * Exchanges username/password for Auth0 token.
4
- */
5
- /**
6
- * Exchange username/password for Auth0 access token.
7
- */
8
- export async function exchangePasswordForToken(username, password) {
9
- const domain = process.env.AUTH0_DOMAIN;
10
- const clientId = process.env.AUTH0_CLIENT_ID;
11
- const clientSecret = process.env.AUTH0_CLIENT_SECRET;
12
- const audience = process.env.AUTH0_A2A_AUDIENCE;
13
- if (!domain || !clientId || !clientSecret) {
14
- throw new Error("AUTH0_DOMAIN, AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET required for ROP");
15
- }
16
- const body = new URLSearchParams({
17
- grant_type: "password",
18
- username,
19
- password,
20
- client_id: clientId,
21
- client_secret: clientSecret,
22
- ...(audience && { audience }),
23
- });
24
- const res = await fetch(`https://${domain}/oauth/token`, {
25
- method: "POST",
26
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
27
- body: body.toString(),
28
- });
29
- if (!res.ok) {
30
- const body = await res.json().catch(() => ({}));
31
- throw new Error(body.error_description || body.error || `Auth failed: ${res.status}`);
32
- }
33
- const data = (await res.json());
34
- return data;
35
- }
1
+ export { exchangePasswordForToken, } from "./auth0/auth-handler.js";
@@ -1,16 +1,9 @@
1
- /**
2
- * Auth strategies for A2A proxy.
3
- * Framework-agnostic; returns headers to add to the A2A request.
4
- */
5
- export type AuthStrategy = "session" | "client_credentials" | "resource_owner_password" | "api_key_only";
6
- /**
7
- * Get headers for A2A request based on strategy.
8
- * For session/bearer, the caller must pass the token (from session or Authorization header).
9
- */
1
+ export type AuthStrategy = "session" | "client_credentials" | "resource_owner_password";
10
2
  export declare function getAuthHeaders(options: {
11
3
  strategy: AuthStrategy;
12
4
  bearerToken?: string;
13
5
  getSessionToken?: () => Promise<string | undefined>;
6
+ apiKey?: string;
14
7
  }): Promise<Record<string, string>>;
15
8
  export declare function getAuthStrategy(): AuthStrategy;
16
9
  //# sourceMappingURL=auth-strategies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-strategies.d.ts","sourceRoot":"","sources":["../../src/server/auth-strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,oBAAoB,GACpB,yBAAyB,GACzB,cAAc,CAAC;AA8CnB;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACrD,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2BlC;AAED,wBAAgB,eAAe,IAAI,YAAY,CAW9C"}
1
+ {"version":3,"file":"auth-strategies.d.ts","sourceRoot":"","sources":["../../src/server/auth-strategies.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,oBAAoB,GACpB,yBAAyB,CAAC;AAO9B,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA4ClC;AAED,wBAAgB,eAAe,IAAI,YAAY,CAU9C"}
@@ -1,83 +1,59 @@
1
- /**
2
- * Auth strategies for A2A proxy.
3
- * Framework-agnostic; returns headers to add to the A2A request.
4
- */
5
- let m2mTokenCache = null;
6
- /**
7
- * Get Auth0 token via client credentials (M2M).
8
- */
9
- async function getClientCredentialsToken() {
10
- const domain = process.env.AUTH0_DOMAIN;
11
- const clientId = process.env.AUTH0_CLIENT_ID;
12
- const clientSecret = process.env.AUTH0_CLIENT_SECRET;
13
- const audience = process.env.AUTH0_A2A_AUDIENCE;
14
- if (!domain || !clientId || !clientSecret || !audience) {
15
- return undefined;
16
- }
17
- if (m2mTokenCache && m2mTokenCache.expiresAt > Date.now() + 60000) {
18
- return m2mTokenCache.token;
19
- }
20
- const res = await fetch(`https://${domain}/oauth/token`, {
21
- method: "POST",
22
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
23
- body: new URLSearchParams({
24
- grant_type: "client_credentials",
25
- client_id: clientId,
26
- client_secret: clientSecret,
27
- audience,
28
- }),
29
- });
30
- if (!res.ok) {
31
- const body = await res.json().catch(() => ({}));
32
- throw new Error(body.error_description || body.error || `Auth0 token failed: ${res.status}`);
33
- }
34
- const data = (await res.json());
35
- const expiresIn = (data.expires_in ?? 86400) * 1000;
36
- m2mTokenCache = {
37
- token: data.access_token,
38
- expiresAt: Date.now() + expiresIn,
39
- };
40
- return data.access_token;
1
+ import { exchangeEntraOnBehalfOfToken } from "./entra/session-token.js";
2
+ import { getAuth0ClientCredentialsToken } from "./auth0/client-credentials.js";
3
+ import { getCachedAccessTokenFromEnvService } from "./env-service-token.js";
4
+ import { getNebulasServerConfig } from "./runtime-config.js";
5
+ function getAuthProvider() {
6
+ const provider = getNebulasServerConfig().authProvider;
7
+ return provider === "entra" ? "entra" : "auth0";
41
8
  }
42
- /**
43
- * Get headers for A2A request based on strategy.
44
- * For session/bearer, the caller must pass the token (from session or Authorization header).
45
- */
46
9
  export async function getAuthHeaders(options) {
47
10
  const headers = {};
48
- const apiKey = process.env.A2A_API_KEY;
11
+ const apiKey = options.apiKey ?? getNebulasServerConfig().a2aApiKey;
12
+ if (apiKey)
13
+ headers["x-api-key"] = apiKey;
14
+ const provider = getAuthProvider();
49
15
  switch (options.strategy) {
50
- case "api_key_only":
51
- if (apiKey)
52
- headers["x-api-key"] = apiKey;
53
- break;
54
16
  case "client_credentials": {
55
- const token = await getClientCredentialsToken();
17
+ const token = provider === "entra"
18
+ ? await getCachedAccessTokenFromEnvService()
19
+ : await getAuth0ClientCredentialsToken();
56
20
  if (token)
57
21
  headers["Authorization"] = `Bearer ${token}`;
58
- if (apiKey)
59
- headers["x-api-key"] = apiKey;
60
22
  break;
61
23
  }
62
- case "resource_owner_password":
63
24
  case "session": {
64
- const token = options.bearerToken ?? (options.getSessionToken ? await options.getSessionToken() : undefined);
65
- if (token)
25
+ const token = options.bearerToken ??
26
+ (options.getSessionToken ? await options.getSessionToken() : undefined);
27
+ if (token) {
28
+ if (provider === "entra" && options.strategy === "session") {
29
+ const obo = await exchangeEntraOnBehalfOfToken(token);
30
+ headers["Authorization"] = `Bearer ${obo.access_token}`;
31
+ }
32
+ else {
33
+ headers["Authorization"] = `Bearer ${token}`;
34
+ }
35
+ }
36
+ break;
37
+ }
38
+ case "resource_owner_password": {
39
+ if (provider === "entra") {
40
+ throw new Error("A2A_AUTH_STRATEGY=resource_owner_password is Auth0-only.");
41
+ }
42
+ const token = await getCachedAccessTokenFromEnvService();
43
+ if (token) {
66
44
  headers["Authorization"] = `Bearer ${token}`;
67
- if (apiKey)
68
- headers["x-api-key"] = apiKey;
45
+ }
69
46
  break;
70
47
  }
71
48
  }
72
49
  return headers;
73
50
  }
74
51
  export function getAuthStrategy() {
75
- const s = process.env.A2A_AUTH_STRATEGY?.toLowerCase();
52
+ const s = getNebulasServerConfig().a2aAuthStrategy;
76
53
  if (s === "session" ||
77
54
  s === "client_credentials" ||
78
- s === "resource_owner_password" ||
79
- s === "api_key_only") {
55
+ s === "resource_owner_password") {
80
56
  return s;
81
57
  }
82
- return "api_key_only";
58
+ return "session";
83
59
  }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Auth0 handler for Resource Owner Password flow.
3
+ * Exchanges username/password for Auth0 token.
4
+ */
5
+ export interface ROPAuthRequest {
6
+ username: string;
7
+ password: string;
8
+ }
9
+ export interface ROPAuthResponse {
10
+ access_token: string;
11
+ expires_in?: number;
12
+ }
13
+ /**
14
+ * Exchange username/password for Auth0 access token.
15
+ */
16
+ export declare function exchangePasswordForToken(username: string, password: string): Promise<ROPAuthResponse>;
17
+ //# sourceMappingURL=auth-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-handler.d.ts","sourceRoot":"","sources":["../../../src/server/auth0/auth-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAgC1B"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Auth0 handler for Resource Owner Password flow.
3
+ * Exchanges username/password for Auth0 token.
4
+ */
5
+ import { getNebulasServerConfig } from "../runtime-config.js";
6
+ /**
7
+ * Exchange username/password for Auth0 access token.
8
+ */
9
+ export async function exchangePasswordForToken(username, password) {
10
+ const config = getNebulasServerConfig().auth0;
11
+ const domain = config?.domain;
12
+ const clientId = config?.clientId;
13
+ const clientSecret = config?.clientSecret;
14
+ const audience = config?.audience;
15
+ if (!domain || !clientId || !clientSecret) {
16
+ throw new Error("AUTH0_DOMAIN, AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET required for ROP");
17
+ }
18
+ const body = new URLSearchParams({
19
+ grant_type: "password",
20
+ username,
21
+ password,
22
+ client_id: clientId,
23
+ client_secret: clientSecret,
24
+ ...(audience && { audience }),
25
+ });
26
+ const res = await fetch(`https://${domain}/oauth/token`, {
27
+ method: "POST",
28
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
29
+ body: body.toString(),
30
+ });
31
+ if (!res.ok) {
32
+ const payload = await res.json().catch(() => ({}));
33
+ throw new Error(payload.error_description || payload.error || `Auth failed: ${res.status}`);
34
+ }
35
+ const data = (await res.json());
36
+ return data;
37
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Auth strategies for A2A proxy.
3
+ * Framework-agnostic; returns headers to add to the A2A request.
4
+ */
5
+ export type AuthStrategy = "session" | "client_credentials" | "resource_owner_password" | "api_key_only";
6
+ /**
7
+ * Get headers for A2A request based on strategy.
8
+ * For session/bearer, the caller must pass the token (from session or Authorization header).
9
+ */
10
+ export declare function getAuthHeaders(options: {
11
+ strategy: AuthStrategy;
12
+ bearerToken?: string;
13
+ getSessionToken?: () => Promise<string | undefined>;
14
+ }): Promise<Record<string, string>>;
15
+ export declare function getAuthStrategy(): AuthStrategy;
16
+ //# sourceMappingURL=auth-strategies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-strategies.d.ts","sourceRoot":"","sources":["../../../src/server/auth0/auth-strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,oBAAoB,GACpB,yBAAyB,GACzB,cAAc,CAAC;AA8CnB;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACrD,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2BlC;AAED,wBAAgB,eAAe,IAAI,YAAY,CAW9C"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Auth strategies for A2A proxy.
3
+ * Framework-agnostic; returns headers to add to the A2A request.
4
+ */
5
+ let m2mTokenCache = null;
6
+ /**
7
+ * Get Auth0 token via client credentials (M2M).
8
+ */
9
+ async function getClientCredentialsToken() {
10
+ const domain = process.env.AUTH0_DOMAIN;
11
+ const clientId = process.env.AUTH0_CLIENT_ID;
12
+ const clientSecret = process.env.AUTH0_CLIENT_SECRET;
13
+ const audience = process.env.AUTH0_A2A_AUDIENCE;
14
+ if (!domain || !clientId || !clientSecret || !audience) {
15
+ return undefined;
16
+ }
17
+ if (m2mTokenCache && m2mTokenCache.expiresAt > Date.now() + 60000) {
18
+ return m2mTokenCache.token;
19
+ }
20
+ const res = await fetch(`https://${domain}/oauth/token`, {
21
+ method: "POST",
22
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
23
+ body: new URLSearchParams({
24
+ grant_type: "client_credentials",
25
+ client_id: clientId,
26
+ client_secret: clientSecret,
27
+ audience,
28
+ }),
29
+ });
30
+ if (!res.ok) {
31
+ const body = await res.json().catch(() => ({}));
32
+ throw new Error(body.error_description || body.error || `Auth0 token failed: ${res.status}`);
33
+ }
34
+ const data = (await res.json());
35
+ const expiresIn = (data.expires_in ?? 86400) * 1000;
36
+ m2mTokenCache = {
37
+ token: data.access_token,
38
+ expiresAt: Date.now() + expiresIn,
39
+ };
40
+ return data.access_token;
41
+ }
42
+ /**
43
+ * Get headers for A2A request based on strategy.
44
+ * For session/bearer, the caller must pass the token (from session or Authorization header).
45
+ */
46
+ export async function getAuthHeaders(options) {
47
+ const headers = {};
48
+ const apiKey = process.env.A2A_API_KEY;
49
+ switch (options.strategy) {
50
+ case "api_key_only":
51
+ if (apiKey)
52
+ headers["x-api-key"] = apiKey;
53
+ break;
54
+ case "client_credentials": {
55
+ const token = await getClientCredentialsToken();
56
+ if (token)
57
+ headers["Authorization"] = `Bearer ${token}`;
58
+ if (apiKey)
59
+ headers["x-api-key"] = apiKey;
60
+ break;
61
+ }
62
+ case "resource_owner_password":
63
+ case "session": {
64
+ const token = options.bearerToken ?? (options.getSessionToken ? await options.getSessionToken() : undefined);
65
+ if (token)
66
+ headers["Authorization"] = `Bearer ${token}`;
67
+ if (apiKey)
68
+ headers["x-api-key"] = apiKey;
69
+ break;
70
+ }
71
+ }
72
+ return headers;
73
+ }
74
+ export function getAuthStrategy() {
75
+ const s = process.env.A2A_AUTH_STRATEGY?.toLowerCase();
76
+ if (s === "session" ||
77
+ s === "client_credentials" ||
78
+ s === "resource_owner_password" ||
79
+ s === "api_key_only") {
80
+ return s;
81
+ }
82
+ return "api_key_only";
83
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Get Auth0 token via client credentials (M2M).
3
+ */
4
+ export declare function getAuth0ClientCredentialsToken(): Promise<string | undefined>;
5
+ //# sourceMappingURL=client-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-credentials.d.ts","sourceRoot":"","sources":["../../../src/server/auth0/client-credentials.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAwClF"}
@@ -0,0 +1,39 @@
1
+ import { getNebulasServerConfig } from "../runtime-config.js";
2
+ let m2mTokenCache = null;
3
+ /**
4
+ * Get Auth0 token via client credentials (M2M).
5
+ */
6
+ export async function getAuth0ClientCredentialsToken() {
7
+ const config = getNebulasServerConfig().auth0;
8
+ const domain = config?.domain;
9
+ const clientId = config?.clientId;
10
+ const clientSecret = config?.clientSecret;
11
+ const audience = config?.audience;
12
+ if (!domain || !clientId || !clientSecret || !audience) {
13
+ return undefined;
14
+ }
15
+ if (m2mTokenCache && m2mTokenCache.expiresAt > Date.now() + 60000) {
16
+ return m2mTokenCache.token;
17
+ }
18
+ const res = await fetch(`https://${domain}/oauth/token`, {
19
+ method: "POST",
20
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
21
+ body: new URLSearchParams({
22
+ grant_type: "client_credentials",
23
+ client_id: clientId,
24
+ client_secret: clientSecret,
25
+ audience,
26
+ }),
27
+ });
28
+ if (!res.ok) {
29
+ const body = await res.json().catch(() => ({}));
30
+ throw new Error(body.error_description || body.error || `Auth0 token failed: ${res.status}`);
31
+ }
32
+ const data = (await res.json());
33
+ const expiresIn = (data.expires_in ?? 86400) * 1000;
34
+ m2mTokenCache = {
35
+ token: data.access_token,
36
+ expiresAt: Date.now() + expiresIn,
37
+ };
38
+ return data.access_token;
39
+ }
@@ -0,0 +1,5 @@
1
+ export declare function exchangeAuth0EnvServiceToken(): Promise<{
2
+ access_token: string;
3
+ expires_in?: number;
4
+ }>;
5
+ //# sourceMappingURL=env-service-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-service-token.d.ts","sourceRoot":"","sources":["../../../src/server/auth0/env-service-token.ts"],"names":[],"mappings":"AAGA,wBAAsB,4BAA4B,IAAI,OAAO,CAAC;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAUD"}
@@ -0,0 +1,11 @@
1
+ import { exchangePasswordForToken } from "./auth-handler.js";
2
+ import { getNebulasServerConfig } from "../runtime-config.js";
3
+ export async function exchangeAuth0EnvServiceToken() {
4
+ const serviceUser = getNebulasServerConfig().auth0ServiceUser;
5
+ const username = serviceUser?.username;
6
+ const password = serviceUser?.password;
7
+ if (!username || !password) {
8
+ throw new Error("Auth0 service user credentials are required for service ROP token");
9
+ }
10
+ return exchangePasswordForToken(username, password);
11
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"config-handler.d.ts","sourceRoot":"","sources":["../../src/server/config-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kGAAkG;IAClG,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAyBD,wBAAsB,oBAAoB,CACxC,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,cAAc,CAAC,CAmBzB"}
1
+ {"version":3,"file":"config-handler.d.ts","sourceRoot":"","sources":["../../src/server/config-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kGAAkG;IAClG,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AA0BD,wBAAsB,oBAAoB,CACxC,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,cAAc,CAAC,CAmBzB"}
@@ -3,10 +3,10 @@
3
3
  * Fetches agent card from A2A_URL/.well-known/agent-card.json when A2A_URL is set.
4
4
  * Framework-agnostic; returns JSON response body.
5
5
  */
6
- import { nodeEnv } from "./node-env.js";
7
- const A2A_URL = nodeEnv("A2A_URL") || nodeEnv("NEXT_PUBLIC_A2A_URL") || "";
6
+ import { getNebulasServerConfig } from "./runtime-config.js";
8
7
  async function fetchAgentCard(headers) {
9
- const base = A2A_URL.replace(/\/$/, "");
8
+ const a2aUrl = getNebulasServerConfig().a2aUrl ?? "";
9
+ const base = a2aUrl.replace(/\/$/, "");
10
10
  if (!base)
11
11
  return null;
12
12
  const url = `${base}/.well-known/agent-card.json`;
@@ -29,7 +29,7 @@ async function fetchAgentCard(headers) {
29
29
  }
30
30
  }
31
31
  export async function createConfigResponse(options) {
32
- const nebulasProjectId = nodeEnv("NEBULAS_PROJECT_ID") ?? null;
32
+ const nebulasProjectId = getNebulasServerConfig().nebulasProjectId ?? null;
33
33
  const includeAgentCard = options?.includeAgentCard !== false;
34
34
  if (!includeAgentCard) {
35
35
  return {
@@ -0,0 +1,5 @@
1
+ export declare function exchangeEntraClientCredentialsToken(): Promise<{
2
+ access_token: string;
3
+ expires_in?: number;
4
+ }>;
5
+ //# sourceMappingURL=env-service-token.d.ts.map