@gnomondigital/nebulas-kit-core 0.4.0 → 0.4.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 +27 -1
- package/dist/client-api.d.ts +11 -0
- package/dist/client-api.d.ts.map +1 -0
- package/dist/client-api.js +9 -0
- package/dist/express-api.d.ts +5 -0
- package/dist/express-api.d.ts.map +1 -0
- package/dist/express-api.js +4 -0
- package/dist/index.js +1 -1
- package/dist/server/config-handler.d.ts.map +1 -1
- package/dist/server/config-handler.js +3 -2
- package/dist/server/express.d.ts +7 -0
- package/dist/server/express.d.ts.map +1 -1
- package/dist/server/express.js +66 -7
- package/dist/server/nebulas-proxy-handler.d.ts.map +1 -1
- package/dist/server/nebulas-proxy-handler.js +5 -4
- package/dist/server/nextjs.d.ts.map +1 -1
- package/dist/server/node-env.d.ts +6 -0
- package/dist/server/node-env.d.ts.map +1 -0
- package/dist/server/node-env.js +12 -0
- package/dist/server/proxy-handler.d.ts.map +1 -1
- package/dist/server/proxy-handler.js +3 -2
- package/package.json +10 -1
package/README.md
CHANGED
|
@@ -8,6 +8,16 @@ Framework-agnostic A2A chat client, Nebulas client, and server handlers.
|
|
|
8
8
|
npm install @gnomondigital/nebulas-kit-core
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
### Subpath exports
|
|
12
|
+
|
|
13
|
+
| Import path | Use |
|
|
14
|
+
|-------------|-----|
|
|
15
|
+
| `@gnomondigital/nebulas-kit-core` | Full API (Next.js, Express, proxy handlers). |
|
|
16
|
+
| `@gnomondigital/nebulas-kit-core/client` | Browser-only: `sendMessageStream`, Nebulas client, types. **Use from React/Vite** so `next/server` is never bundled. |
|
|
17
|
+
| `@gnomondigital/nebulas-kit-core/express` | Express router only; no Next.js. |
|
|
18
|
+
|
|
19
|
+
`@gnomondigital/nebulas-kit-react` imports from `/client` internally.
|
|
20
|
+
|
|
11
21
|
## Environment Variables
|
|
12
22
|
|
|
13
23
|
| Variable | Required | Description |
|
|
@@ -131,10 +141,26 @@ export const DELETE = handler;
|
|
|
131
141
|
|
|
132
142
|
```ts
|
|
133
143
|
import express from "express";
|
|
134
|
-
import { createA2AExpressRouter } from "@gnomondigital/nebulas-kit-core";
|
|
144
|
+
import { createA2AExpressRouter } from "@gnomondigital/nebulas-kit-core/express";
|
|
135
145
|
|
|
136
146
|
const app = express();
|
|
137
147
|
app.use(express.json());
|
|
138
148
|
app.use("/api/a2a", createA2AExpressRouter(express));
|
|
139
149
|
app.listen(3000);
|
|
140
150
|
```
|
|
151
|
+
|
|
152
|
+
Use **`@gnomondigital/nebulas-kit-core/express`** so the bundle does not load Next.js adapters (`next/server`).
|
|
153
|
+
|
|
154
|
+
**Env ROP** (service user in `AUTH0_ROP_USERNAME` / `AUTH0_ROP_PASSWORD`, same as Next.js `createA2AProxyHandlerFromEnvROP`):
|
|
155
|
+
|
|
156
|
+
```ts
|
|
157
|
+
app.use(
|
|
158
|
+
"/api/a2a",
|
|
159
|
+
createA2AExpressRouter(express, {
|
|
160
|
+
useEnvRop: true,
|
|
161
|
+
envRopApiKey: process.env.A2A_API_KEY,
|
|
162
|
+
})
|
|
163
|
+
);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
See `apps/demo_express_rop` in the monorepo for a full Express + Vite example.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser / React entry: A2A client, Nebulas client, shared types.
|
|
3
|
+
* Does not load Next.js, Express adapters, or other server-only modules.
|
|
4
|
+
*
|
|
5
|
+
* Use from UI code: `import { sendMessageStream } from "@gnomondigital/nebulas-kit-core/client"`
|
|
6
|
+
*/
|
|
7
|
+
export { sendMessageStream } from "./a2a-client.js";
|
|
8
|
+
export { createNebulasClient, nebulasClient, type NebulasConversation, type NebulasChatMessage, type CreateChatMessageParams, type NebulasClientOptions, } from "./nebulas-client.js";
|
|
9
|
+
export { transformUtcDatesToLocal } from "./utils/date-timezone.js";
|
|
10
|
+
export type { ChatMessage, ChatMessagePayload, SendMessageStreamOptions, } from "./types.js";
|
|
11
|
+
//# sourceMappingURL=client-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-api.d.ts","sourceRoot":"","sources":["../src/client-api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser / React entry: A2A client, Nebulas client, shared types.
|
|
3
|
+
* Does not load Next.js, Express adapters, or other server-only modules.
|
|
4
|
+
*
|
|
5
|
+
* Use from UI code: `import { sendMessageStream } from "@gnomondigital/nebulas-kit-core/client"`
|
|
6
|
+
*/
|
|
7
|
+
export { sendMessageStream } from "./a2a-client.js";
|
|
8
|
+
export { createNebulasClient, nebulasClient, } from "./nebulas-client.js";
|
|
9
|
+
export { transformUtcDatesToLocal } from "./utils/date-timezone.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-api.d.ts","sourceRoot":"","sources":["../src/express-api.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,sBAAsB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ export { getAuthStrategy, getAuthHeaders, } from "./server/auth-strategies.js";
|
|
|
10
10
|
export { exchangePasswordForToken, } from "./server/auth-handler.js";
|
|
11
11
|
export { createConfigResponse, } from "./server/config-handler.js";
|
|
12
12
|
export { createA2AExpressRouter, } from "./server/express.js";
|
|
13
|
-
//
|
|
13
|
+
// Express-only apps: import from "@gnomondigital/nebulas-kit-core/express" to avoid loading Next.js.
|
|
14
14
|
export { handleA2ANextJsPOST, handleA2AAuthNextJsPOST, handleA2AConfigNextJsGET, createGetHeadersForAuth0, createGetHeadersFromEnvROP, createA2AProxyHandler, createA2AProxyHandlerFromEnvROP, createNebulasProxyHandler, } from "./server/nextjs.js";
|
|
15
15
|
export { getCachedAccessTokenFromEnvROP } from "./server/env-rop-token.js";
|
|
16
16
|
export { handleNebulasProxy, isRefreshTokenInvalid, } from "./server/nebulas-proxy-handler.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-handler.d.ts","sourceRoot":"","sources":["../../src/server/config-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
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"}
|
|
@@ -3,7 +3,8 @@
|
|
|
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
|
-
|
|
6
|
+
import { nodeEnv } from "./node-env.js";
|
|
7
|
+
const A2A_URL = nodeEnv("A2A_URL") || nodeEnv("NEXT_PUBLIC_A2A_URL") || "";
|
|
7
8
|
async function fetchAgentCard(headers) {
|
|
8
9
|
const base = A2A_URL.replace(/\/$/, "");
|
|
9
10
|
if (!base)
|
|
@@ -28,7 +29,7 @@ async function fetchAgentCard(headers) {
|
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
export async function createConfigResponse(options) {
|
|
31
|
-
const nebulasProjectId =
|
|
32
|
+
const nebulasProjectId = nodeEnv("NEBULAS_PROJECT_ID") ?? null;
|
|
32
33
|
const includeAgentCard = options?.includeAgentCard !== false;
|
|
33
34
|
if (!includeAgentCard) {
|
|
34
35
|
return {
|
package/dist/server/express.d.ts
CHANGED
|
@@ -28,6 +28,13 @@ import { type ProxyHandlerOptions } from "./proxy-handler.js";
|
|
|
28
28
|
export interface A2AExpressRouterOptions extends ProxyHandlerOptions {
|
|
29
29
|
/** When provided, uses these headers when fetching agent card (same auth as A2A proxy). */
|
|
30
30
|
configGetHeaders?: (req: Request) => Promise<Record<string, string>>;
|
|
31
|
+
/**
|
|
32
|
+
* When true, uses AUTH0_ROP_USERNAME / AUTH0_ROP_PASSWORD for the A2A proxy and agent card
|
|
33
|
+
* (server-side env ROP), matching Next.js `createA2AProxyHandlerFromEnvROP`.
|
|
34
|
+
*/
|
|
35
|
+
useEnvRop?: boolean;
|
|
36
|
+
/** Optional x-api-key when useEnvRop is true (e.g. process.env.A2A_API_KEY). */
|
|
37
|
+
envRopApiKey?: string;
|
|
31
38
|
}
|
|
32
39
|
/**
|
|
33
40
|
* Create Express router for A2A proxy, auth (ROP), and config.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,CAAC;IAC1C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,eAAe,CAAC;IAC5D,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/B;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC3G,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,KAAK,IAAI,CAAC;CAC3F;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,aAAa,CAAC;CAC7B;AAED,KAAK,OAAO,GAAG,cAAc,CAAC;AAE9B,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,CAAC;IAC1C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,eAAe,CAAC;IAC5D,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/B;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC3G,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,KAAK,IAAI,CAAC;CAC3F;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,aAAa,CAAC;CAC7B;AAED,KAAK,OAAO,GAAG,cAAc,CAAC;AAE9B,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAK9E,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE,2FAA2F;IAC3F,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAoCD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,uBAAuB,iBAiHlC"}
|
package/dist/server/express.js
CHANGED
|
@@ -5,6 +5,23 @@
|
|
|
5
5
|
import { handleA2AProxy } from "./proxy-handler.js";
|
|
6
6
|
import { exchangePasswordForToken } from "./auth-handler.js";
|
|
7
7
|
import { createConfigResponse } from "./config-handler.js";
|
|
8
|
+
import { getCachedAccessTokenFromEnvROP } from "./env-rop-token.js";
|
|
9
|
+
async function buildEnvRopHeaders(apiKey) {
|
|
10
|
+
const headers = {};
|
|
11
|
+
if (apiKey) {
|
|
12
|
+
headers["x-api-key"] = apiKey;
|
|
13
|
+
}
|
|
14
|
+
const token = await getCachedAccessTokenFromEnvROP();
|
|
15
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
16
|
+
return headers;
|
|
17
|
+
}
|
|
18
|
+
function expressRouterProxyOptions(options) {
|
|
19
|
+
if (!options) {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
const { configGetHeaders: _c, useEnvRop: _u, envRopApiKey: _a, ...rest } = options;
|
|
23
|
+
return rest;
|
|
24
|
+
}
|
|
8
25
|
function getHeadersFromRequest(req) {
|
|
9
26
|
const headers = {};
|
|
10
27
|
const h = req.headers;
|
|
@@ -37,7 +54,28 @@ export function createA2AExpressRouter(express, options) {
|
|
|
37
54
|
headers: getHeadersFromRequest(req),
|
|
38
55
|
body: body || undefined,
|
|
39
56
|
};
|
|
40
|
-
|
|
57
|
+
let proxyOptions;
|
|
58
|
+
if (options?.useEnvRop) {
|
|
59
|
+
try {
|
|
60
|
+
const authHeaders = await buildEnvRopHeaders(options.envRopApiKey);
|
|
61
|
+
proxyOptions = {
|
|
62
|
+
...expressRouterProxyOptions(options),
|
|
63
|
+
headers: authHeaders,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.error("[Env ROP] Failed to get access token:", err);
|
|
68
|
+
res.status(401).json({
|
|
69
|
+
error: "Unauthorized",
|
|
70
|
+
hint: "Check AUTH0_ROP_USERNAME, AUTH0_ROP_PASSWORD, AUTH0_DOMAIN, client credentials, and Auth0 ROP configuration.",
|
|
71
|
+
});
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
proxyOptions = expressRouterProxyOptions(options);
|
|
77
|
+
}
|
|
78
|
+
const result = await handleA2AProxy(proxyReq, proxyOptions);
|
|
41
79
|
res.status(result.status);
|
|
42
80
|
for (const [k, v] of Object.entries(result.headers)) {
|
|
43
81
|
res.setHeader(k, v);
|
|
@@ -84,13 +122,34 @@ export function createA2AExpressRouter(express, options) {
|
|
|
84
122
|
}
|
|
85
123
|
});
|
|
86
124
|
router.get("/config", async (req, res) => {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
125
|
+
try {
|
|
126
|
+
const includeAgentCard = req.query?.includeAgentCard !== "false";
|
|
127
|
+
let headers;
|
|
128
|
+
if (includeAgentCard) {
|
|
129
|
+
if (options?.useEnvRop) {
|
|
130
|
+
try {
|
|
131
|
+
headers = await buildEnvRopHeaders(options.envRopApiKey);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
console.error("[Env ROP] Failed to get access token:", err);
|
|
135
|
+
res.status(401).json({
|
|
136
|
+
error: "Unauthorized",
|
|
137
|
+
hint: "Check AUTH0_ROP_USERNAME, AUTH0_ROP_PASSWORD, AUTH0_DOMAIN, client credentials, and Auth0 ROP configuration.",
|
|
138
|
+
});
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (options?.configGetHeaders) {
|
|
143
|
+
headers = await options.configGetHeaders(req);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const config = await createConfigResponse({ includeAgentCard, headers });
|
|
147
|
+
res.json(config);
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
console.error("[A2A Express] Config error:", err);
|
|
151
|
+
res.status(500).json({ error: "Internal server error" });
|
|
91
152
|
}
|
|
92
|
-
const config = await createConfigResponse({ includeAgentCard, headers });
|
|
93
|
-
res.json(config);
|
|
94
153
|
});
|
|
95
154
|
return router;
|
|
96
155
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nebulas-proxy-handler.d.ts","sourceRoot":"","sources":["../../src/server/nebulas-proxy-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"nebulas-proxy-handler.d.ts","sourceRoot":"","sources":["../../src/server/nebulas-proxy-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;CAC1D;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAS3D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,mBAAmB,EACxB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,oBAAoB,CAAC,CAwH/B"}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* Framework-agnostic Nebulas API proxy handler.
|
|
3
3
|
* Proxies requests to the Nebulas API (conversations, chat_messages).
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
5
|
+
import { nodeEnv } from "./node-env.js";
|
|
6
|
+
const NEBULAS_API_URL = nodeEnv("NEBULAS_API_URL") || "http://localhost:8020";
|
|
7
|
+
const A2A_AUDIENCE = nodeEnv("AUTH0_A2A_AUDIENCE");
|
|
8
|
+
const A2A_API_KEY = nodeEnv("A2A_API_KEY");
|
|
9
|
+
const NEBULAS_API_KEY = nodeEnv("NEBULAS_API_KEY");
|
|
9
10
|
/**
|
|
10
11
|
* Check if an error indicates invalid refresh token (for session re-auth).
|
|
11
12
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/server/nextjs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAkB9E;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,mBAAmB,qBA6B9B;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,WAAW,qBAyBjE;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxE;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,sBAAsB,qBAqBjC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC7D,cAAc,CACZ,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GACzB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,KAAK,EAAE,oBAAoB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,CACF,OAAO,EAAE,WAAW,EACpB,YAAY,CAAC,EAAE,YAAY,KACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAoDnC;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,oBAAoB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,IAO3C,SAAS,WAAW,uBAuDnD;AAED,MAAM,WAAW,iCAAiC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,CAAC,EAAE,iCAAiC,GAC1C,CAAC,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAsB5D;AAED,MAAM,WAAW,sCAAsC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,CAAC,EAAE,sCAAsC,IAIlB,SAAS,WAAW,uBAiDnD;AAED;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,KAAK,EAAE,oBAAoB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gCAAgC,IAE/E,SAAS,WAAW,EACpB,KAAK;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/server/nextjs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAkB9E;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,mBAAmB,qBA6B9B;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,WAAW,qBAyBjE;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxE;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,sBAAsB,qBAqBjC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC7D,cAAc,CACZ,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GACzB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,KAAK,EAAE,oBAAoB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,CACF,OAAO,EAAE,WAAW,EACpB,YAAY,CAAC,EAAE,YAAY,KACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAoDnC;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,oBAAoB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,IAO3C,SAAS,WAAW,uBAuDnD;AAED,MAAM,WAAW,iCAAiC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,CAAC,EAAE,iCAAiC,GAC1C,CAAC,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAsB5D;AAED,MAAM,WAAW,sCAAsC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,CAAC,EAAE,sCAAsC,IAIlB,SAAS,WAAW,uBAiDnD;AAED;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,KAAK,EAAE,oBAAoB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gCAAgC,IAE/E,SAAS,WAAW,EACpB,KAAK;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE,oCAiH/C"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read `process.env` only when `process` exists (Node). Prevents ReferenceError if server
|
|
3
|
+
* modules are accidentally included in a browser bundle (e.g. incomplete tree-shaking).
|
|
4
|
+
*/
|
|
5
|
+
export declare function nodeEnv(name: string): string | undefined;
|
|
6
|
+
//# sourceMappingURL=node-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-env.d.ts","sourceRoot":"","sources":["../../src/server/node-env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKxD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read `process.env` only when `process` exists (Node). Prevents ReferenceError if server
|
|
3
|
+
* modules are accidentally included in a browser bundle (e.g. incomplete tree-shaking).
|
|
4
|
+
*/
|
|
5
|
+
export function nodeEnv(name) {
|
|
6
|
+
if (typeof process === "undefined")
|
|
7
|
+
return undefined;
|
|
8
|
+
const env = process.env;
|
|
9
|
+
if (!env)
|
|
10
|
+
return undefined;
|
|
11
|
+
return env[name];
|
|
12
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-handler.d.ts","sourceRoot":"","sources":["../../src/server/proxy-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"proxy-handler.d.ts","sourceRoot":"","sources":["../../src/server/proxy-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACrE;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,YAAY,EACjB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,CAAC,CAkFxB"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Accepts a minimal request/response interface.
|
|
4
4
|
*/
|
|
5
5
|
import { getAuthStrategy, getAuthHeaders, } from "./auth-strategies.js";
|
|
6
|
-
|
|
6
|
+
import { nodeEnv } from "./node-env.js";
|
|
7
|
+
const A2A_URL = nodeEnv("A2A_URL") || nodeEnv("NEXT_PUBLIC_A2A_URL") || "http://localhost:9999";
|
|
7
8
|
/**
|
|
8
9
|
* Handle A2A proxy request. Returns response to send.
|
|
9
10
|
*/
|
|
@@ -26,7 +27,7 @@ export async function handleA2AProxy(req, options = {}) {
|
|
|
26
27
|
else if (strategy === "session" && options.getSessionToken) {
|
|
27
28
|
bearerToken = await options.getSessionToken(req);
|
|
28
29
|
}
|
|
29
|
-
if (strategy === "session" && !bearerToken && !
|
|
30
|
+
if (strategy === "session" && !bearerToken && !nodeEnv("A2A_API_KEY")) {
|
|
30
31
|
return {
|
|
31
32
|
status: 401,
|
|
32
33
|
headers: { "Content-Type": "application/json" },
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gnomondigital/nebulas-kit-core",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"type": "module",
|
|
5
|
+
"sideEffects": false,
|
|
5
6
|
"main": "./dist/index.js",
|
|
6
7
|
"module": "./dist/index.js",
|
|
7
8
|
"types": "./dist/index.d.ts",
|
|
@@ -9,6 +10,14 @@
|
|
|
9
10
|
".": {
|
|
10
11
|
"import": "./dist/index.js",
|
|
11
12
|
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./express": {
|
|
15
|
+
"import": "./dist/express-api.js",
|
|
16
|
+
"types": "./dist/express-api.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./client": {
|
|
19
|
+
"import": "./dist/client-api.js",
|
|
20
|
+
"types": "./dist/client-api.d.ts"
|
|
12
21
|
}
|
|
13
22
|
},
|
|
14
23
|
"files": [
|