@mono-agent/webhook-adapter 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -4
- package/dist/config.d.ts +34 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +224 -100
- package/dist/config.js.map +1 -1
- package/dist/endpoints-dir.d.ts +17 -0
- package/dist/endpoints-dir.d.ts.map +1 -0
- package/dist/endpoints-dir.js +144 -0
- package/dist/endpoints-dir.js.map +1 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +55 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +207 -54
- package/dist/server.js.map +1 -1
- package/package.json +2 -3
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { normalizeOptionalString, readBoolean } from "@mono-agent/agent-contracts";
|
|
4
|
+
import { normalizePath, WebhookAdapterError } from "./server.js";
|
|
5
|
+
// Matches a leading YAML-style frontmatter block (`---` … `---`). Mirrors the
|
|
6
|
+
// shape used by cron-adapter's job files; webhook-adapter keeps a self-contained
|
|
7
|
+
// parser so it takes on no extra dependency. Frontmatter is flat scalars only.
|
|
8
|
+
const FRONTMATTER_PATTERN = /^---\n([\s\S]*?)\n---[ \t]*(?:\n|$)/u;
|
|
9
|
+
const invalidConfig = (message, details) => new WebhookAdapterError("invalid_config", message, details);
|
|
10
|
+
/**
|
|
11
|
+
* Load every `*.md` webhook endpoint in {@link dir}. A missing directory is not
|
|
12
|
+
* an error (returns `[]`); files are read in sorted filename order for a stable
|
|
13
|
+
* endpoint list. Two files that resolve to the same `name` are a hard error.
|
|
14
|
+
*/
|
|
15
|
+
export async function loadWebhookEndpointsFromDirectory(dir, defaultMode) {
|
|
16
|
+
let entries;
|
|
17
|
+
try {
|
|
18
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (isErrno(error, "ENOENT")) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
throw invalidConfig("Unable to read webhook endpoints directory.", { dir, reason: errorToMessage(error) });
|
|
25
|
+
}
|
|
26
|
+
const files = entries
|
|
27
|
+
.filter((entry) => entry.isFile() && entry.name.toLowerCase().endsWith(".md"))
|
|
28
|
+
.map((entry) => entry.name)
|
|
29
|
+
.sort();
|
|
30
|
+
const endpoints = [];
|
|
31
|
+
const seenNames = new Map();
|
|
32
|
+
for (const name of files) {
|
|
33
|
+
const filePath = join(dir, name);
|
|
34
|
+
let content;
|
|
35
|
+
try {
|
|
36
|
+
content = await readFile(filePath, "utf8");
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw invalidConfig("Unable to read webhook endpoint file.", { file: name, reason: errorToMessage(error) });
|
|
40
|
+
}
|
|
41
|
+
const endpoint = parseWebhookEndpointMarkdown(name, content, defaultMode);
|
|
42
|
+
const prior = seenNames.get(endpoint.name);
|
|
43
|
+
if (prior !== undefined) {
|
|
44
|
+
throw invalidConfig(`Duplicate webhook endpoint name "${endpoint.name}" defined by ${prior} and ${name}.`, {
|
|
45
|
+
name: endpoint.name,
|
|
46
|
+
file: name,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
seenNames.set(endpoint.name, name);
|
|
50
|
+
endpoints.push(endpoint);
|
|
51
|
+
}
|
|
52
|
+
return endpoints;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse one webhook endpoint markdown file: frontmatter holds the routing
|
|
56
|
+
* metadata and the markdown body is the `prompt` (pre-instructions). `name`
|
|
57
|
+
* defaults to the filename stem, `mode` to the shared default, and `enabled` to
|
|
58
|
+
* true. Unlike cron jobs, the body may be empty — an endpoint with no prompt
|
|
59
|
+
* just forwards the posted text unchanged.
|
|
60
|
+
*/
|
|
61
|
+
export function parseWebhookEndpointMarkdown(fileName, content, defaultMode) {
|
|
62
|
+
const normalized = content.replace(/\r\n?/g, "\n");
|
|
63
|
+
const match = FRONTMATTER_PATTERN.exec(normalized);
|
|
64
|
+
const frontmatter = match === null ? "" : (match[1] ?? "");
|
|
65
|
+
const body = match === null ? normalized : normalized.slice(match[0].length);
|
|
66
|
+
const meta = parseFrontmatter(frontmatter);
|
|
67
|
+
const rawPath = normalizeOptionalString(meta.path);
|
|
68
|
+
if (rawPath === undefined) {
|
|
69
|
+
throw invalidConfig("Webhook endpoint markdown requires a `path` in its frontmatter.", { file: fileName });
|
|
70
|
+
}
|
|
71
|
+
const path = normalizePath(rawPath);
|
|
72
|
+
const name = normalizeOptionalString(meta.name) ?? stripMarkdownExtension(fileName);
|
|
73
|
+
const mode = normalizeMode(meta.mode, fileName) ?? defaultMode;
|
|
74
|
+
const enabled = readBoolean(meta.enabled, `${fileName} frontmatter \`enabled\``, true, invalidConfig);
|
|
75
|
+
const notify = readBoolean(meta.notify, `${fileName} frontmatter \`notify\``, false, invalidConfig);
|
|
76
|
+
const notifyConversationId = normalizeOptionalString(meta.notifyConversationId);
|
|
77
|
+
const model = normalizeOptionalString(meta.model);
|
|
78
|
+
const effort = normalizeOptionalString(meta.effort);
|
|
79
|
+
const prompt = body.trim().length === 0 ? undefined : body.trim();
|
|
80
|
+
return {
|
|
81
|
+
name,
|
|
82
|
+
path,
|
|
83
|
+
mode,
|
|
84
|
+
enabled,
|
|
85
|
+
...(notify ? { notify } : {}),
|
|
86
|
+
...(notifyConversationId === undefined ? {} : { notifyConversationId }),
|
|
87
|
+
...(model === undefined ? {} : { model }),
|
|
88
|
+
...(effort === undefined ? {} : { effort }),
|
|
89
|
+
...(prompt === undefined ? {} : { prompt }),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function normalizeMode(value, fileName) {
|
|
93
|
+
const mode = normalizeOptionalString(value);
|
|
94
|
+
if (mode === undefined) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
if (mode !== "sync" && mode !== "async") {
|
|
98
|
+
throw invalidConfig("Webhook endpoint `mode` must be sync or async.", { file: fileName, mode });
|
|
99
|
+
}
|
|
100
|
+
return mode;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Parse flat `key: value` frontmatter lines, one layer of surrounding quotes
|
|
104
|
+
* stripped. Blank and `#` comment lines are ignored, as are lines without a
|
|
105
|
+
* colon. Null-prototype map so a `__proto__` key is inert data.
|
|
106
|
+
*/
|
|
107
|
+
function parseFrontmatter(frontmatter) {
|
|
108
|
+
const meta = Object.create(null);
|
|
109
|
+
for (const rawLine of frontmatter.split("\n")) {
|
|
110
|
+
const line = rawLine.trim();
|
|
111
|
+
if (line.length === 0 || line.startsWith("#")) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const colon = line.indexOf(":");
|
|
115
|
+
if (colon === -1) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const key = line.slice(0, colon).trim();
|
|
119
|
+
if (key.length === 0) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
meta[key] = stripQuotes(line.slice(colon + 1).trim());
|
|
123
|
+
}
|
|
124
|
+
return meta;
|
|
125
|
+
}
|
|
126
|
+
function stripQuotes(value) {
|
|
127
|
+
if (value.length >= 2) {
|
|
128
|
+
const first = value[0];
|
|
129
|
+
if ((first === '"' || first === "'") && value[value.length - 1] === first) {
|
|
130
|
+
return value.slice(1, -1);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return value;
|
|
134
|
+
}
|
|
135
|
+
function stripMarkdownExtension(fileName) {
|
|
136
|
+
return fileName.replace(/\.md$/iu, "");
|
|
137
|
+
}
|
|
138
|
+
function errorToMessage(error) {
|
|
139
|
+
return error instanceof Error ? error.message : String(error);
|
|
140
|
+
}
|
|
141
|
+
function isErrno(error, code) {
|
|
142
|
+
return typeof error === "object" && error !== null && error.code === code;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=endpoints-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints-dir.js","sourceRoot":"","sources":["../src/endpoints-dir.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
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,
|
|
4
|
-
export type { LoadWebhookAdapterConfigInput, RedactedWebhookAdapterConfig, WebhookAdapterConfig, } from "./config.js";
|
|
1
|
+
export { normalizePath, startWebhookAdapter, WebhookAdapterError, } from "./server.js";
|
|
2
|
+
export type { WebhookAdapterErrorCode, WebhookAdapterErrorDetails, WebhookAdapterLogger, WebhookAdapterOptions, WebhookAdapterStartResult, WebhookBusyResponse, WebhookEndpointOption, WebhookEndpointSummary, WebhookInvocationMode, WebhookInvocationRequest, WebhookInvocationStatus, WebhookRequestMetadata, } from "./server.js";
|
|
3
|
+
export { loadWebhookAdapterConfig, redactWebhookAdapterConfig, WEBHOOK_CONFIG_FIELDS, } from "./config.js";
|
|
4
|
+
export type { LoadWebhookAdapterConfigInput, RedactedWebhookAdapterConfig, WebhookAdapterConfig, WebhookEndpointConfig, } from "./config.js";
|
|
5
|
+
export { loadWebhookEndpointsFromDirectory, parseWebhookEndpointMarkdown, } from "./endpoints-dir.js";
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,uBAAuB,EACvB,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,6BAA6B,EAC7B,4BAA4B,EAC5B,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iCAAiC,EACjC,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { startWebhookAdapter, WebhookAdapterError, } from "./server.js";
|
|
2
|
-
export { loadWebhookAdapterConfig, redactWebhookAdapterConfig,
|
|
1
|
+
export { normalizePath, startWebhookAdapter, WebhookAdapterError, } from "./server.js";
|
|
2
|
+
export { loadWebhookAdapterConfig, redactWebhookAdapterConfig, WEBHOOK_CONFIG_FIELDS, } from "./config.js";
|
|
3
|
+
export { loadWebhookEndpointsFromDirectory, parseWebhookEndpointMarkdown, } from "./endpoints-dir.js";
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAgBrB,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAQrB,OAAO,EACL,iCAAiC,EACjC,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { type AgentMessageStream, type AgentRequestBase, type AgentResponder, ty
|
|
|
2
2
|
export type WebhookInvocationMode = "sync" | "async";
|
|
3
3
|
export interface WebhookRequestMetadata {
|
|
4
4
|
readonly requestId: string;
|
|
5
|
+
/** Name of the endpoint that received the request (multi-endpoint routing). */
|
|
6
|
+
readonly endpointName: string;
|
|
5
7
|
readonly mode: WebhookInvocationMode;
|
|
6
8
|
readonly method: string;
|
|
7
9
|
readonly path: string;
|
|
@@ -9,6 +11,14 @@ export interface WebhookRequestMetadata {
|
|
|
9
11
|
readonly remoteAddress?: string;
|
|
10
12
|
readonly headers: Record<string, string | string[] | undefined>;
|
|
11
13
|
readonly payloadMetadata?: unknown;
|
|
14
|
+
readonly nativeNotify?: {
|
|
15
|
+
readonly enabled: true;
|
|
16
|
+
readonly conversationId?: string;
|
|
17
|
+
};
|
|
18
|
+
/** Resolved runtime model override (request body `model` wins over endpoint config). Validated by the app. */
|
|
19
|
+
readonly model?: string;
|
|
20
|
+
/** Resolved reasoning effort override (request body `effort` wins over endpoint config). Validated by the app. */
|
|
21
|
+
readonly effort?: string;
|
|
12
22
|
}
|
|
13
23
|
export interface WebhookInvocationRequest extends AgentRequestBase {
|
|
14
24
|
readonly conversationId: string;
|
|
@@ -63,23 +73,65 @@ export interface WebhookAdapterLogger {
|
|
|
63
73
|
warn?(message: string, metadata?: Record<string, unknown>): void;
|
|
64
74
|
error?(message: string, metadata?: Record<string, unknown>): void;
|
|
65
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* One HTTP endpoint of the webhook server. Multiple endpoints share one server,
|
|
78
|
+
* host and port; each has its own POST path, default mode, and optional `prompt`
|
|
79
|
+
* (pre-instructions prepended to the incoming request text).
|
|
80
|
+
*/
|
|
81
|
+
export interface WebhookEndpointOption {
|
|
82
|
+
readonly name: string;
|
|
83
|
+
readonly path: string;
|
|
84
|
+
readonly mode?: WebhookInvocationMode;
|
|
85
|
+
readonly prompt?: string;
|
|
86
|
+
/** When true, the app host may deliver the final answer to a notify-capable conversation. */
|
|
87
|
+
readonly notify?: boolean;
|
|
88
|
+
/** Optional destination conversationId for native notification delivery. */
|
|
89
|
+
readonly notifyConversationId?: string;
|
|
90
|
+
/** Per-endpoint runtime model override (raw string; a request body `model` wins). */
|
|
91
|
+
readonly model?: string;
|
|
92
|
+
/** Per-endpoint reasoning effort override (raw string; a request body `effort` wins). */
|
|
93
|
+
readonly effort?: string;
|
|
94
|
+
}
|
|
66
95
|
export interface WebhookAdapterOptions {
|
|
67
96
|
readonly host?: string;
|
|
68
97
|
readonly port?: number;
|
|
69
|
-
readonly path?: string;
|
|
70
98
|
readonly allowNonLoopback?: boolean;
|
|
71
|
-
readonly defaultMode?: WebhookInvocationMode;
|
|
72
99
|
readonly retentionMs?: number;
|
|
73
100
|
readonly maxStoredRequests?: number;
|
|
101
|
+
/**
|
|
102
|
+
* Wall-clock bound (ms) for a single webhook run. On timeout the request
|
|
103
|
+
* signal is aborted and the conversation's slot is reclaimed even if the
|
|
104
|
+
* responder never settles. Omit or set <= 0 to disable. Matters most for
|
|
105
|
+
* async runs, which have no client disconnect to bound them.
|
|
106
|
+
*/
|
|
107
|
+
readonly maxRunMs?: number;
|
|
74
108
|
readonly responder: AgentResponder<WebhookInvocationRequest, AgentMessageStream, AgentResponse>;
|
|
75
109
|
readonly logger?: WebhookAdapterLogger;
|
|
110
|
+
/** Endpoints to serve. When omitted, a single legacy endpoint is built from `path`/`defaultMode`. */
|
|
111
|
+
readonly endpoints?: readonly WebhookEndpointOption[];
|
|
112
|
+
/** Legacy single-endpoint path. Folded into a one-element `endpoints` list when `endpoints` is omitted. */
|
|
113
|
+
readonly path?: string;
|
|
114
|
+
/** Default invocation mode for the legacy single endpoint and for endpoints that omit `mode`. */
|
|
115
|
+
readonly defaultMode?: WebhookInvocationMode;
|
|
116
|
+
/** Best-effort completion hook; failures here must not affect HTTP responses or stored status. */
|
|
117
|
+
readonly onResult?: (status: WebhookInvocationStatus, request: WebhookInvocationRequest) => void | Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
export interface WebhookEndpointSummary {
|
|
120
|
+
readonly name: string;
|
|
121
|
+
readonly path: string;
|
|
122
|
+
readonly invokeUrl: string;
|
|
123
|
+
readonly statusBasePath: string;
|
|
124
|
+
readonly mode: WebhookInvocationMode;
|
|
76
125
|
}
|
|
77
126
|
export interface WebhookAdapterStartResult {
|
|
78
127
|
readonly url: string;
|
|
128
|
+
/** Invoke URL of the first endpoint (back-compat). See `endpoints` for all of them. */
|
|
79
129
|
readonly invokeUrl: string;
|
|
130
|
+
/** Status base path of the first endpoint (back-compat). */
|
|
80
131
|
readonly statusBasePath: string;
|
|
81
132
|
readonly host: string;
|
|
82
133
|
readonly port: number;
|
|
134
|
+
readonly endpoints: readonly WebhookEndpointSummary[];
|
|
83
135
|
readonly activeRequestCount: number;
|
|
84
136
|
getStatus(requestId: string): WebhookInvocationStatus | undefined;
|
|
85
137
|
stop(): Promise<void>;
|
|
@@ -96,4 +148,5 @@ export declare class WebhookAdapterError extends Error {
|
|
|
96
148
|
constructor(code: WebhookAdapterErrorCode, message: string, details?: WebhookAdapterErrorDetails);
|
|
97
149
|
}
|
|
98
150
|
export declare function startWebhookAdapter(options: WebhookAdapterOptions): Promise<WebhookAdapterStartResult>;
|
|
151
|
+
export declare function normalizePath(path: string): string;
|
|
99
152
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AASrC,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAChE,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|