@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,6 @@
|
|
|
1
|
+
import type { AgentCard, A2ATask, A2AMessage } from "@kilnai/core";
|
|
2
|
+
export declare class A2AClient {
|
|
3
|
+
discoverAgent(agentUrl: string): Promise<AgentCard>;
|
|
4
|
+
sendTask(agentUrl: string, message: A2AMessage, timeout?: number): Promise<A2ATask>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=a2a-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-client.d.ts","sourceRoot":"","sources":["../../src/a2a/a2a-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGnE,qBAAa,SAAS;IACd,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA6CnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAyE1F"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// A2AClient: discovers remote agents via Agent Card and sends tasks
|
|
2
|
+
import { KilnError } from "@kilnai/core";
|
|
3
|
+
export class A2AClient {
|
|
4
|
+
async discoverAgent(agentUrl) {
|
|
5
|
+
const cardUrl = `${agentUrl.replace(/\/$/, "")}/.well-known/agent.json`;
|
|
6
|
+
let response;
|
|
7
|
+
try {
|
|
8
|
+
response = await fetch(cardUrl);
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
throw new KilnError("A2A_CLIENT_FAILED", `Failed to fetch agent card from ${cardUrl}: ${err}`, {
|
|
12
|
+
context: { agentUrl, cardUrl },
|
|
13
|
+
cause: err,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new KilnError("A2A_CLIENT_FAILED", `Agent card request failed with status ${response.status}`, {
|
|
18
|
+
context: { agentUrl, cardUrl, status: response.status },
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
let data;
|
|
22
|
+
try {
|
|
23
|
+
data = await response.json();
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
throw new KilnError("A2A_CLIENT_FAILED", "Failed to parse agent card JSON", {
|
|
27
|
+
context: { agentUrl, cardUrl },
|
|
28
|
+
cause: err,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (typeof data !== "object" || data === null) {
|
|
32
|
+
throw new KilnError("A2A_CLIENT_FAILED", "Agent card response is not a valid object", {
|
|
33
|
+
context: { agentUrl, cardUrl },
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const card = data;
|
|
37
|
+
if (!card.name || !card.url || !card.version || !card.capabilities) {
|
|
38
|
+
throw new KilnError("A2A_CLIENT_FAILED", "Agent card is missing required fields", {
|
|
39
|
+
context: { agentUrl, cardUrl, card },
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return card;
|
|
43
|
+
}
|
|
44
|
+
async sendTask(agentUrl, message, timeout) {
|
|
45
|
+
const endpoint = agentUrl.replace(/\/$/, "");
|
|
46
|
+
const requestBody = {
|
|
47
|
+
jsonrpc: "2.0",
|
|
48
|
+
method: "tasks/send",
|
|
49
|
+
params: { message },
|
|
50
|
+
id: crypto.randomUUID(),
|
|
51
|
+
};
|
|
52
|
+
const controller = new AbortController();
|
|
53
|
+
const timeoutId = timeout ? setTimeout(() => controller.abort(), timeout) : undefined;
|
|
54
|
+
let response;
|
|
55
|
+
try {
|
|
56
|
+
response = await fetch(endpoint, {
|
|
57
|
+
method: "POST",
|
|
58
|
+
headers: { "Content-Type": "application/json" },
|
|
59
|
+
body: JSON.stringify(requestBody),
|
|
60
|
+
signal: controller.signal,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (timeoutId)
|
|
65
|
+
clearTimeout(timeoutId);
|
|
66
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
67
|
+
throw new KilnError("A2A_CLIENT_FAILED", `Task request timed out after ${timeout}ms`, {
|
|
68
|
+
context: { agentUrl, timeout },
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
throw new KilnError("A2A_CLIENT_FAILED", `Failed to send task to ${endpoint}: ${err}`, {
|
|
72
|
+
context: { agentUrl },
|
|
73
|
+
cause: err,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (timeoutId)
|
|
77
|
+
clearTimeout(timeoutId);
|
|
78
|
+
if (!response.ok) {
|
|
79
|
+
throw new KilnError("A2A_CLIENT_FAILED", `Task request failed with status ${response.status}`, {
|
|
80
|
+
context: { agentUrl, status: response.status },
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
let data;
|
|
84
|
+
try {
|
|
85
|
+
data = await response.json();
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
throw new KilnError("A2A_CLIENT_FAILED", "Failed to parse task response JSON", {
|
|
89
|
+
context: { agentUrl },
|
|
90
|
+
cause: err,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (typeof data !== "object" || data === null) {
|
|
94
|
+
throw new KilnError("A2A_CLIENT_FAILED", "Task response is not a valid object", {
|
|
95
|
+
context: { agentUrl },
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const jsonRpc = data;
|
|
99
|
+
if (jsonRpc.error) {
|
|
100
|
+
throw new KilnError("A2A_CLIENT_FAILED", `Remote agent error: ${jsonRpc.error.message}`, {
|
|
101
|
+
context: { agentUrl, error: jsonRpc.error },
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (!jsonRpc.result) {
|
|
105
|
+
throw new KilnError("A2A_CLIENT_FAILED", "Task response missing 'result' field", {
|
|
106
|
+
context: { agentUrl, response: data },
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return jsonRpc.result;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=a2a-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-client.js","sourceRoot":"","sources":["../../src/a2a/a2a-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/a2a/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/a2a/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Channel, IncomingMessage, OutgoingMessage, EngineEvent, MessageFormat, Modality } from "@kilnai/core";
|
|
2
|
+
/** Minimal SSE writer interface (compatible with Hono and Node.js writable streams) */
|
|
3
|
+
export interface SseWriter {
|
|
4
|
+
write(data: string): void;
|
|
5
|
+
close(): void;
|
|
6
|
+
}
|
|
7
|
+
interface ApiChannelConfig {
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Channel adapter for REST API consumers with SSE streaming.
|
|
12
|
+
* receive() accepts incoming API messages and invokes the registered handler.
|
|
13
|
+
* send() queues responses for polling and broadcasts to SSE clients.
|
|
14
|
+
* stream() forwards engine events to all connected SSE clients.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ApiChannel implements Channel {
|
|
17
|
+
readonly name = "api";
|
|
18
|
+
readonly defaultFormat: MessageFormat;
|
|
19
|
+
readonly supportedModalities: readonly Modality[];
|
|
20
|
+
private readonly config;
|
|
21
|
+
private readonly responseQueue;
|
|
22
|
+
private readonly sseClients;
|
|
23
|
+
private messageHandler;
|
|
24
|
+
constructor(config?: ApiChannelConfig);
|
|
25
|
+
/** Register a handler for incoming API messages */
|
|
26
|
+
onMessage(handler: (message: IncomingMessage) => void): void;
|
|
27
|
+
receive(message: IncomingMessage): Promise<void>;
|
|
28
|
+
send(response: OutgoingMessage): Promise<void>;
|
|
29
|
+
stream(events: AsyncIterable<EngineEvent>): Promise<void>;
|
|
30
|
+
/** Add an SSE client connection */
|
|
31
|
+
addSseClient(writer: SseWriter): void;
|
|
32
|
+
/** Remove an SSE client connection */
|
|
33
|
+
removeSseClient(writer: SseWriter): void;
|
|
34
|
+
/** Number of connected SSE clients */
|
|
35
|
+
get sseClientCount(): number;
|
|
36
|
+
/** Returns and clears all queued responses (for REST polling) */
|
|
37
|
+
pollResponses(): OutgoingMessage[];
|
|
38
|
+
/** Returns true if no apiKey configured, or if key matches */
|
|
39
|
+
validateApiKey(key: string): boolean;
|
|
40
|
+
private broadcastSse;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=api-channel.d.ts.map
|
|
@@ -0,0 +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,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;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,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,OAAO,CAAC,cAAc,CAAqD;gBAE/D,MAAM,GAAE,gBAAqB;IAIzC,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,8DAA8D;IAC9D,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAOpC,OAAO,CAAC,YAAY;CASrB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// ApiChannel: wraps REST API + Server-Sent Events as a Channel adapter
|
|
2
|
+
// Supports polling via response queue and real-time streaming via SSE connections
|
|
3
|
+
import { extractText } from "@kilnai/core";
|
|
4
|
+
import { formatForChannel } from "./message-formatter.js";
|
|
5
|
+
const MAX_QUEUE_SIZE = 100;
|
|
6
|
+
/**
|
|
7
|
+
* Channel adapter for REST API consumers with SSE streaming.
|
|
8
|
+
* receive() accepts incoming API messages and invokes the registered handler.
|
|
9
|
+
* send() queues responses for polling and broadcasts to SSE clients.
|
|
10
|
+
* stream() forwards engine events to all connected SSE clients.
|
|
11
|
+
*/
|
|
12
|
+
export class ApiChannel {
|
|
13
|
+
name = "api";
|
|
14
|
+
defaultFormat = "structured";
|
|
15
|
+
supportedModalities = ["text", "image", "audio", "file"];
|
|
16
|
+
config;
|
|
17
|
+
responseQueue = [];
|
|
18
|
+
sseClients = new Set();
|
|
19
|
+
messageHandler = null;
|
|
20
|
+
constructor(config = {}) {
|
|
21
|
+
this.config = config;
|
|
22
|
+
}
|
|
23
|
+
/** Register a handler for incoming API messages */
|
|
24
|
+
onMessage(handler) {
|
|
25
|
+
this.messageHandler = handler;
|
|
26
|
+
}
|
|
27
|
+
async receive(message) {
|
|
28
|
+
if (this.messageHandler) {
|
|
29
|
+
this.messageHandler(message);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async send(response) {
|
|
33
|
+
// Bounded queue: discard oldest when full
|
|
34
|
+
if (this.responseQueue.length >= MAX_QUEUE_SIZE) {
|
|
35
|
+
this.responseQueue.shift();
|
|
36
|
+
}
|
|
37
|
+
this.responseQueue.push(response);
|
|
38
|
+
const text = extractText(response.parts);
|
|
39
|
+
const formatted = formatForChannel(text, response.format ?? this.defaultFormat);
|
|
40
|
+
const payload = `data: ${JSON.stringify({
|
|
41
|
+
type: "message",
|
|
42
|
+
content: formatted,
|
|
43
|
+
parts: response.parts,
|
|
44
|
+
target: response.target,
|
|
45
|
+
userId: response.userId,
|
|
46
|
+
threadId: response.threadId,
|
|
47
|
+
})}\n\n`;
|
|
48
|
+
this.broadcastSse(payload);
|
|
49
|
+
}
|
|
50
|
+
async stream(events) {
|
|
51
|
+
for await (const event of events) {
|
|
52
|
+
const payload = `data: ${JSON.stringify({
|
|
53
|
+
type: "event",
|
|
54
|
+
event: event.type,
|
|
55
|
+
payload: event.payload,
|
|
56
|
+
timestamp: event.timestamp,
|
|
57
|
+
})}\n\n`;
|
|
58
|
+
this.broadcastSse(payload);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Add an SSE client connection */
|
|
62
|
+
addSseClient(writer) {
|
|
63
|
+
this.sseClients.add(writer);
|
|
64
|
+
}
|
|
65
|
+
/** Remove an SSE client connection */
|
|
66
|
+
removeSseClient(writer) {
|
|
67
|
+
this.sseClients.delete(writer);
|
|
68
|
+
}
|
|
69
|
+
/** Number of connected SSE clients */
|
|
70
|
+
get sseClientCount() {
|
|
71
|
+
return this.sseClients.size;
|
|
72
|
+
}
|
|
73
|
+
/** Returns and clears all queued responses (for REST polling) */
|
|
74
|
+
pollResponses() {
|
|
75
|
+
return this.responseQueue.splice(0);
|
|
76
|
+
}
|
|
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
|
+
broadcastSse(payload) {
|
|
85
|
+
for (const client of this.sseClients) {
|
|
86
|
+
try {
|
|
87
|
+
client.write(payload);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
this.sseClients.delete(client);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=api-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-channel.js","sourceRoot":"","sources":["../../src/channels/api-channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Channel, OutgoingMessage, EngineEvent } from "@kilnai/core";
|
|
2
|
+
/**
|
|
3
|
+
* Registry for managing multiple Channel instances.
|
|
4
|
+
* Provides broadcast (send to all) and targeted (send to one) delivery.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ChannelRegistry {
|
|
7
|
+
private readonly channels;
|
|
8
|
+
/** Register a channel adapter */
|
|
9
|
+
register(channel: Channel): void;
|
|
10
|
+
/** Unregister a channel by name */
|
|
11
|
+
unregister(name: string): boolean;
|
|
12
|
+
/** Get a specific channel by name */
|
|
13
|
+
get(name: string): Channel | undefined;
|
|
14
|
+
/** Get all registered channels */
|
|
15
|
+
getAll(): readonly Channel[];
|
|
16
|
+
/** Number of registered channels */
|
|
17
|
+
get size(): number;
|
|
18
|
+
/** Send a response to a specific channel by name */
|
|
19
|
+
sendTo(name: string, message: OutgoingMessage): Promise<boolean>;
|
|
20
|
+
/** Broadcast a response to all registered channels */
|
|
21
|
+
broadcast(message: OutgoingMessage): Promise<void>;
|
|
22
|
+
/** Start streaming events to a specific channel */
|
|
23
|
+
streamTo(name: string, events: AsyncIterable<EngineEvent>): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=channel-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-registry.d.ts","sourceRoot":"","sources":["../../src/channels/channel-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1E;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIhC,mCAAmC;IACnC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,qCAAqC;IACrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAItC,kCAAkC;IAClC,MAAM,IAAI,SAAS,OAAO,EAAE;IAI5B,oCAAoC;IACpC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,oDAAoD;IAC9C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtE,sDAAsD;IAChD,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD,mDAAmD;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAKhF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// ChannelRegistry: manages multiple Channel instances for multi-channel apps
|
|
2
|
+
/**
|
|
3
|
+
* Registry for managing multiple Channel instances.
|
|
4
|
+
* Provides broadcast (send to all) and targeted (send to one) delivery.
|
|
5
|
+
*/
|
|
6
|
+
export class ChannelRegistry {
|
|
7
|
+
channels = new Map();
|
|
8
|
+
/** Register a channel adapter */
|
|
9
|
+
register(channel) {
|
|
10
|
+
this.channels.set(channel.name, channel);
|
|
11
|
+
}
|
|
12
|
+
/** Unregister a channel by name */
|
|
13
|
+
unregister(name) {
|
|
14
|
+
return this.channels.delete(name);
|
|
15
|
+
}
|
|
16
|
+
/** Get a specific channel by name */
|
|
17
|
+
get(name) {
|
|
18
|
+
return this.channels.get(name);
|
|
19
|
+
}
|
|
20
|
+
/** Get all registered channels */
|
|
21
|
+
getAll() {
|
|
22
|
+
return [...this.channels.values()];
|
|
23
|
+
}
|
|
24
|
+
/** Number of registered channels */
|
|
25
|
+
get size() {
|
|
26
|
+
return this.channels.size;
|
|
27
|
+
}
|
|
28
|
+
/** Send a response to a specific channel by name */
|
|
29
|
+
async sendTo(name, message) {
|
|
30
|
+
const channel = this.channels.get(name);
|
|
31
|
+
if (!channel)
|
|
32
|
+
return false;
|
|
33
|
+
await channel.send(message);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
/** Broadcast a response to all registered channels */
|
|
37
|
+
async broadcast(message) {
|
|
38
|
+
const sends = [...this.channels.values()].map((ch) => ch.send(message));
|
|
39
|
+
await Promise.allSettled(sends);
|
|
40
|
+
}
|
|
41
|
+
/** Start streaming events to a specific channel */
|
|
42
|
+
async streamTo(name, events) {
|
|
43
|
+
const channel = this.channels.get(name);
|
|
44
|
+
if (!channel)
|
|
45
|
+
return;
|
|
46
|
+
await channel.stream(events);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=channel-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-registry.js","sourceRoot":"","sources":["../../src/channels/channel-registry.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAI7E;;;GAGG;AACH,MAAM,OAAO,eAAe;IACT,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEvD,iCAAiC;IACjC,QAAQ,CAAC,OAAgB;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,mCAAmC;IACnC,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,qCAAqC;IACrC,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,kCAAkC;IAClC,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,oCAAoC;IACpC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,OAAwB;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,SAAS,CAAC,OAAwB;QACtC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACxE,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,MAAkC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { IncomingMessage, OutgoingMessage } from "@kilnai/core";
|
|
2
|
+
import type { IdentityResolver } from "./types.js";
|
|
3
|
+
import type { ChannelRegistry } from "./channel-registry.js";
|
|
4
|
+
/** Result of routing an incoming message */
|
|
5
|
+
export interface RouteResult {
|
|
6
|
+
readonly team: string;
|
|
7
|
+
readonly engineUserId: string | null;
|
|
8
|
+
readonly channelName: string;
|
|
9
|
+
readonly message: IncomingMessage;
|
|
10
|
+
}
|
|
11
|
+
/** Router rules for pattern-based team selection */
|
|
12
|
+
export interface ChannelRouterRule {
|
|
13
|
+
readonly match: RegExp;
|
|
14
|
+
readonly team: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Routes incoming channel messages through identity resolution and pattern matching.
|
|
18
|
+
*
|
|
19
|
+
* Flow: IncomingMessage -> IdentityResolver -> pattern rules -> fallback team
|
|
20
|
+
*
|
|
21
|
+
* After routing, the message can be dispatched to the correct team for processing,
|
|
22
|
+
* and the response sent back through the originating channel.
|
|
23
|
+
*/
|
|
24
|
+
export declare class ChannelRouter {
|
|
25
|
+
private readonly rules;
|
|
26
|
+
private readonly fallbackTeam;
|
|
27
|
+
private readonly identityResolver;
|
|
28
|
+
private readonly registry;
|
|
29
|
+
private routeHandler;
|
|
30
|
+
constructor(options: {
|
|
31
|
+
rules?: ChannelRouterRule[];
|
|
32
|
+
fallbackTeam: string;
|
|
33
|
+
identityResolver?: IdentityResolver;
|
|
34
|
+
registry: ChannelRegistry;
|
|
35
|
+
});
|
|
36
|
+
/** Register a handler that processes routed messages and returns a response */
|
|
37
|
+
onRoute(handler: (result: RouteResult) => Promise<OutgoingMessage | null>): void;
|
|
38
|
+
/** Route an incoming message from a named channel */
|
|
39
|
+
route(channelName: string, message: IncomingMessage): Promise<RouteResult>;
|
|
40
|
+
/** Resolve team name for a message content string */
|
|
41
|
+
resolveTeam(content: string): string;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=channel-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-router.d.ts","sourceRoot":"","sources":["../../src/channels/channel-router.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CACnC;AAED,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,YAAY,CAA2E;gBAEnF,OAAO,EAAE;QACnB,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACpC,QAAQ,EAAE,eAAe,CAAC;KAC3B;IAOD,+EAA+E;IAC/E,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,IAAI;IAIhF,qDAAqD;IAC/C,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAsChF,qDAAqD;IACrD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAQrC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// ChannelRouter: routes incoming channel messages to teams via Router composite
|
|
2
|
+
// Bridges Channel.receive() -> IdentityResolver -> Router pattern matching -> Team dispatch
|
|
3
|
+
import { extractText } from "@kilnai/core";
|
|
4
|
+
/**
|
|
5
|
+
* Routes incoming channel messages through identity resolution and pattern matching.
|
|
6
|
+
*
|
|
7
|
+
* Flow: IncomingMessage -> IdentityResolver -> pattern rules -> fallback team
|
|
8
|
+
*
|
|
9
|
+
* After routing, the message can be dispatched to the correct team for processing,
|
|
10
|
+
* and the response sent back through the originating channel.
|
|
11
|
+
*/
|
|
12
|
+
export class ChannelRouter {
|
|
13
|
+
rules;
|
|
14
|
+
fallbackTeam;
|
|
15
|
+
identityResolver;
|
|
16
|
+
registry;
|
|
17
|
+
routeHandler = null;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.rules = options.rules ?? [];
|
|
20
|
+
this.fallbackTeam = options.fallbackTeam;
|
|
21
|
+
this.identityResolver = options.identityResolver ?? null;
|
|
22
|
+
this.registry = options.registry;
|
|
23
|
+
}
|
|
24
|
+
/** Register a handler that processes routed messages and returns a response */
|
|
25
|
+
onRoute(handler) {
|
|
26
|
+
this.routeHandler = handler;
|
|
27
|
+
}
|
|
28
|
+
/** Route an incoming message from a named channel */
|
|
29
|
+
async route(channelName, message) {
|
|
30
|
+
// 1. Resolve identity
|
|
31
|
+
let engineUserId = null;
|
|
32
|
+
if (this.identityResolver && message.userId) {
|
|
33
|
+
engineUserId = await this.identityResolver.resolve(channelName, message.userId);
|
|
34
|
+
}
|
|
35
|
+
// 2. Match pattern rules against message text content
|
|
36
|
+
const text = extractText(message.parts);
|
|
37
|
+
let team = this.fallbackTeam;
|
|
38
|
+
for (const rule of this.rules) {
|
|
39
|
+
if (rule.match.test(text)) {
|
|
40
|
+
team = rule.team;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const result = {
|
|
45
|
+
team,
|
|
46
|
+
engineUserId,
|
|
47
|
+
channelName,
|
|
48
|
+
message,
|
|
49
|
+
};
|
|
50
|
+
// 3. Dispatch to handler and send response back
|
|
51
|
+
if (this.routeHandler) {
|
|
52
|
+
const response = await this.routeHandler(result);
|
|
53
|
+
if (response) {
|
|
54
|
+
const channel = this.registry.get(channelName);
|
|
55
|
+
if (channel) {
|
|
56
|
+
await channel.send(response);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
/** Resolve team name for a message content string */
|
|
63
|
+
resolveTeam(content) {
|
|
64
|
+
for (const rule of this.rules) {
|
|
65
|
+
if (rule.match.test(content)) {
|
|
66
|
+
return rule.team;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return this.fallbackTeam;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=channel-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-router.js","sourceRoot":"","sources":["../../src/channels/channel-router.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4FAA4F;AAG5F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAkB3C;;;;;;;GAOG;AACH,MAAM,OAAO,aAAa;IACP,KAAK,CAAsB;IAC3B,YAAY,CAAS;IACrB,gBAAgB,CAA0B;IAC1C,QAAQ,CAAkB;IACnC,YAAY,GAAsE,IAAI,CAAC;IAE/F,YAAY,OAKX;QACC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACzD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,+EAA+E;IAC/E,OAAO,CAAC,OAAiE;QACvE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAC9B,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,OAAwB;QACvD,sBAAsB;QACtB,IAAI,YAAY,GAAkB,IAAI,CAAC;QACvC,IAAI,IAAI,CAAC,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC5C,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAClF,CAAC;QAED,sDAAsD;QACtD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAgB;YAC1B,IAAI;YACJ,YAAY;YACZ,WAAW;YACX,OAAO;SACR,CAAC;QAEF,gDAAgD;QAChD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC/C,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qDAAqD;IACrD,WAAW,CAAC,OAAe;QACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Channel, IncomingMessage, OutgoingMessage, EngineEvent, MessageFormat, Modality } from "@kilnai/core";
|
|
2
|
+
/**
|
|
3
|
+
* Channel adapter for CLI stdin/stdout.
|
|
4
|
+
* receive() stores the message for the orchestrator to consume.
|
|
5
|
+
* send() writes formatted output to stdout/stderr.
|
|
6
|
+
* stream() writes each event as a formatted line to stdout.
|
|
7
|
+
*/
|
|
8
|
+
export declare class CliChannel implements Channel {
|
|
9
|
+
readonly name = "cli";
|
|
10
|
+
readonly defaultFormat: MessageFormat;
|
|
11
|
+
readonly supportedModalities: readonly Modality[];
|
|
12
|
+
private messageHandler;
|
|
13
|
+
/** Register a handler for incoming messages (from stdin) */
|
|
14
|
+
onMessage(handler: (message: IncomingMessage) => void): void;
|
|
15
|
+
receive(message: IncomingMessage): Promise<void>;
|
|
16
|
+
send(response: OutgoingMessage): Promise<void>;
|
|
17
|
+
stream(events: AsyncIterable<EngineEvent>): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=cli-channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-channel.d.ts","sourceRoot":"","sources":["../../src/channels/cli-channel.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAIpH;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,OAAO;IACxC,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAU;IAC/C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,QAAQ,EAAE,CAAY;IAE7D,OAAO,CAAC,cAAc,CAAqD;IAE3E,4DAA4D;IAC5D,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;IAM9C,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAMhE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// CliChannel: wraps stdin/stdout as a Channel adapter
|
|
2
|
+
// Formalizes the existing run.ts console output as a Channel implementation
|
|
3
|
+
import { extractText } from "@kilnai/core";
|
|
4
|
+
import { formatForChannel } from "./message-formatter.js";
|
|
5
|
+
/**
|
|
6
|
+
* Channel adapter for CLI stdin/stdout.
|
|
7
|
+
* receive() stores the message for the orchestrator to consume.
|
|
8
|
+
* send() writes formatted output to stdout/stderr.
|
|
9
|
+
* stream() writes each event as a formatted line to stdout.
|
|
10
|
+
*/
|
|
11
|
+
export class CliChannel {
|
|
12
|
+
name = "cli";
|
|
13
|
+
defaultFormat = "full";
|
|
14
|
+
supportedModalities = ["text"];
|
|
15
|
+
messageHandler = null;
|
|
16
|
+
/** Register a handler for incoming messages (from stdin) */
|
|
17
|
+
onMessage(handler) {
|
|
18
|
+
this.messageHandler = handler;
|
|
19
|
+
}
|
|
20
|
+
async receive(message) {
|
|
21
|
+
if (this.messageHandler) {
|
|
22
|
+
this.messageHandler(message);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async send(response) {
|
|
26
|
+
const text = extractText(response.parts);
|
|
27
|
+
const formatted = formatForChannel(text, response.format ?? this.defaultFormat);
|
|
28
|
+
process.stdout.write(formatted + "\n");
|
|
29
|
+
}
|
|
30
|
+
async stream(events) {
|
|
31
|
+
for await (const event of events) {
|
|
32
|
+
const line = `[${event.type}] ${JSON.stringify(event.payload)}`;
|
|
33
|
+
process.stdout.write(line + "\n");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cli-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-channel.js","sourceRoot":"","sources":["../../src/channels/cli-channel.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,4EAA4E;AAG5E,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IACZ,IAAI,GAAG,KAAK,CAAC;IACb,aAAa,GAAkB,MAAM,CAAC;IACtC,mBAAmB,GAAwB,CAAC,MAAM,CAAC,CAAC;IAErD,cAAc,GAAgD,IAAI,CAAC;IAE3E,4DAA4D;IAC5D,SAAS,CAAC,OAA2C;QACnD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAyB;QAClC,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC;QAChF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAkC;QAC7C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { KilnEvent, EventBus, StreamLevel } from "@kilnai/core";
|
|
2
|
+
import type { EngineEvent } from "@kilnai/core";
|
|
3
|
+
/** Convert a KilnEvent to an EngineEvent for channel consumption */
|
|
4
|
+
export declare function toEngineEvent(event: KilnEvent): EngineEvent;
|
|
5
|
+
/**
|
|
6
|
+
* Bridge between EventBus (synchronous push) and Channel.stream() (AsyncIterable pull).
|
|
7
|
+
* Subscribes to EventBus.onAny(), converts events, and yields them as an async generator.
|
|
8
|
+
* Bounded queue prevents unbounded memory growth if consumer is slower than producer.
|
|
9
|
+
*/
|
|
10
|
+
export declare class EventBridge {
|
|
11
|
+
private readonly queue;
|
|
12
|
+
private readonly maxQueueSize;
|
|
13
|
+
private resolve;
|
|
14
|
+
private done;
|
|
15
|
+
private unsubscribe;
|
|
16
|
+
constructor(maxQueueSize?: number);
|
|
17
|
+
/**
|
|
18
|
+
* Subscribe to an EventBus and start bridging events.
|
|
19
|
+
* If level is provided, only events matching that level or coarser are bridged.
|
|
20
|
+
*/
|
|
21
|
+
connect(eventBus: EventBus, level?: StreamLevel): void;
|
|
22
|
+
/** Stop bridging and signal the async generator to complete */
|
|
23
|
+
disconnect(): void;
|
|
24
|
+
/** Async generator that yields EngineEvents as they arrive */
|
|
25
|
+
events(): AsyncGenerator<EngineEvent>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=event-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bridge.d.ts","sourceRoot":"","sources":["../../src/channels/event-bridge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAO3D;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,WAAW,CAA6B;gBAEpC,YAAY,SAAO;IAI/B;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI;IA2BtD,+DAA+D;IAC/D,UAAU,IAAI,IAAI;IAalB,8DAA8D;IACvD,MAAM,IAAI,cAAc,CAAC,WAAW,CAAC;CAY7C"}
|