@kilnai/runtime 0.1.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/dist/a2a/a2a-client.d.ts +6 -0
- package/dist/a2a/a2a-client.d.ts.map +1 -0
- package/dist/a2a/a2a-client.js +112 -0
- package/dist/a2a/a2a-client.js.map +1 -0
- package/dist/a2a/index.d.ts +2 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +3 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/channels/api-channel.d.ts +43 -0
- package/dist/channels/api-channel.d.ts.map +1 -0
- package/dist/channels/api-channel.js +95 -0
- package/dist/channels/api-channel.js.map +1 -0
- package/dist/channels/channel-registry.d.ts +25 -0
- package/dist/channels/channel-registry.d.ts.map +1 -0
- package/dist/channels/channel-registry.js +49 -0
- package/dist/channels/channel-registry.js.map +1 -0
- package/dist/channels/channel-router.d.ts +43 -0
- package/dist/channels/channel-router.d.ts.map +1 -0
- package/dist/channels/channel-router.js +72 -0
- package/dist/channels/channel-router.js.map +1 -0
- package/dist/channels/cli-channel.d.ts +19 -0
- package/dist/channels/cli-channel.d.ts.map +1 -0
- package/dist/channels/cli-channel.js +37 -0
- package/dist/channels/cli-channel.js.map +1 -0
- package/dist/channels/event-bridge.d.ts +27 -0
- package/dist/channels/event-bridge.d.ts.map +1 -0
- package/dist/channels/event-bridge.js +83 -0
- package/dist/channels/event-bridge.js.map +1 -0
- package/dist/channels/index.d.ts +17 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +12 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/message-formatter.d.ts +4 -0
- package/dist/channels/message-formatter.d.ts.map +1 -0
- package/dist/channels/message-formatter.js +32 -0
- package/dist/channels/message-formatter.js.map +1 -0
- package/dist/channels/slack-channel.d.ts +32 -0
- package/dist/channels/slack-channel.d.ts.map +1 -0
- package/dist/channels/slack-channel.js +71 -0
- package/dist/channels/slack-channel.js.map +1 -0
- package/dist/channels/types.d.ts +27 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +12 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/channels/web-channel.d.ts +37 -0
- package/dist/channels/web-channel.d.ts.map +1 -0
- package/dist/channels/web-channel.js +112 -0
- package/dist/channels/web-channel.js.map +1 -0
- package/dist/channels/whatsapp-api.d.ts +20 -0
- package/dist/channels/whatsapp-api.d.ts.map +1 -0
- package/dist/channels/whatsapp-api.js +44 -0
- package/dist/channels/whatsapp-api.js.map +1 -0
- package/dist/channels/whatsapp-channel.d.ts +32 -0
- package/dist/channels/whatsapp-channel.d.ts.map +1 -0
- package/dist/channels/whatsapp-channel.js +85 -0
- package/dist/channels/whatsapp-channel.js.map +1 -0
- package/dist/gateway/app-resolver.d.ts +11 -0
- package/dist/gateway/app-resolver.d.ts.map +1 -0
- package/dist/gateway/app-resolver.js +36 -0
- package/dist/gateway/app-resolver.js.map +1 -0
- package/dist/gateway/approval-registry.d.ts +19 -0
- package/dist/gateway/approval-registry.d.ts.map +1 -0
- package/dist/gateway/approval-registry.js +49 -0
- package/dist/gateway/approval-registry.js.map +1 -0
- package/dist/gateway/budget-middleware.d.ts +47 -0
- package/dist/gateway/budget-middleware.d.ts.map +1 -0
- package/dist/gateway/budget-middleware.js +88 -0
- package/dist/gateway/budget-middleware.js.map +1 -0
- package/dist/gateway/config-validator.d.ts +31 -0
- package/dist/gateway/config-validator.d.ts.map +1 -0
- package/dist/gateway/config-validator.js +68 -0
- package/dist/gateway/config-validator.js.map +1 -0
- package/dist/gateway/delegation-handler.d.ts +53 -0
- package/dist/gateway/delegation-handler.d.ts.map +1 -0
- package/dist/gateway/delegation-handler.js +257 -0
- package/dist/gateway/delegation-handler.js.map +1 -0
- package/dist/gateway/delegation-routes.d.ts +7 -0
- package/dist/gateway/delegation-routes.d.ts.map +1 -0
- package/dist/gateway/delegation-routes.js +48 -0
- package/dist/gateway/delegation-routes.js.map +1 -0
- package/dist/gateway/dev-inspector.d.ts +2 -0
- package/dist/gateway/dev-inspector.d.ts.map +1 -0
- package/dist/gateway/dev-inspector.js +355 -0
- package/dist/gateway/dev-inspector.js.map +1 -0
- package/dist/gateway/dev-orchestrator.d.ts +24 -0
- package/dist/gateway/dev-orchestrator.d.ts.map +1 -0
- package/dist/gateway/dev-orchestrator.js +71 -0
- package/dist/gateway/dev-orchestrator.js.map +1 -0
- package/dist/gateway/dev-routes-types.d.ts +39 -0
- package/dist/gateway/dev-routes-types.d.ts.map +1 -0
- package/dist/gateway/dev-routes-types.js +3 -0
- package/dist/gateway/dev-routes-types.js.map +1 -0
- package/dist/gateway/dev-routes.d.ts +53 -0
- package/dist/gateway/dev-routes.d.ts.map +1 -0
- package/dist/gateway/dev-routes.js +217 -0
- package/dist/gateway/dev-routes.js.map +1 -0
- package/dist/gateway/dev-token-store.d.ts +19 -0
- package/dist/gateway/dev-token-store.d.ts.map +1 -0
- package/dist/gateway/dev-token-store.js +40 -0
- package/dist/gateway/dev-token-store.js.map +1 -0
- package/dist/gateway/gateway-routes.d.ts +46 -0
- package/dist/gateway/gateway-routes.d.ts.map +1 -0
- package/dist/gateway/gateway-routes.js +143 -0
- package/dist/gateway/gateway-routes.js.map +1 -0
- package/dist/gateway/gateway-server.d.ts +25 -0
- package/dist/gateway/gateway-server.d.ts.map +1 -0
- package/dist/gateway/gateway-server.js +736 -0
- package/dist/gateway/gateway-server.js.map +1 -0
- package/dist/gateway/health-registry.d.ts +18 -0
- package/dist/gateway/health-registry.d.ts.map +1 -0
- package/dist/gateway/health-registry.js +40 -0
- package/dist/gateway/health-registry.js.map +1 -0
- package/dist/gateway/memory-routes.d.ts +12 -0
- package/dist/gateway/memory-routes.d.ts.map +1 -0
- package/dist/gateway/memory-routes.js +32 -0
- package/dist/gateway/memory-routes.js.map +1 -0
- package/dist/gateway/mode-b-routes.d.ts +14 -0
- package/dist/gateway/mode-b-routes.d.ts.map +1 -0
- package/dist/gateway/mode-b-routes.js +96 -0
- package/dist/gateway/mode-b-routes.js.map +1 -0
- package/dist/gateway/safety-middleware.d.ts +21 -0
- package/dist/gateway/safety-middleware.d.ts.map +1 -0
- package/dist/gateway/safety-middleware.js +175 -0
- package/dist/gateway/safety-middleware.js.map +1 -0
- package/dist/gateway/security-middleware.d.ts +12 -0
- package/dist/gateway/security-middleware.d.ts.map +1 -0
- package/dist/gateway/security-middleware.js +62 -0
- package/dist/gateway/security-middleware.js.map +1 -0
- package/dist/gateway/tenant-admin-routes.d.ts +15 -0
- package/dist/gateway/tenant-admin-routes.d.ts.map +1 -0
- package/dist/gateway/tenant-admin-routes.js +148 -0
- package/dist/gateway/tenant-admin-routes.js.map +1 -0
- package/dist/gateway/tenant-routes.d.ts +15 -0
- package/dist/gateway/tenant-routes.d.ts.map +1 -0
- package/dist/gateway/tenant-routes.js +107 -0
- package/dist/gateway/tenant-routes.js.map +1 -0
- package/dist/gateway/whatsapp-webhook-routes.d.ts +15 -0
- package/dist/gateway/whatsapp-webhook-routes.d.ts.map +1 -0
- package/dist/gateway/whatsapp-webhook-routes.js +217 -0
- package/dist/gateway/whatsapp-webhook-routes.js.map +1 -0
- package/dist/gateway/ws-routes.d.ts +19 -0
- package/dist/gateway/ws-routes.d.ts.map +1 -0
- package/dist/gateway/ws-routes.js +79 -0
- package/dist/gateway/ws-routes.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +4 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/mode-b-orchestrator.d.ts +43 -0
- package/dist/session/mode-b-orchestrator.d.ts.map +1 -0
- package/dist/session/mode-b-orchestrator.js +224 -0
- package/dist/session/mode-b-orchestrator.js.map +1 -0
- package/dist/session/mode-b-session.d.ts +29 -0
- package/dist/session/mode-b-session.d.ts.map +1 -0
- package/dist/session/mode-b-session.js +50 -0
- package/dist/session/mode-b-session.js.map +1 -0
- package/dist/session/session-registry.d.ts +15 -0
- package/dist/session/session-registry.d.ts.map +1 -0
- package/dist/session/session-registry.js +60 -0
- package/dist/session/session-registry.js.map +1 -0
- package/dist/tenant/index.d.ts +3 -0
- package/dist/tenant/index.d.ts.map +1 -0
- package/dist/tenant/index.js +3 -0
- package/dist/tenant/index.js.map +1 -0
- package/dist/tenant/system-prompt-builder.d.ts +3 -0
- package/dist/tenant/system-prompt-builder.d.ts.map +1 -0
- package/dist/tenant/system-prompt-builder.js +76 -0
- package/dist/tenant/system-prompt-builder.js.map +1 -0
- package/dist/tenant/tenant-registry.d.ts +33 -0
- package/dist/tenant/tenant-registry.d.ts.map +1 -0
- package/dist/tenant/tenant-registry.js +156 -0
- package/dist/tenant/tenant-registry.js.map +1 -0
- package/dist/trigger/event-listener.d.ts +22 -0
- package/dist/trigger/event-listener.d.ts.map +1 -0
- package/dist/trigger/event-listener.js +64 -0
- package/dist/trigger/event-listener.js.map +1 -0
- package/dist/trigger/index.d.ts +10 -0
- package/dist/trigger/index.d.ts.map +1 -0
- package/dist/trigger/index.js +7 -0
- package/dist/trigger/index.js.map +1 -0
- package/dist/trigger/scheduler.d.ts +22 -0
- package/dist/trigger/scheduler.d.ts.map +1 -0
- package/dist/trigger/scheduler.js +77 -0
- package/dist/trigger/scheduler.js.map +1 -0
- package/dist/trigger/trigger-executor.d.ts +14 -0
- package/dist/trigger/trigger-executor.d.ts.map +1 -0
- package/dist/trigger/trigger-executor.js +47 -0
- package/dist/trigger/trigger-executor.js.map +1 -0
- package/dist/trigger/trigger-registry.d.ts +28 -0
- package/dist/trigger/trigger-registry.d.ts.map +1 -0
- package/dist/trigger/trigger-registry.js +118 -0
- package/dist/trigger/trigger-registry.js.map +1 -0
- package/dist/trigger/webhook-handler.d.ts +11 -0
- package/dist/trigger/webhook-handler.d.ts.map +1 -0
- package/dist/trigger/webhook-handler.js +71 -0
- package/dist/trigger/webhook-handler.js.map +1 -0
- package/dist/utils/hmac.d.ts +15 -0
- package/dist/utils/hmac.d.ts.map +1 -0
- package/dist/utils/hmac.js +27 -0
- package/dist/utils/hmac.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// TriggerRegistry: central registry for all trigger types per app
|
|
2
|
+
// Manages lifecycle: register -> start -> stop
|
|
3
|
+
import { createWebhookHandler } from "./webhook-handler.js";
|
|
4
|
+
import { EventListener } from "./event-listener.js";
|
|
5
|
+
import { Scheduler } from "./scheduler.js";
|
|
6
|
+
/** Central registry managing triggers across all apps */
|
|
7
|
+
export class TriggerRegistry {
|
|
8
|
+
config;
|
|
9
|
+
apps = new Map();
|
|
10
|
+
started = false;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
}
|
|
14
|
+
/** Register all triggers for an app */
|
|
15
|
+
registerApp(appName, triggers) {
|
|
16
|
+
const eventListener = new EventListener({
|
|
17
|
+
appName,
|
|
18
|
+
eventBus: this.config.eventBus,
|
|
19
|
+
});
|
|
20
|
+
const scheduler = new Scheduler({
|
|
21
|
+
appName,
|
|
22
|
+
eventBus: this.config.eventBus,
|
|
23
|
+
});
|
|
24
|
+
const webhookTriggers = [];
|
|
25
|
+
const eventTriggers = [];
|
|
26
|
+
const scheduleTriggers = [];
|
|
27
|
+
for (const trigger of triggers) {
|
|
28
|
+
switch (trigger.type) {
|
|
29
|
+
case "webhook":
|
|
30
|
+
webhookTriggers.push(trigger);
|
|
31
|
+
break;
|
|
32
|
+
case "event": {
|
|
33
|
+
const eventTrigger = trigger;
|
|
34
|
+
eventTriggers.push(eventTrigger);
|
|
35
|
+
eventListener.register(eventTrigger);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case "schedule": {
|
|
39
|
+
const scheduleTrigger = trigger;
|
|
40
|
+
scheduleTriggers.push(scheduleTrigger);
|
|
41
|
+
scheduler.register(scheduleTrigger);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Create webhook Hono app for this app's triggers
|
|
47
|
+
const webhookHandlerConfig = {
|
|
48
|
+
appName,
|
|
49
|
+
eventBus: this.config.eventBus,
|
|
50
|
+
};
|
|
51
|
+
const webhookApp = webhookTriggers.length > 0
|
|
52
|
+
? createWebhookHandler(webhookTriggers, webhookHandlerConfig)
|
|
53
|
+
: null;
|
|
54
|
+
this.apps.set(appName, {
|
|
55
|
+
appName,
|
|
56
|
+
webhookTriggers,
|
|
57
|
+
eventTriggers,
|
|
58
|
+
scheduleTriggers,
|
|
59
|
+
eventListener,
|
|
60
|
+
scheduler,
|
|
61
|
+
webhookApp,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** Get the webhook Hono app for an app (to mount in gateway) */
|
|
65
|
+
getWebhookApp(appName) {
|
|
66
|
+
return this.apps.get(appName)?.webhookApp ?? null;
|
|
67
|
+
}
|
|
68
|
+
/** Start all event listeners and schedulers */
|
|
69
|
+
start() {
|
|
70
|
+
if (this.started)
|
|
71
|
+
return;
|
|
72
|
+
this.started = true;
|
|
73
|
+
for (const app of this.apps.values()) {
|
|
74
|
+
app.eventListener.start();
|
|
75
|
+
app.scheduler.start();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Stop all event listeners, schedulers, and clear timers */
|
|
79
|
+
stop() {
|
|
80
|
+
for (const app of this.apps.values()) {
|
|
81
|
+
app.eventListener.stop();
|
|
82
|
+
app.scheduler.stop();
|
|
83
|
+
}
|
|
84
|
+
this.started = false;
|
|
85
|
+
}
|
|
86
|
+
/** List all registered triggers across all apps (for dev/debug) */
|
|
87
|
+
listAll() {
|
|
88
|
+
const result = [];
|
|
89
|
+
for (const app of this.apps.values()) {
|
|
90
|
+
for (const trigger of app.webhookTriggers) {
|
|
91
|
+
result.push({
|
|
92
|
+
appName: app.appName,
|
|
93
|
+
name: trigger.name,
|
|
94
|
+
type: "webhook",
|
|
95
|
+
enabled: trigger.enabled !== false,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
for (const trigger of app.eventTriggers) {
|
|
99
|
+
result.push({
|
|
100
|
+
appName: app.appName,
|
|
101
|
+
name: trigger.name,
|
|
102
|
+
type: "event",
|
|
103
|
+
enabled: trigger.enabled !== false,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
for (const trigger of app.scheduleTriggers) {
|
|
107
|
+
result.push({
|
|
108
|
+
appName: app.appName,
|
|
109
|
+
name: trigger.name,
|
|
110
|
+
type: "schedule",
|
|
111
|
+
enabled: trigger.enabled !== false,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=trigger-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-registry.js","sourceRoot":"","sources":["../../src/trigger/trigger-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import type { EventBus, WebhookTrigger } from "@kilnai/core";
|
|
3
|
+
/** Validate HMAC-SHA256 webhook signature (strips optional "sha256=" prefix) */
|
|
4
|
+
export declare function validateWebhookSignature(body: string, signature: string, secret: string): boolean;
|
|
5
|
+
export interface WebhookHandlerConfig {
|
|
6
|
+
readonly appName: string;
|
|
7
|
+
readonly eventBus: EventBus;
|
|
8
|
+
}
|
|
9
|
+
/** Create a Hono app with routes for all webhook triggers of an app */
|
|
10
|
+
export declare function createWebhookHandler(triggers: readonly WebhookTrigger[], config: WebhookHandlerConfig): Hono;
|
|
11
|
+
//# sourceMappingURL=webhook-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-handler.d.ts","sourceRoot":"","sources":["../../src/trigger/webhook-handler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAwB,MAAM,cAAc,CAAC;AAKnF,gFAAgF;AAChF,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAGT;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CAuEN"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Webhook handler: Hono route handler + HMAC-SHA256 signature validation
|
|
2
|
+
// Mounts under /webhooks/{appName}{trigger.path}
|
|
3
|
+
import { Hono } from "hono";
|
|
4
|
+
import { executeTrigger } from "./trigger-executor.js";
|
|
5
|
+
import { verifyHmacSha256 } from "../utils/hmac.js";
|
|
6
|
+
/** Validate HMAC-SHA256 webhook signature (strips optional "sha256=" prefix) */
|
|
7
|
+
export function validateWebhookSignature(body, signature, secret) {
|
|
8
|
+
const sig = signature.startsWith("sha256=") ? signature.slice(7) : signature;
|
|
9
|
+
return verifyHmacSha256(secret, body, sig);
|
|
10
|
+
}
|
|
11
|
+
/** Create a Hono app with routes for all webhook triggers of an app */
|
|
12
|
+
export function createWebhookHandler(triggers, config) {
|
|
13
|
+
const app = new Hono();
|
|
14
|
+
for (const trigger of triggers) {
|
|
15
|
+
if (trigger.enabled === false)
|
|
16
|
+
continue;
|
|
17
|
+
const method = trigger.method ?? "POST";
|
|
18
|
+
const routePath = trigger.path;
|
|
19
|
+
const handler = async (c) => {
|
|
20
|
+
const body = await c.req.text();
|
|
21
|
+
// Emit webhook_received event
|
|
22
|
+
const receivedEvent = {
|
|
23
|
+
type: "webhook_received",
|
|
24
|
+
timestamp: new Date(),
|
|
25
|
+
sessionId: `webhook-${config.appName}-${trigger.name}`,
|
|
26
|
+
path: trigger.path,
|
|
27
|
+
appName: config.appName,
|
|
28
|
+
triggerName: trigger.name,
|
|
29
|
+
method,
|
|
30
|
+
};
|
|
31
|
+
config.eventBus.emit(receivedEvent);
|
|
32
|
+
// Validate signature if secretEnv is configured
|
|
33
|
+
if (trigger.secretEnv) {
|
|
34
|
+
const secret = process.env[trigger.secretEnv];
|
|
35
|
+
if (!secret) {
|
|
36
|
+
return c.json({ error: "Webhook secret not configured" }, 500);
|
|
37
|
+
}
|
|
38
|
+
const signature = c.req.header("x-hub-signature-256") ??
|
|
39
|
+
c.req.header("x-signature-256") ??
|
|
40
|
+
c.req.header("x-webhook-signature") ??
|
|
41
|
+
"";
|
|
42
|
+
if (!signature || !validateWebhookSignature(body, signature, secret)) {
|
|
43
|
+
return c.json({ error: "Invalid signature" }, 401);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Parse payload
|
|
47
|
+
let payload = {};
|
|
48
|
+
try {
|
|
49
|
+
payload = JSON.parse(body);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Non-JSON body -- use empty payload
|
|
53
|
+
}
|
|
54
|
+
const ctx = {
|
|
55
|
+
appName: config.appName,
|
|
56
|
+
eventBus: config.eventBus,
|
|
57
|
+
sessionId: `webhook-${config.appName}-${trigger.name}-${Date.now()}`,
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
const result = executeTrigger(trigger, payload, ctx);
|
|
61
|
+
return c.json({ ok: true, team: result.team, task: result.task });
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
return c.json({ error: err instanceof Error ? err.message : "Trigger execution failed" }, 500);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
app.on(method, routePath, handler);
|
|
68
|
+
}
|
|
69
|
+
return app;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=webhook-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-handler.js","sourceRoot":"","sources":["../../src/trigger/webhook-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verify an HMAC-SHA256 signature against a payload.
|
|
3
|
+
*
|
|
4
|
+
* The caller prepares the payload string (e.g. Slack prepends "v0:{ts}:{body}").
|
|
5
|
+
* The signature may include a prefix (e.g. "sha256=" or "v0=") which is stripped
|
|
6
|
+
* by the caller before passing to this function, OR passed as-is if the caller
|
|
7
|
+
* uses `expectedPrefix` to let this function handle it.
|
|
8
|
+
*
|
|
9
|
+
* @param secret - The HMAC secret key
|
|
10
|
+
* @param payload - The already-prepared payload string to hash
|
|
11
|
+
* @param signature - The hex-encoded signature to verify against
|
|
12
|
+
* @returns true if the signature is valid
|
|
13
|
+
*/
|
|
14
|
+
export declare function verifyHmacSha256(secret: string, payload: string, signature: string): boolean;
|
|
15
|
+
//# sourceMappingURL=hmac.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmac.d.ts","sourceRoot":"","sources":["../../src/utils/hmac.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAU5F"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// HMAC-SHA256 signature verification using timing-safe comparison
|
|
2
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
3
|
+
/**
|
|
4
|
+
* Verify an HMAC-SHA256 signature against a payload.
|
|
5
|
+
*
|
|
6
|
+
* The caller prepares the payload string (e.g. Slack prepends "v0:{ts}:{body}").
|
|
7
|
+
* The signature may include a prefix (e.g. "sha256=" or "v0=") which is stripped
|
|
8
|
+
* by the caller before passing to this function, OR passed as-is if the caller
|
|
9
|
+
* uses `expectedPrefix` to let this function handle it.
|
|
10
|
+
*
|
|
11
|
+
* @param secret - The HMAC secret key
|
|
12
|
+
* @param payload - The already-prepared payload string to hash
|
|
13
|
+
* @param signature - The hex-encoded signature to verify against
|
|
14
|
+
* @returns true if the signature is valid
|
|
15
|
+
*/
|
|
16
|
+
export function verifyHmacSha256(secret, payload, signature) {
|
|
17
|
+
const expected = createHmac("sha256", secret).update(payload).digest("hex");
|
|
18
|
+
if (expected.length !== signature.length)
|
|
19
|
+
return false;
|
|
20
|
+
try {
|
|
21
|
+
return timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(signature, "hex"));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=hmac.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmac.js","sourceRoot":"","sources":["../../src/utils/hmac.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAe,EAAE,SAAiB;IACjF,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5E,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAEvD,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kilnai/runtime",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Multi-app gateway server, multi-tenant management, and channel adapters for @kilnai/core",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"import": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"typecheck": "tsc --noEmit",
|
|
20
|
+
"test": "vitest run"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/sequelcore/kiln.git",
|
|
26
|
+
"directory": "packages/runtime"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://github.com/sequelcore/kiln/tree/main/packages/runtime",
|
|
29
|
+
"keywords": [
|
|
30
|
+
"ai",
|
|
31
|
+
"gateway",
|
|
32
|
+
"multi-tenant",
|
|
33
|
+
"whatsapp",
|
|
34
|
+
"slack",
|
|
35
|
+
"channels",
|
|
36
|
+
"hono"
|
|
37
|
+
],
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"hono": "^4.7.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"@kilnai/core": "^0.1.1",
|
|
46
|
+
"@opentelemetry/api": "^1.9.0"
|
|
47
|
+
},
|
|
48
|
+
"peerDependenciesMeta": {
|
|
49
|
+
"@opentelemetry/api": {
|
|
50
|
+
"optional": true
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|