@kilnai/runtime 0.1.12 → 0.1.14
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/dist/channels/api-channel.d.ts +0 -8
- package/dist/channels/api-channel.d.ts.map +1 -1
- package/dist/channels/api-channel.js +0 -11
- package/dist/channels/api-channel.js.map +1 -1
- package/dist/gateway/app-resolver.d.ts +2 -1
- package/dist/gateway/app-resolver.d.ts.map +1 -1
- package/dist/gateway/app-resolver.js +10 -2
- package/dist/gateway/app-resolver.js.map +1 -1
- package/dist/gateway/auth-middleware.d.ts +25 -0
- package/dist/gateway/auth-middleware.d.ts.map +1 -0
- package/dist/gateway/auth-middleware.js +71 -0
- package/dist/gateway/auth-middleware.js.map +1 -0
- package/dist/gateway/conversation-event-emitter.d.ts +12 -0
- package/dist/gateway/conversation-event-emitter.d.ts.map +1 -0
- package/dist/gateway/conversation-event-emitter.js +50 -0
- package/dist/gateway/conversation-event-emitter.js.map +1 -0
- package/dist/gateway/gateway-routes.d.ts +2 -0
- package/dist/gateway/gateway-routes.d.ts.map +1 -1
- package/dist/gateway/gateway-routes.js +3 -0
- package/dist/gateway/gateway-routes.js.map +1 -1
- package/dist/gateway/gateway-server.d.ts.map +1 -1
- package/dist/gateway/gateway-server.js +32 -0
- package/dist/gateway/gateway-server.js.map +1 -1
- package/dist/gateway/mode-b-routes.d.ts +1 -0
- package/dist/gateway/mode-b-routes.d.ts.map +1 -1
- package/dist/gateway/mode-b-routes.js +4 -0
- package/dist/gateway/mode-b-routes.js.map +1 -1
- package/dist/gateway/tenant-admin-routes.d.ts.map +1 -1
- package/dist/gateway/tenant-admin-routes.js +3 -8
- package/dist/gateway/tenant-admin-routes.js.map +1 -1
- package/dist/gateway/tenant-routes.d.ts +1 -0
- package/dist/gateway/tenant-routes.d.ts.map +1 -1
- package/dist/gateway/tenant-routes.js +4 -0
- package/dist/gateway/tenant-routes.js.map +1 -1
- package/dist/gateway/whatsapp-webhook-routes.d.ts +3 -0
- package/dist/gateway/whatsapp-webhook-routes.d.ts.map +1 -1
- package/dist/gateway/whatsapp-webhook-routes.js +29 -0
- package/dist/gateway/whatsapp-webhook-routes.js.map +1 -1
- package/dist/gateway/ws-routes.d.ts +1 -0
- package/dist/gateway/ws-routes.d.ts.map +1 -1
- package/dist/gateway/ws-routes.js +5 -0
- package/dist/gateway/ws-routes.js.map +1 -1
- package/dist/gateway/ws-tenant-routes.d.ts +3 -0
- package/dist/gateway/ws-tenant-routes.d.ts.map +1 -1
- package/dist/gateway/ws-tenant-routes.js +30 -0
- package/dist/gateway/ws-tenant-routes.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/session/session-registry.d.ts +2 -0
- package/dist/session/session-registry.d.ts.map +1 -1
- package/dist/session/session-registry.js +10 -0
- package/dist/session/session-registry.js.map +1 -1
- package/package.json +2 -2
|
@@ -4,9 +4,6 @@ export interface SseWriter {
|
|
|
4
4
|
write(data: string): void;
|
|
5
5
|
close(): void;
|
|
6
6
|
}
|
|
7
|
-
interface ApiChannelConfig {
|
|
8
|
-
apiKey?: string;
|
|
9
|
-
}
|
|
10
7
|
/**
|
|
11
8
|
* Channel adapter for REST API consumers with SSE streaming.
|
|
12
9
|
* receive() accepts incoming API messages and invokes the registered handler.
|
|
@@ -17,11 +14,9 @@ export declare class ApiChannel implements Channel {
|
|
|
17
14
|
readonly name = "api";
|
|
18
15
|
readonly defaultFormat: MessageFormat;
|
|
19
16
|
readonly supportedModalities: readonly Modality[];
|
|
20
|
-
private readonly config;
|
|
21
17
|
private readonly responseQueue;
|
|
22
18
|
private readonly sseClients;
|
|
23
19
|
private messageHandler;
|
|
24
|
-
constructor(config?: ApiChannelConfig);
|
|
25
20
|
/** Register a handler for incoming API messages */
|
|
26
21
|
onMessage(handler: (message: IncomingMessage) => void): void;
|
|
27
22
|
receive(message: IncomingMessage): Promise<void>;
|
|
@@ -35,9 +30,6 @@ export declare class ApiChannel implements Channel {
|
|
|
35
30
|
get sseClientCount(): number;
|
|
36
31
|
/** Returns and clears all queued responses (for REST polling) */
|
|
37
32
|
pollResponses(): OutgoingMessage[];
|
|
38
|
-
/** Returns true if no apiKey configured, or if key matches */
|
|
39
|
-
validateApiKey(key: string): boolean;
|
|
40
33
|
private broadcastSse;
|
|
41
34
|
}
|
|
42
|
-
export {};
|
|
43
35
|
//# sourceMappingURL=api-channel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-channel.d.ts","sourceRoot":"","sources":["../../src/channels/api-channel.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAMpH,uFAAuF;AACvF,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;CACf;AAED
|
|
1
|
+
{"version":3,"file":"api-channel.d.ts","sourceRoot":"","sources":["../../src/channels/api-channel.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAMpH,uFAAuF;AACvF,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,OAAO;IACxC,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAgB;IACrD,QAAQ,CAAC,mBAAmB,EAAE,SAAS,QAAQ,EAAE,CAAsC;IAEvF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,OAAO,CAAC,cAAc,CAAqD;IAE3E,mDAAmD;IACnD,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAItD,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhD,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB9C,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/D,mCAAmC;IACnC,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAIrC,sCAAsC;IACtC,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAIxC,sCAAsC;IACtC,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,iEAAiE;IACjE,aAAa,IAAI,eAAe,EAAE;IAIlC,OAAO,CAAC,YAAY;CASrB"}
|
|
@@ -13,13 +13,9 @@ export class ApiChannel {
|
|
|
13
13
|
name = "api";
|
|
14
14
|
defaultFormat = "structured";
|
|
15
15
|
supportedModalities = ["text", "image", "audio", "file"];
|
|
16
|
-
config;
|
|
17
16
|
responseQueue = [];
|
|
18
17
|
sseClients = new Set();
|
|
19
18
|
messageHandler = null;
|
|
20
|
-
constructor(config = {}) {
|
|
21
|
-
this.config = config;
|
|
22
|
-
}
|
|
23
19
|
/** Register a handler for incoming API messages */
|
|
24
20
|
onMessage(handler) {
|
|
25
21
|
this.messageHandler = handler;
|
|
@@ -74,13 +70,6 @@ export class ApiChannel {
|
|
|
74
70
|
pollResponses() {
|
|
75
71
|
return this.responseQueue.splice(0);
|
|
76
72
|
}
|
|
77
|
-
/** Returns true if no apiKey configured, or if key matches */
|
|
78
|
-
validateApiKey(key) {
|
|
79
|
-
if (!this.config.apiKey) {
|
|
80
|
-
return true;
|
|
81
|
-
}
|
|
82
|
-
return key === this.config.apiKey;
|
|
83
|
-
}
|
|
84
73
|
broadcastSse(payload) {
|
|
85
74
|
for (const client of this.sseClients) {
|
|
86
75
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-channel.js","sourceRoot":"","sources":["../../src/channels/api-channel.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,kFAAkF;AAGlF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,cAAc,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"api-channel.js","sourceRoot":"","sources":["../../src/channels/api-channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { App, ModeBConfig } from "@kilnai/core";
|
|
1
|
+
import type { App, ModeBConfig, EventsConfig } from "@kilnai/core";
|
|
2
2
|
import type { GatewayConfig, GatewayAppBinding } from "@kilnai/core";
|
|
3
3
|
export interface ResolvedApp {
|
|
4
4
|
readonly name: string;
|
|
@@ -6,6 +6,7 @@ export interface ResolvedApp {
|
|
|
6
6
|
readonly binding: GatewayAppBinding;
|
|
7
7
|
readonly memoryBasePath: string;
|
|
8
8
|
readonly modeBConfig?: ModeBConfig;
|
|
9
|
+
readonly eventsConfig?: EventsConfig;
|
|
9
10
|
}
|
|
10
11
|
export declare function resolveApps(config: GatewayConfig, gatewayYamlDir: string): ResolvedApp[];
|
|
11
12
|
//# sourceMappingURL=app-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-resolver.d.ts","sourceRoot":"","sources":["../../src/gateway/app-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"app-resolver.d.ts","sourceRoot":"","sources":["../../src/gateway/app-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;CACtC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,GAAG,WAAW,EAAE,CA2CxF"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
|
-
import { parseAppYaml, parseModeBConfig, KilnError } from "@kilnai/core";
|
|
5
|
+
import { parseAppYaml, parseModeBConfig, parseEventsConfig, KilnError } from "@kilnai/core";
|
|
6
6
|
export function resolveApps(config, gatewayYamlDir) {
|
|
7
7
|
return config.apps.map((binding) => {
|
|
8
8
|
const configPath = join(gatewayYamlDir, binding.config);
|
|
@@ -30,7 +30,15 @@ export function resolveApps(config, gatewayYamlDir) {
|
|
|
30
30
|
catch {
|
|
31
31
|
// Mode B parse failure is non-fatal: app may be Mode A
|
|
32
32
|
}
|
|
33
|
-
|
|
33
|
+
// Parse events config from the same YAML (optional, gateway-level concern)
|
|
34
|
+
let eventsConfig;
|
|
35
|
+
try {
|
|
36
|
+
eventsConfig = parseEventsConfig(content);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Events config parse failure is non-fatal
|
|
40
|
+
}
|
|
41
|
+
return { name: binding.name, app, binding, memoryBasePath, modeBConfig, eventsConfig };
|
|
34
42
|
});
|
|
35
43
|
}
|
|
36
44
|
//# sourceMappingURL=app-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-resolver.js","sourceRoot":"","sources":["../../src/gateway/app-resolver.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"app-resolver.js","sourceRoot":"","sources":["../../src/gateway/app-resolver.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAa5F,MAAM,UAAU,WAAW,CAAC,MAAqB,EAAE,cAAsB;IACvE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAExD,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,gCAAgC,OAAO,CAAC,MAAM,kBAAkB,EAAE;gBACtG,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE;aACxC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,SAAS,CACjB,gBAAgB,EAChB,iCAAiC,OAAO,CAAC,MAAM,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACtG,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CACxD,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzE,IAAI,WAAoC,CAAC;QACzC,IAAI,CAAC;YACH,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;QACzD,CAAC;QAED,2EAA2E;QAC3E,IAAI,YAAsC,CAAC;QAC3C,IAAI,CAAC;YACH,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;IACzF,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Context, Next } from "hono";
|
|
2
|
+
/**
|
|
3
|
+
* Require API key via X-Api-Key header. Returns 401 if missing or invalid.
|
|
4
|
+
*/
|
|
5
|
+
export declare function requireApiKey(key: string): (c: Context, next: Next) => Promise<Response | void>;
|
|
6
|
+
/**
|
|
7
|
+
* Require Bearer token via Authorization header. Returns 401 if missing or invalid.
|
|
8
|
+
*/
|
|
9
|
+
export declare function requireBearer(token: string): (c: Context, next: Next) => Promise<Response | void>;
|
|
10
|
+
/**
|
|
11
|
+
* Validate HMAC-SHA256 signature from a specified header against the raw request body.
|
|
12
|
+
* Strips optional "sha256=" prefix from the signature (Meta/WhatsApp convention).
|
|
13
|
+
* Returns 401 if the header is missing or the signature is invalid.
|
|
14
|
+
*/
|
|
15
|
+
export declare function requireWebhookSignature(secret: string, headerName: string): (c: Context, next: Next) => Promise<Response | void>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if a WebSocket origin is allowed. Utility function, not middleware.
|
|
18
|
+
*
|
|
19
|
+
* - Empty/undefined allowedOrigins -> allow all (open mode)
|
|
20
|
+
* - No Origin header (null) -> allow (non-browser client)
|
|
21
|
+
* - localhost/127.0.0.1 any port -> always allowed
|
|
22
|
+
* - Otherwise -> exact match against allowedOrigins list
|
|
23
|
+
*/
|
|
24
|
+
export declare function isOriginAllowed(origin: string | null, allowedOrigins?: readonly string[]): boolean;
|
|
25
|
+
//# sourceMappingURL=auth-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-middleware.d.ts","sourceRoot":"","sources":["../../src/gateway/auth-middleware.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG1C;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQ/F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQjG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAetD;AAID;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAYlG"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Composable auth middleware for gateway routes
|
|
2
|
+
// Each function returns a Hono middleware or utility for a specific auth mechanism
|
|
3
|
+
import { verifyHmacSha256 } from "../utils/hmac.js";
|
|
4
|
+
/**
|
|
5
|
+
* Require API key via X-Api-Key header. Returns 401 if missing or invalid.
|
|
6
|
+
*/
|
|
7
|
+
export function requireApiKey(key) {
|
|
8
|
+
return async (c, next) => {
|
|
9
|
+
const provided = c.req.header("x-api-key");
|
|
10
|
+
if (!provided || provided !== key) {
|
|
11
|
+
return c.json({ error: "unauthorized", message: "Invalid or missing API key" }, 401);
|
|
12
|
+
}
|
|
13
|
+
return next();
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Require Bearer token via Authorization header. Returns 401 if missing or invalid.
|
|
18
|
+
*/
|
|
19
|
+
export function requireBearer(token) {
|
|
20
|
+
return async (c, next) => {
|
|
21
|
+
const auth = c.req.header("authorization");
|
|
22
|
+
if (!auth || auth !== `Bearer ${token}`) {
|
|
23
|
+
return c.json({ error: "unauthorized", message: "Invalid or missing Bearer token" }, 401);
|
|
24
|
+
}
|
|
25
|
+
return next();
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate HMAC-SHA256 signature from a specified header against the raw request body.
|
|
30
|
+
* Strips optional "sha256=" prefix from the signature (Meta/WhatsApp convention).
|
|
31
|
+
* Returns 401 if the header is missing or the signature is invalid.
|
|
32
|
+
*/
|
|
33
|
+
export function requireWebhookSignature(secret, headerName) {
|
|
34
|
+
return async (c, next) => {
|
|
35
|
+
const signature = c.req.header(headerName);
|
|
36
|
+
if (!signature) {
|
|
37
|
+
return c.json({ error: "unauthorized", message: `Missing ${headerName} header` }, 401);
|
|
38
|
+
}
|
|
39
|
+
const body = await c.req.text();
|
|
40
|
+
const sig = signature.startsWith("sha256=") ? signature.slice(7) : signature;
|
|
41
|
+
if (!verifyHmacSha256(secret, body, sig)) {
|
|
42
|
+
return c.json({ error: "unauthorized", message: "Invalid webhook signature" }, 401);
|
|
43
|
+
}
|
|
44
|
+
return next();
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const LOCALHOST_HOSTNAMES = new Set(["localhost", "127.0.0.1"]);
|
|
48
|
+
/**
|
|
49
|
+
* Check if a WebSocket origin is allowed. Utility function, not middleware.
|
|
50
|
+
*
|
|
51
|
+
* - Empty/undefined allowedOrigins -> allow all (open mode)
|
|
52
|
+
* - No Origin header (null) -> allow (non-browser client)
|
|
53
|
+
* - localhost/127.0.0.1 any port -> always allowed
|
|
54
|
+
* - Otherwise -> exact match against allowedOrigins list
|
|
55
|
+
*/
|
|
56
|
+
export function isOriginAllowed(origin, allowedOrigins) {
|
|
57
|
+
if (!allowedOrigins || allowedOrigins.length === 0)
|
|
58
|
+
return true;
|
|
59
|
+
if (!origin)
|
|
60
|
+
return true;
|
|
61
|
+
try {
|
|
62
|
+
const url = new URL(origin);
|
|
63
|
+
if (LOCALHOST_HOSTNAMES.has(url.hostname))
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return allowedOrigins.includes(origin);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=auth-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../../src/gateway/auth-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ConversationEvent, EventsConfig } from "@kilnai/core";
|
|
2
|
+
export declare class ConversationEventEmitter {
|
|
3
|
+
private readonly config;
|
|
4
|
+
private readonly headers;
|
|
5
|
+
constructor(config: EventsConfig);
|
|
6
|
+
/** Emit a single conversation event. Fire-and-forget: logs errors, never throws. */
|
|
7
|
+
emit(event: ConversationEvent): void;
|
|
8
|
+
/** Emit multiple events in a single batch. Fire-and-forget. */
|
|
9
|
+
emitBatch(events: readonly ConversationEvent[]): void;
|
|
10
|
+
private postBatch;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=conversation-event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-event-emitter.d.ts","sourceRoot":"","sources":["../../src/gateway/conversation-event-emitter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAA0B,YAAY,EAAE,MAAM,cAAc,CAAC;AAiB5F,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,MAAM,EAAE,YAAY;IAKhC,oFAAoF;IACpF,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAKpC,+DAA+D;IAC/D,SAAS,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI;IAMrD,OAAO,CAAC,SAAS;CAalB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Conversation event emitter -- fire-and-forget POST to product backend
|
|
2
|
+
// Same pattern as reportUsage() in budget-middleware.ts
|
|
3
|
+
/** Resolve headers: if value starts with $, look up process.env */
|
|
4
|
+
function resolveHeaders(config) {
|
|
5
|
+
const headers = { "Content-Type": "application/json" };
|
|
6
|
+
if (config.headers) {
|
|
7
|
+
for (const [key, value] of Object.entries(config.headers)) {
|
|
8
|
+
if (value) {
|
|
9
|
+
headers[key] = value.startsWith("$")
|
|
10
|
+
? (process.env[value.slice(1)] ?? value)
|
|
11
|
+
: value;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return headers;
|
|
16
|
+
}
|
|
17
|
+
export class ConversationEventEmitter {
|
|
18
|
+
config;
|
|
19
|
+
headers;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = config;
|
|
22
|
+
this.headers = resolveHeaders(config);
|
|
23
|
+
}
|
|
24
|
+
/** Emit a single conversation event. Fire-and-forget: logs errors, never throws. */
|
|
25
|
+
emit(event) {
|
|
26
|
+
const batch = { events: [event] };
|
|
27
|
+
this.postBatch(batch);
|
|
28
|
+
}
|
|
29
|
+
/** Emit multiple events in a single batch. Fire-and-forget. */
|
|
30
|
+
emitBatch(events) {
|
|
31
|
+
if (events.length === 0)
|
|
32
|
+
return;
|
|
33
|
+
const batch = { events };
|
|
34
|
+
this.postBatch(batch);
|
|
35
|
+
}
|
|
36
|
+
postBatch(batch) {
|
|
37
|
+
fetch(this.config.webhook, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
headers: this.headers,
|
|
40
|
+
body: JSON.stringify(batch),
|
|
41
|
+
}).then((res) => {
|
|
42
|
+
if (!res.ok) {
|
|
43
|
+
console.warn(`[events] POST failed: ${res.status} ${res.statusText}`);
|
|
44
|
+
}
|
|
45
|
+
}).catch((err) => {
|
|
46
|
+
console.warn(`[events] POST error:`, err);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=conversation-event-emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-event-emitter.js","sourceRoot":"","sources":["../../src/gateway/conversation-event-emitter.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,wDAAwD;AAIxD,mEAAmE;AACnE,SAAS,cAAc,CAAC,MAAoB;IAC1C,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;oBAClC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;oBACxC,CAAC,CAAC,KAAK,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,wBAAwB;IAClB,MAAM,CAAe;IACrB,OAAO,CAAyB;IAEjD,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,oFAAoF;IACpF,IAAI,CAAC,KAAwB;QAC3B,MAAM,KAAK,GAA2B,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,+DAA+D;IAC/D,SAAS,CAAC,MAAoC;QAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,KAAK,GAA2B,EAAE,MAAM,EAAE,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAEO,SAAS,CAAC,KAA6B;QAC7C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACzB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -14,6 +14,7 @@ import type { SafetyPipeline } from "@kilnai/core";
|
|
|
14
14
|
import type { DevRoutesConfig } from "./dev-routes.js";
|
|
15
15
|
import type { MemoryRoutesConfig } from "./memory-routes.js";
|
|
16
16
|
import type { TriggerRegistry } from "../trigger/trigger-registry.js";
|
|
17
|
+
import type { ConversationEventEmitter } from "./conversation-event-emitter.js";
|
|
17
18
|
export interface LoadedApp {
|
|
18
19
|
readonly name: string;
|
|
19
20
|
readonly app: App;
|
|
@@ -24,6 +25,7 @@ export interface LoadedApp {
|
|
|
24
25
|
whatsappWebhookConfig?: WhatsAppWebhookConfig;
|
|
25
26
|
tenantAdminConfig?: TenantAdminRoutesConfig;
|
|
26
27
|
webChannel?: WebChannel;
|
|
28
|
+
eventEmitter?: ConversationEventEmitter;
|
|
27
29
|
}
|
|
28
30
|
export interface GatewayServerConfig {
|
|
29
31
|
readonly port: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-routes.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway-routes.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IAC5C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,wBAAwB,CAAC;CACzC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IACpC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACjD,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,cAAc,CAAC,kBAAkB,CAAC,CAAC;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;CAC1D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAyJlE"}
|
|
@@ -111,6 +111,8 @@ export function createGatewayApp(config) {
|
|
|
111
111
|
sessionRegistry: tenantRuntime.sessionRegistry,
|
|
112
112
|
tenantRegistry: tenantRuntime.tenantRegistry,
|
|
113
113
|
billing: tenantRuntime.billing,
|
|
114
|
+
eventEmitter: loadedApp.eventEmitter,
|
|
115
|
+
allowedOrigins: channel.allowedOrigins,
|
|
114
116
|
});
|
|
115
117
|
app.route(`/apps/${loadedApp.name}`, wsTenantApp);
|
|
116
118
|
}
|
|
@@ -120,6 +122,7 @@ export function createGatewayApp(config) {
|
|
|
120
122
|
webChannel: loadedApp.webChannel,
|
|
121
123
|
upgradeWebSocket: config.upgradeWebSocket,
|
|
122
124
|
validateToken: config.validateToken,
|
|
125
|
+
apiKey: runtime.apiKey,
|
|
123
126
|
processMessage: async (userId, parts) => {
|
|
124
127
|
const session = runtime.sessionRegistry.getOrCreate({
|
|
125
128
|
appName: loadedApp.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-routes.js","sourceRoot":"","sources":["../../src/gateway/gateway-routes.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAE5E,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway-routes.js","sourceRoot":"","sources":["../../src/gateway/gateway-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-server.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gateway-server.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-server.ts"],"names":[],"mappings":"AAuCA,YAAY,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAClI,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAmDD,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAygBnG;AAuID,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuF9E"}
|
|
@@ -18,6 +18,7 @@ import { HealthRegistry } from "./health-registry.js";
|
|
|
18
18
|
import { ApprovalGateRegistry } from "./approval-registry.js";
|
|
19
19
|
import { DevOrchestrator } from "./dev-orchestrator.js";
|
|
20
20
|
import { DevTokenStore } from "./dev-token-store.js";
|
|
21
|
+
import { ConversationEventEmitter } from "./conversation-event-emitter.js";
|
|
21
22
|
export { createGatewayApp } from "./gateway-routes.js";
|
|
22
23
|
export { createDevRoutes } from "./dev-routes.js";
|
|
23
24
|
export { createDevInspectorHtml } from "./dev-inspector.js";
|
|
@@ -166,6 +167,7 @@ export async function startGateway(configPath, options) {
|
|
|
166
167
|
whatsappWebhookConfig: undefined,
|
|
167
168
|
tenantAdminConfig: undefined,
|
|
168
169
|
webChannel: hasWebChannel ? new WebChannel() : undefined,
|
|
170
|
+
eventEmitter: undefined,
|
|
169
171
|
};
|
|
170
172
|
});
|
|
171
173
|
// Initialize Mode B runtimes and delegation targets in a single pass
|
|
@@ -211,6 +213,17 @@ export async function startGateway(configPath, options) {
|
|
|
211
213
|
// Register delegation target (reuse provider + systemPrompt)
|
|
212
214
|
delegationTargets.set(loaded.name, { appName: loaded.name, provider, systemPrompt });
|
|
213
215
|
const isMultiTenant = loaded.binding.channels.some((ch) => ch.multiTenant === true);
|
|
216
|
+
// Create event emitter if events config is present
|
|
217
|
+
const eventEmitter = resolved.eventsConfig
|
|
218
|
+
? new ConversationEventEmitter(resolved.eventsConfig)
|
|
219
|
+
: undefined;
|
|
220
|
+
if (eventEmitter) {
|
|
221
|
+
sessionRegistry.eventEmitter = eventEmitter;
|
|
222
|
+
loaded.eventEmitter = eventEmitter;
|
|
223
|
+
}
|
|
224
|
+
// Resolve API key from channel binding (shared across REST + WS for this app)
|
|
225
|
+
const apiChannel = loaded.binding.channels.find((ch) => ch.type === "api");
|
|
226
|
+
const resolvedApiKey = apiChannel?.apiKeyEnv ? process.env[apiChannel.apiKeyEnv] ?? undefined : undefined;
|
|
214
227
|
if (isMultiTenant) {
|
|
215
228
|
// Multi-tenant: use TenantRegistry + tenant routes
|
|
216
229
|
const tenantStorageDir = join(resolved.memoryBasePath, "tenants");
|
|
@@ -222,18 +235,22 @@ export async function startGateway(configPath, options) {
|
|
|
222
235
|
sessionRegistry,
|
|
223
236
|
tenantRegistry,
|
|
224
237
|
billing: resolved.modeBConfig.billing,
|
|
238
|
+
apiKey: resolvedApiKey,
|
|
225
239
|
};
|
|
226
240
|
// WhatsApp webhook: find whatsapp channel with verifyTokenEnv
|
|
227
241
|
const whatsappChannel = loaded.binding.channels.find((ch) => ch.type === "whatsapp");
|
|
228
242
|
if (whatsappChannel) {
|
|
229
243
|
const verifyTokenEnv = whatsappChannel.verifyTokenEnv ?? "";
|
|
244
|
+
const appSecretEnv = whatsappChannel.appSecretEnv ?? "";
|
|
230
245
|
loaded.whatsappWebhookConfig = {
|
|
231
246
|
appName: loaded.name,
|
|
232
247
|
orchestrator,
|
|
233
248
|
sessionRegistry,
|
|
234
249
|
tenantRegistry,
|
|
235
250
|
verifyToken: verifyTokenEnv ? process.env[verifyTokenEnv] ?? "" : "",
|
|
251
|
+
appSecret: appSecretEnv ? process.env[appSecretEnv] ?? undefined : undefined,
|
|
236
252
|
billing: resolved.modeBConfig.billing,
|
|
253
|
+
eventEmitter,
|
|
237
254
|
memoryBasePath: resolved.memoryBasePath,
|
|
238
255
|
};
|
|
239
256
|
}
|
|
@@ -257,9 +274,24 @@ export async function startGateway(configPath, options) {
|
|
|
257
274
|
sessionRegistry,
|
|
258
275
|
billing: resolved.modeBConfig.billing,
|
|
259
276
|
systemPrompt,
|
|
277
|
+
apiKey: resolvedApiKey,
|
|
260
278
|
};
|
|
261
279
|
}
|
|
262
280
|
}
|
|
281
|
+
// Auth warnings: notify when channels lack auth configuration
|
|
282
|
+
for (const loaded of loadedApps) {
|
|
283
|
+
for (const channel of loaded.binding.channels) {
|
|
284
|
+
if (channel.type === "api" && channel.path && !channel.apiKeyEnv) {
|
|
285
|
+
console.warn(` [warn] API channel at ${channel.path} has no apiKeyEnv -- endpoints are unauthenticated`);
|
|
286
|
+
}
|
|
287
|
+
if (channel.type === "whatsapp" && !channel.appSecretEnv) {
|
|
288
|
+
console.warn(` [warn] WhatsApp channel for ${loaded.name} has no appSecretEnv -- webhook signatures will not be verified`);
|
|
289
|
+
}
|
|
290
|
+
if (channel.multiTenant && !channel.adminTokenEnv) {
|
|
291
|
+
console.warn(` [warn] Multi-tenant app ${loaded.name} has no adminTokenEnv -- admin routes are unauthenticated`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
263
295
|
const port = options?.port ?? gatewayConfig.port;
|
|
264
296
|
const delegationRegistry = { targets: delegationTargets };
|
|
265
297
|
// Create health registry and register subsystem checkers
|