@mono-agent/webhook-adapter 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # @mono-agent/webhook-adapter
2
+
3
+ ## Category
4
+
5
+ Category: `communication`
6
+
7
+ ## Responsibility
8
+
9
+ HTTP webhook invocation adapter for agent hosts. It starts a small HTTP server, validates JSON invocation requests, maps them into structural `AgentResponder` calls, and returns either a synchronous result or an in-memory async request status.
10
+
11
+ ## Install / Usage
12
+
13
+ ```bash
14
+ pnpm --filter @mono-agent/webhook-adapter run build
15
+ ```
16
+
17
+ ```ts
18
+ import { startWebhookAdapter } from "@mono-agent/webhook-adapter";
19
+
20
+ const webhook = await startWebhookAdapter({
21
+ host: "127.0.0.1",
22
+ port: 4310,
23
+ path: "/webhook/invoke",
24
+ responder,
25
+ });
26
+ ```
27
+
28
+ Send a sync invocation:
29
+
30
+ ```bash
31
+ curl -X POST "$WEBHOOK_URL/webhook/invoke" \
32
+ -H 'content-type: application/json' \
33
+ -d '{"text":"Run the agent","conversationId":"demo","mode":"sync"}'
34
+ ```
35
+
36
+ Async mode returns `202` with `requestId` and `statusUrl`; status is process-local memory and is not durable across restarts.
37
+
38
+ ## Public API
39
+
40
+ - `startWebhookAdapter`
41
+ - `WebhookAdapterError`
42
+ - `loadWebhookAdapterConfig`
43
+ - `redactWebhookAdapterConfig`
44
+ - `webhookFieldGroup`
45
+ - Webhook adapter, config, request metadata, invocation status, and logger types
46
+
47
+ ## Dependency Boundary
48
+
49
+ This adapter depends on Express plus shared contracts/settings primitives. It must not depend on the agent harness, runtime adapter, operator surfaces, memory, observability, other communication adapters, or host/demo code. Hosts compose it with a structural responder.
50
+
51
+ ## What This Package Does Not Own
52
+
53
+ It does not build prompts, run models, persist async status, authenticate external webhook providers, manage TLS, expose an operator UI, or own core core agent settings. The adapter binds to loopback by default; public deployment safety is host or reverse-proxy responsibility.
54
+
55
+ ## Verification
56
+
57
+ ```bash
58
+ pnpm --filter @mono-agent/webhook-adapter run build
59
+ pnpm --filter @mono-agent/webhook-adapter run typecheck
60
+ pnpm --filter @mono-agent/webhook-adapter run test
61
+ ```
@@ -0,0 +1,22 @@
1
+ import type { FieldGroup, SettingsJson } from "@mono-agent/settings";
2
+ import { type WebhookInvocationMode } from "./server.js";
3
+ export interface WebhookAdapterConfig {
4
+ readonly enabled: boolean;
5
+ readonly host: string;
6
+ readonly port: number;
7
+ readonly path: string;
8
+ readonly allowNonLoopback: boolean;
9
+ readonly defaultMode: WebhookInvocationMode;
10
+ readonly retentionMs: number;
11
+ readonly maxStoredRequests: number;
12
+ }
13
+ export type RedactedWebhookAdapterConfig = WebhookAdapterConfig;
14
+ export interface LoadWebhookAdapterConfigInput {
15
+ readonly env: Record<string, string | undefined>;
16
+ readonly json?: SettingsJson;
17
+ readonly jsonPath?: string;
18
+ }
19
+ export declare const webhookFieldGroup: FieldGroup;
20
+ export declare function loadWebhookAdapterConfig(input: LoadWebhookAdapterConfigInput): Promise<WebhookAdapterConfig>;
21
+ export declare function redactWebhookAdapterConfig(config: WebhookAdapterConfig): RedactedWebhookAdapterConfig;
22
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,MAAM,4BAA4B,GAAG,oBAAoB,CAAC;AAEhE,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAeD,eAAO,MAAM,iBAAiB,EAAE,UA6E9B,CAAC;AAEH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,oBAAoB,CAAC,CAa/B;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,oBAAoB,GAAG,4BAA4B,CAErG"}
package/dist/config.js ADDED
@@ -0,0 +1,120 @@
1
+ import { defineFieldGroup, layerJsonOntoEnv, readBoolean, readChoice, readInteger, readJsonSection, readSettingsJson, readString, } from "@mono-agent/settings";
2
+ import { WebhookAdapterError } from "./server.js";
3
+ const DEFAULT_ENABLED = false;
4
+ const DEFAULT_HOST = "127.0.0.1";
5
+ const DEFAULT_PORT = 0;
6
+ const DEFAULT_PATH = "/webhook/invoke";
7
+ const DEFAULT_MODE = "sync";
8
+ const DEFAULT_RETENTION_MS = 300_000;
9
+ const DEFAULT_MAX_STORED_REQUESTS = 100;
10
+ const WEBHOOK_MODES = ["sync", "async"];
11
+ const invalidConfig = (message, details) => new WebhookAdapterError("invalid_config", message, details);
12
+ export const webhookFieldGroup = defineFieldGroup({
13
+ id: "webhook",
14
+ label: "Webhook",
15
+ description: "Optional HTTP webhook invocation adapter configuration.",
16
+ fields: [
17
+ {
18
+ id: "webhook.enabled",
19
+ label: "Enable webhook",
20
+ description: "Expose an HTTP endpoint that can invoke the configured agent.",
21
+ kind: "switch",
22
+ path: ["webhook", "enabled"],
23
+ },
24
+ {
25
+ id: "webhook.host",
26
+ label: "Host",
27
+ description: "Bind host. Defaults to 127.0.0.1.",
28
+ kind: "string",
29
+ placeholder: "127.0.0.1",
30
+ path: ["webhook", "host"],
31
+ },
32
+ {
33
+ id: "webhook.port",
34
+ label: "Port",
35
+ description: "Bind port. Use 0 to choose a free loopback port.",
36
+ kind: "integer",
37
+ min: 0,
38
+ max: 65535,
39
+ placeholder: "0",
40
+ path: ["webhook", "port"],
41
+ },
42
+ {
43
+ id: "webhook.path",
44
+ label: "Path",
45
+ description: "POST path for agent invocation.",
46
+ kind: "string",
47
+ placeholder: "/webhook/invoke",
48
+ path: ["webhook", "path"],
49
+ },
50
+ {
51
+ id: "webhook.allowNonLoopback",
52
+ label: "Allow non-loopback",
53
+ description: "Explicitly allow public/non-loopback binding.",
54
+ kind: "switch",
55
+ path: ["webhook", "allowNonLoopback"],
56
+ },
57
+ {
58
+ id: "webhook.defaultMode",
59
+ label: "Default mode",
60
+ description: "Invocation mode used when the request body omits mode.",
61
+ kind: "select",
62
+ options: [
63
+ { value: "sync", label: "sync" },
64
+ { value: "async", label: "async" },
65
+ ],
66
+ path: ["webhook", "defaultMode"],
67
+ },
68
+ {
69
+ id: "webhook.retentionMs",
70
+ label: "Status retention",
71
+ description: "How long async request status remains in memory.",
72
+ kind: "integer",
73
+ min: 1,
74
+ max: 86_400_000,
75
+ placeholder: "300000",
76
+ path: ["webhook", "retentionMs"],
77
+ },
78
+ {
79
+ id: "webhook.maxStoredRequests",
80
+ label: "Max stored requests",
81
+ description: "Maximum number of in-memory async statuses to retain.",
82
+ kind: "integer",
83
+ min: 1,
84
+ max: 10_000,
85
+ placeholder: "100",
86
+ path: ["webhook", "maxStoredRequests"],
87
+ },
88
+ ],
89
+ });
90
+ export async function loadWebhookAdapterConfig(input) {
91
+ const json = input.json ?? (input.jsonPath === undefined ? {} : (await readSettingsJson(input.jsonPath)).json);
92
+ const env = layerWebhookJsonOntoEnv(json, input.env);
93
+ return {
94
+ enabled: readBoolean(env.MONO_AGENT_WEBHOOK_ENABLED, "MONO_AGENT_WEBHOOK_ENABLED", DEFAULT_ENABLED, invalidConfig),
95
+ host: readString(env.MONO_AGENT_WEBHOOK_HOST, DEFAULT_HOST),
96
+ port: readInteger(env.MONO_AGENT_WEBHOOK_PORT, "MONO_AGENT_WEBHOOK_PORT", DEFAULT_PORT, invalidConfig, { min: 0, max: 65535 }),
97
+ path: readString(env.MONO_AGENT_WEBHOOK_PATH, DEFAULT_PATH),
98
+ allowNonLoopback: readBoolean(env.MONO_AGENT_WEBHOOK_ALLOW_NON_LOOPBACK, "MONO_AGENT_WEBHOOK_ALLOW_NON_LOOPBACK", false, invalidConfig),
99
+ defaultMode: readChoice(env.MONO_AGENT_WEBHOOK_DEFAULT_MODE, "MONO_AGENT_WEBHOOK_DEFAULT_MODE", WEBHOOK_MODES, DEFAULT_MODE, invalidConfig),
100
+ retentionMs: readInteger(env.MONO_AGENT_WEBHOOK_RETENTION_MS, "MONO_AGENT_WEBHOOK_RETENTION_MS", DEFAULT_RETENTION_MS, invalidConfig, { min: 1, max: 86_400_000 }),
101
+ maxStoredRequests: readInteger(env.MONO_AGENT_WEBHOOK_MAX_STORED_REQUESTS, "MONO_AGENT_WEBHOOK_MAX_STORED_REQUESTS", DEFAULT_MAX_STORED_REQUESTS, invalidConfig, { min: 1, max: 10_000 }),
102
+ };
103
+ }
104
+ export function redactWebhookAdapterConfig(config) {
105
+ return { ...config };
106
+ }
107
+ function layerWebhookJsonOntoEnv(json, env) {
108
+ const section = readJsonSection(json, "webhook");
109
+ return layerJsonOntoEnv(env, [
110
+ { env: "MONO_AGENT_WEBHOOK_ENABLED", value: section.enabled, kind: "boolean" },
111
+ { env: "MONO_AGENT_WEBHOOK_HOST", value: section.host },
112
+ { env: "MONO_AGENT_WEBHOOK_PORT", value: section.port, kind: "integer" },
113
+ { env: "MONO_AGENT_WEBHOOK_PATH", value: section.path },
114
+ { env: "MONO_AGENT_WEBHOOK_ALLOW_NON_LOOPBACK", value: section.allowNonLoopback, kind: "boolean" },
115
+ { env: "MONO_AGENT_WEBHOOK_DEFAULT_MODE", value: section.defaultMode },
116
+ { env: "MONO_AGENT_WEBHOOK_RETENTION_MS", value: section.retentionMs, kind: "integer" },
117
+ { env: "MONO_AGENT_WEBHOOK_MAX_STORED_REQUESTS", value: section.maxStoredRequests, kind: "integer" },
118
+ ]);
119
+ }
120
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { startWebhookAdapter, WebhookAdapterError, } from "./server.js";
2
+ export type { WebhookAdapterErrorCode, WebhookAdapterErrorDetails, WebhookAdapterLogger, WebhookAdapterOptions, WebhookAdapterStartResult, WebhookBusyResponse, WebhookInvocationMode, WebhookInvocationRequest, WebhookInvocationStatus, WebhookRequestMetadata, } from "./server.js";
3
+ export { loadWebhookAdapterConfig, redactWebhookAdapterConfig, webhookFieldGroup, } from "./config.js";
4
+ export type { LoadWebhookAdapterConfigInput, RedactedWebhookAdapterConfig, WebhookAdapterConfig, } from "./config.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,uBAAuB,EACvB,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,6BAA6B,EAC7B,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { startWebhookAdapter, WebhookAdapterError, } from "./server.js";
2
+ export { loadWebhookAdapterConfig, redactWebhookAdapterConfig, webhookFieldGroup, } from "./config.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAcrB,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { type AgentMessageStream, type AgentRequestBase, type AgentResponder, type AgentResponse } from "@mono-agent/agent-contracts";
2
+ export type WebhookInvocationMode = "sync" | "async";
3
+ export interface WebhookRequestMetadata {
4
+ readonly requestId: string;
5
+ readonly mode: WebhookInvocationMode;
6
+ readonly method: string;
7
+ readonly path: string;
8
+ readonly receivedAt: string;
9
+ readonly remoteAddress?: string;
10
+ readonly headers: Record<string, string | string[] | undefined>;
11
+ readonly payloadMetadata?: unknown;
12
+ }
13
+ export interface WebhookInvocationRequest extends AgentRequestBase {
14
+ readonly conversationId: string;
15
+ readonly text: string;
16
+ readonly abortSignal: AbortSignal;
17
+ readonly metadata: {
18
+ readonly webhook: WebhookRequestMetadata;
19
+ readonly [key: string]: unknown;
20
+ };
21
+ }
22
+ export type WebhookInvocationStatus = {
23
+ readonly status: "accepted" | "running";
24
+ readonly requestId: string;
25
+ readonly conversationId: string;
26
+ readonly statusUrl: string;
27
+ readonly receivedAt: string;
28
+ readonly startedAt?: string;
29
+ } | {
30
+ readonly status: "succeeded";
31
+ readonly requestId: string;
32
+ readonly conversationId: string;
33
+ readonly statusUrl: string;
34
+ readonly receivedAt: string;
35
+ readonly startedAt: string;
36
+ readonly completedAt: string;
37
+ readonly text?: string;
38
+ readonly metadata?: Record<string, unknown>;
39
+ } | {
40
+ readonly status: "failed" | "cancelled";
41
+ readonly requestId: string;
42
+ readonly conversationId: string;
43
+ readonly statusUrl: string;
44
+ readonly receivedAt: string;
45
+ readonly startedAt: string;
46
+ readonly completedAt: string;
47
+ readonly error: string;
48
+ };
49
+ /**
50
+ * Transport-only 409 response shape. Unlike {@link WebhookInvocationStatus},
51
+ * a busy result is never stored or replayed via the status endpoint, so it is
52
+ * kept out of the persisted status union.
53
+ */
54
+ export interface WebhookBusyResponse {
55
+ readonly status: "busy";
56
+ readonly requestId: string;
57
+ readonly conversationId: string;
58
+ readonly error: string;
59
+ }
60
+ export interface WebhookAdapterLogger {
61
+ debug?(message: string, metadata?: Record<string, unknown>): void;
62
+ info?(message: string, metadata?: Record<string, unknown>): void;
63
+ warn?(message: string, metadata?: Record<string, unknown>): void;
64
+ error?(message: string, metadata?: Record<string, unknown>): void;
65
+ }
66
+ export interface WebhookAdapterOptions {
67
+ readonly host?: string;
68
+ readonly port?: number;
69
+ readonly path?: string;
70
+ readonly allowNonLoopback?: boolean;
71
+ readonly defaultMode?: WebhookInvocationMode;
72
+ readonly retentionMs?: number;
73
+ readonly maxStoredRequests?: number;
74
+ readonly responder: AgentResponder<WebhookInvocationRequest, AgentMessageStream, AgentResponse>;
75
+ readonly logger?: WebhookAdapterLogger;
76
+ }
77
+ export interface WebhookAdapterStartResult {
78
+ readonly url: string;
79
+ readonly invokeUrl: string;
80
+ readonly statusBasePath: string;
81
+ readonly host: string;
82
+ readonly port: number;
83
+ readonly activeRequestCount: number;
84
+ getStatus(requestId: string): WebhookInvocationStatus | undefined;
85
+ stop(): Promise<void>;
86
+ }
87
+ export type WebhookAdapterErrorCode = "invalid_config" | "missing_required_config" | "unsafe_host" | "start_failed";
88
+ export interface WebhookAdapterErrorDetails {
89
+ readonly code?: WebhookAdapterErrorCode;
90
+ readonly reason?: string;
91
+ readonly [key: string]: unknown;
92
+ }
93
+ export declare class WebhookAdapterError extends Error {
94
+ readonly code: WebhookAdapterErrorCode;
95
+ readonly details: WebhookAdapterErrorDetails;
96
+ constructor(code: WebhookAdapterErrorCode, message: string, details?: WebhookAdapterErrorDetails);
97
+ }
98
+ export declare function startWebhookAdapter(options: WebhookAdapterOptions): Promise<WebhookAdapterStartResult>;
99
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/dist/server.js ADDED
@@ -0,0 +1,296 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { dirname } from "node:path/posix";
4
+ import { BufferedMessageStream, isAgentResponseCancelledError, } from "@mono-agent/agent-contracts";
5
+ import { assertSafeBind, close, hostForUrl, listen, } from "@mono-agent/settings";
6
+ import express, {} from "express";
7
+ export class WebhookAdapterError extends Error {
8
+ code;
9
+ details;
10
+ constructor(code, message, details = {}) {
11
+ super(message);
12
+ this.name = "WebhookAdapterError";
13
+ this.code = code;
14
+ this.details = { ...details, code };
15
+ }
16
+ }
17
+ const DEFAULT_HOST = "127.0.0.1";
18
+ const DEFAULT_PORT = 0;
19
+ const DEFAULT_PATH = "/webhook/invoke";
20
+ const DEFAULT_MODE = "sync";
21
+ const DEFAULT_RETENTION_MS = 300_000;
22
+ const DEFAULT_MAX_STORED_REQUESTS = 100;
23
+ export async function startWebhookAdapter(options) {
24
+ validateOptions(options);
25
+ const host = options.host ?? DEFAULT_HOST;
26
+ const port = options.port ?? DEFAULT_PORT;
27
+ const path = normalizePath(options.path ?? DEFAULT_PATH);
28
+ const retentionMs = options.retentionMs ?? DEFAULT_RETENTION_MS;
29
+ const maxStoredRequests = options.maxStoredRequests ?? DEFAULT_MAX_STORED_REQUESTS;
30
+ const defaultMode = options.defaultMode ?? DEFAULT_MODE;
31
+ assertSafeBind(host, options.allowNonLoopback === true, (boundHost) => new WebhookAdapterError("unsafe_host", "Webhook adapter refuses to bind a non-loopback host unless allowNonLoopback is true.", { host: boundHost }));
32
+ const app = express();
33
+ const server = createServer(app);
34
+ const activeByConversation = new Map();
35
+ const statuses = new Map();
36
+ const statusBasePath = `${dirname(path) === "/" ? "" : dirname(path)}/requests`;
37
+ app.use(express.json({ limit: "1mb" }));
38
+ app.post(path, (req, res) => {
39
+ void handleInvoke(req, res).catch((error) => {
40
+ options.logger?.error?.("Webhook invocation failed before response.", {
41
+ error: errorToMessage(error),
42
+ });
43
+ if (!res.headersSent) {
44
+ res.status(500).json({ status: "failed", error: errorToMessage(error) });
45
+ }
46
+ });
47
+ });
48
+ app.get(`${statusBasePath}/:requestId`, (req, res) => {
49
+ pruneStatuses(statuses, retentionMs, maxStoredRequests);
50
+ const requestId = req.params.requestId;
51
+ const stored = requestId === undefined ? undefined : statuses.get(requestId);
52
+ if (stored === undefined) {
53
+ res.status(404).json({ status: "not_found", requestId });
54
+ return;
55
+ }
56
+ res.status(200).json(stored.status);
57
+ });
58
+ app.use((error, _req, res, next) => {
59
+ if (res.headersSent) {
60
+ next(error);
61
+ return;
62
+ }
63
+ res.status(400).json({ status: "failed", error: errorToMessage(error) });
64
+ });
65
+ const address = await listen(server, port, host, {
66
+ listenFailed: (reason) => new WebhookAdapterError("start_failed", "Webhook adapter failed to listen.", { reason }),
67
+ noAddress: () => new WebhookAdapterError("start_failed", "Webhook adapter did not receive a TCP address."),
68
+ });
69
+ const boundPort = address.port;
70
+ const url = `http://${hostForUrl(host)}:${boundPort}`;
71
+ async function handleInvoke(req, res) {
72
+ pruneStatuses(statuses, retentionMs, maxStoredRequests);
73
+ const requestId = randomUUID();
74
+ const receivedAt = new Date().toISOString();
75
+ const body = normalizeBody(req.body, {
76
+ requestId,
77
+ defaultMode,
78
+ });
79
+ const statusUrl = `${statusBasePath}/${requestId}`;
80
+ const controller = new AbortController();
81
+ if (activeByConversation.has(body.conversationId)) {
82
+ const busy = {
83
+ status: "busy",
84
+ requestId,
85
+ conversationId: body.conversationId,
86
+ error: "A request is already active for this conversation.",
87
+ };
88
+ res.status(409).json(busy);
89
+ return;
90
+ }
91
+ const active = { controller, requestId };
92
+ activeByConversation.set(body.conversationId, active);
93
+ const startedAt = new Date().toISOString();
94
+ const running = {
95
+ status: "running",
96
+ requestId,
97
+ conversationId: body.conversationId,
98
+ statusUrl,
99
+ receivedAt,
100
+ startedAt,
101
+ };
102
+ setStatus(statuses, running, retentionMs, maxStoredRequests);
103
+ const request = {
104
+ conversationId: body.conversationId,
105
+ text: body.text,
106
+ abortSignal: controller.signal,
107
+ metadata: {
108
+ webhook: {
109
+ requestId,
110
+ mode: body.mode,
111
+ method: req.method,
112
+ path: req.path,
113
+ receivedAt,
114
+ ...(req.socket.remoteAddress === undefined ? {} : { remoteAddress: req.socket.remoteAddress }),
115
+ headers: req.headers,
116
+ ...(body.metadata === undefined ? {} : { payloadMetadata: body.metadata }),
117
+ },
118
+ },
119
+ };
120
+ if (body.mode === "async") {
121
+ res.status(202).json({
122
+ status: "accepted",
123
+ requestId,
124
+ conversationId: body.conversationId,
125
+ statusUrl,
126
+ receivedAt,
127
+ });
128
+ void runResponder({ request, statusUrl, receivedAt, startedAt, statuses, activeByConversation, active, options, retentionMs, maxStoredRequests });
129
+ return;
130
+ }
131
+ res.once("close", () => {
132
+ if (!res.writableEnded) {
133
+ controller.abort(new Error("Webhook client disconnected."));
134
+ }
135
+ });
136
+ const status = await runResponder({ request, statusUrl, receivedAt, startedAt, statuses, activeByConversation, active, options, retentionMs, maxStoredRequests });
137
+ if (status.status === "succeeded") {
138
+ res.status(200).json(status);
139
+ return;
140
+ }
141
+ if (status.status === "cancelled") {
142
+ res.status(499).json(status);
143
+ return;
144
+ }
145
+ res.status(500).json(status);
146
+ }
147
+ return {
148
+ url,
149
+ invokeUrl: `${url}${path}`,
150
+ statusBasePath,
151
+ host,
152
+ port: boundPort,
153
+ get activeRequestCount() {
154
+ return activeByConversation.size;
155
+ },
156
+ getStatus(requestId) {
157
+ return statuses.get(requestId)?.status;
158
+ },
159
+ async stop() {
160
+ for (const active of activeByConversation.values()) {
161
+ active.controller.abort(new Error("Webhook adapter stopped."));
162
+ }
163
+ activeByConversation.clear();
164
+ await close(server);
165
+ },
166
+ };
167
+ }
168
+ async function runResponder(input) {
169
+ const stream = new BufferedMessageStream({
170
+ onClosed: () => new WebhookAdapterError("invalid_config", "Cannot write to a finished webhook stream."),
171
+ });
172
+ let status;
173
+ try {
174
+ const response = await input.options.responder.respond(input.request, stream);
175
+ await stream.finish(response.text);
176
+ status = {
177
+ status: "succeeded",
178
+ requestId: input.active.requestId,
179
+ conversationId: input.request.conversationId,
180
+ statusUrl: input.statusUrl,
181
+ receivedAt: input.receivedAt,
182
+ startedAt: input.startedAt,
183
+ completedAt: new Date().toISOString(),
184
+ ...(stream.text.length === 0 ? {} : { text: stream.text }),
185
+ ...(response.metadata === undefined ? {} : { metadata: response.metadata }),
186
+ };
187
+ }
188
+ catch (error) {
189
+ const cancelled = input.request.abortSignal.aborted || isAgentResponseCancelledError(error);
190
+ status = {
191
+ status: cancelled ? "cancelled" : "failed",
192
+ requestId: input.active.requestId,
193
+ conversationId: input.request.conversationId,
194
+ statusUrl: input.statusUrl,
195
+ receivedAt: input.receivedAt,
196
+ startedAt: input.startedAt,
197
+ completedAt: new Date().toISOString(),
198
+ error: errorToMessage(error),
199
+ };
200
+ input.options.logger?.[cancelled ? "warn" : "error"]?.("Webhook responder failed.", {
201
+ requestId: input.active.requestId,
202
+ conversationId: input.request.conversationId,
203
+ error: status.error,
204
+ });
205
+ }
206
+ finally {
207
+ if (input.activeByConversation.get(input.request.conversationId) === input.active) {
208
+ input.activeByConversation.delete(input.request.conversationId);
209
+ }
210
+ }
211
+ setStatus(input.statuses, status, input.retentionMs, input.maxStoredRequests);
212
+ return status;
213
+ }
214
+ function normalizeBody(body, input) {
215
+ if (!isRecord(body)) {
216
+ throw new WebhookAdapterError("invalid_config", "Webhook body must be a JSON object.");
217
+ }
218
+ const text = normalizeOptionalString(body.text);
219
+ if (text === undefined) {
220
+ throw new WebhookAdapterError("invalid_config", "Webhook body requires non-empty text.");
221
+ }
222
+ const mode = normalizeOptionalString(body.mode) ?? input.defaultMode;
223
+ if (mode !== "sync" && mode !== "async") {
224
+ throw new WebhookAdapterError("invalid_config", "Webhook mode must be sync or async.");
225
+ }
226
+ const rawConversationId = normalizeOptionalString(body.conversationId);
227
+ return {
228
+ text,
229
+ conversationId: rawConversationId ?? `webhook:${input.requestId}`,
230
+ mode,
231
+ ...(body.metadata === undefined ? {} : { metadata: body.metadata }),
232
+ };
233
+ }
234
+ function setStatus(statuses, status, retentionMs, maxStoredRequests) {
235
+ statuses.set(status.requestId, { status, updatedAtMs: Date.now() });
236
+ pruneStatuses(statuses, retentionMs, maxStoredRequests);
237
+ }
238
+ function pruneStatuses(statuses, retentionMs, maxStoredRequests) {
239
+ const cutoff = Date.now() - retentionMs;
240
+ for (const [requestId, status] of statuses) {
241
+ if (status.updatedAtMs < cutoff) {
242
+ statuses.delete(requestId);
243
+ }
244
+ }
245
+ while (statuses.size > maxStoredRequests) {
246
+ const oldest = statuses.keys().next().value;
247
+ if (oldest === undefined) {
248
+ return;
249
+ }
250
+ statuses.delete(oldest);
251
+ }
252
+ }
253
+ function validateOptions(options) {
254
+ if (typeof options.responder?.respond !== "function") {
255
+ throw new WebhookAdapterError("missing_required_config", "Webhook adapter requires a responder.");
256
+ }
257
+ if (!Number.isInteger(options.port ?? DEFAULT_PORT) || (options.port ?? DEFAULT_PORT) < 0 || (options.port ?? DEFAULT_PORT) > 65535) {
258
+ throw new WebhookAdapterError("invalid_config", "Webhook adapter port must be an integer from 0 to 65535.");
259
+ }
260
+ validatePositiveInteger(options.retentionMs, "retentionMs");
261
+ validatePositiveInteger(options.maxStoredRequests, "maxStoredRequests");
262
+ const mode = options.defaultMode ?? DEFAULT_MODE;
263
+ if (mode !== "sync" && mode !== "async") {
264
+ throw new WebhookAdapterError("invalid_config", "Webhook defaultMode must be sync or async.");
265
+ }
266
+ normalizePath(options.path ?? DEFAULT_PATH);
267
+ }
268
+ function validatePositiveInteger(value, name) {
269
+ if (value === undefined) {
270
+ return;
271
+ }
272
+ if (!Number.isInteger(value) || value < 1) {
273
+ throw new WebhookAdapterError("invalid_config", `Webhook ${name} must be a positive integer.`);
274
+ }
275
+ }
276
+ function normalizePath(path) {
277
+ const normalized = path.trim();
278
+ if (!normalized.startsWith("/") || normalized.includes("?") || normalized.includes("#")) {
279
+ throw new WebhookAdapterError("invalid_config", "Webhook path must be an absolute path without query or hash.");
280
+ }
281
+ return normalized.length === 1 ? DEFAULT_PATH : normalized.replace(/\/+$/u, "");
282
+ }
283
+ function errorToMessage(error) {
284
+ return error instanceof Error ? error.message : String(error);
285
+ }
286
+ function normalizeOptionalString(value) {
287
+ if (typeof value !== "string") {
288
+ return undefined;
289
+ }
290
+ const normalized = value.trim();
291
+ return normalized.length === 0 ? undefined : normalized;
292
+ }
293
+ function isRecord(value) {
294
+ return value !== null && typeof value === "object" && !Array.isArray(value);
295
+ }
296
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@mono-agent/webhook-adapter",
3
+ "version": "0.1.0",
4
+ "description": "HTTP webhook invocation adapter for agent responders.",
5
+ "type": "module",
6
+ "license": "UNLICENSED",
7
+ "private": false,
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "dependencies": {
21
+ "@mono-agent/agent-contracts": "0.1.0",
22
+ "@mono-agent/settings": "0.1.0",
23
+ "express": "^5.1.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/express": "^5.0.2"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc -p tsconfig.build.json",
33
+ "typecheck": "tsc -p tsconfig.json --noEmit",
34
+ "test": "vitest run --passWithNoTests"
35
+ }
36
+ }