@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
package/README.md
CHANGED
|
@@ -6,7 +6,11 @@ Category: `communication`
|
|
|
6
6
|
|
|
7
7
|
## Responsibility
|
|
8
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.
|
|
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. One server can serve **multiple named endpoints**, each with its own path, mode, and optional `prompt`.
|
|
10
|
+
|
|
11
|
+
## Port ownership
|
|
12
|
+
|
|
13
|
+
The adapter binds **its own** HTTP port — it is *not* inherited from a parent mono-agent process (mono-agent is not itself an HTTP server; each HTTP-bearing channel binds its own port). `port: 0` (the default) asks the OS for a random free port, so the resolved URL is unpredictable. **Set an explicit port** (e.g. `4310`) when you need a stable URL that skills or webhook `prompt`s can reference. The resolved invoke URL(s) are reported in the channel `summary` (visible via `mono-agent status` and logs).
|
|
10
14
|
|
|
11
15
|
## Install / Usage
|
|
12
16
|
|
|
@@ -20,11 +24,20 @@ import { startWebhookAdapter } from "@mono-agent/webhook-adapter";
|
|
|
20
24
|
const webhook = await startWebhookAdapter({
|
|
21
25
|
host: "127.0.0.1",
|
|
22
26
|
port: 4310,
|
|
23
|
-
path: "/webhook/invoke",
|
|
24
27
|
responder,
|
|
28
|
+
endpoints: [
|
|
29
|
+
{ name: "invoke", path: "/webhook/invoke" },
|
|
30
|
+
{ name: "deep-research", path: "/webhook/deep-research", mode: "async", prompt: "Check deep-research/requests/*.md, match the incoming payload, address it, then move the file to deep-research/researched/." },
|
|
31
|
+
],
|
|
25
32
|
});
|
|
26
33
|
```
|
|
27
34
|
|
|
35
|
+
A single legacy endpoint still works (`path`/`defaultMode` are folded into a one-element `endpoints` list):
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
await startWebhookAdapter({ host: "127.0.0.1", port: 4310, path: "/webhook/invoke", responder });
|
|
39
|
+
```
|
|
40
|
+
|
|
28
41
|
Send a sync invocation:
|
|
29
42
|
|
|
30
43
|
```bash
|
|
@@ -35,18 +48,41 @@ curl -X POST "$WEBHOOK_URL/webhook/invoke" \
|
|
|
35
48
|
|
|
36
49
|
Async mode returns `202` with `requestId` and `statusUrl`; status is process-local memory and is not durable across restarts.
|
|
37
50
|
|
|
51
|
+
## Per-webhook prompt
|
|
52
|
+
|
|
53
|
+
Each endpoint may carry a `prompt` (pre-instructions, same role as a cron job's prompt). When set, the adapter forms the agent's user message as `prompt` + `\n\n` + the posted `text`. The webhook imposes no correlation scheme of its own: it forwards the request's `conversationId` and arbitrary `metadata` through unchanged, so a `prompt` plus filesystem/skill conventions can drive any workflow (e.g. matching incoming results to request files on disk).
|
|
54
|
+
|
|
55
|
+
> Loopback note: a webhook is request/response — the resumed turn's output is returned on the POST's own HTTP response (sync) or status endpoint (async). History is in-memory per channel harness, and `createConfiguredAgentResponder` applies auto-compaction + daily session rollover, so a result returning long after it was scheduled may resume with compacted context. Skills that need durable correlation should record state in memory or on disk.
|
|
56
|
+
|
|
57
|
+
## Configuring multiple endpoints (host config)
|
|
58
|
+
|
|
59
|
+
`loadWebhookAdapterConfig` reads endpoints from, in precedence order: `MONO_AGENT_WEBHOOK_ENDPOINTS_JSON`, the `webhook.endpoints` array, then the legacy single `webhook.path`/`webhook.prompt` fields. Endpoints can also be authored as `*.md` files in the `webhook` folder (override via `webhook.dir` / `MONO_AGENT_WEBHOOK_DIR`), mirroring cron jobs — frontmatter is routing, the body is the `prompt`:
|
|
60
|
+
|
|
61
|
+
```markdown
|
|
62
|
+
---
|
|
63
|
+
path: /webhook/deep-research
|
|
64
|
+
mode: async
|
|
65
|
+
---
|
|
66
|
+
Check deep-research/requests/*.md, match the incoming payload to an existing
|
|
67
|
+
request, address it, then move that file to deep-research/researched/.
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Folder endpoints are merged with config endpoints; a duplicate `name` or `path` is a hard error.
|
|
71
|
+
|
|
38
72
|
## Public API
|
|
39
73
|
|
|
40
74
|
- `startWebhookAdapter`
|
|
75
|
+
- `normalizePath`
|
|
76
|
+
- `loadWebhookEndpointsFromDirectory`, `parseWebhookEndpointMarkdown`
|
|
41
77
|
- `WebhookAdapterError`
|
|
42
78
|
- `loadWebhookAdapterConfig`
|
|
43
79
|
- `redactWebhookAdapterConfig`
|
|
44
80
|
- `webhookFieldGroup`
|
|
45
|
-
- Webhook adapter, config, request metadata, invocation status, and logger types
|
|
81
|
+
- Webhook adapter, config, endpoint, request metadata, invocation status, and logger types
|
|
46
82
|
|
|
47
83
|
## Dependency Boundary
|
|
48
84
|
|
|
49
|
-
This adapter depends on Express plus shared contracts
|
|
85
|
+
This adapter depends on Express plus shared `@mono-agent/agent-contracts` 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
86
|
|
|
51
87
|
## What This Package Does Not Own
|
|
52
88
|
|
package/dist/config.d.ts
CHANGED
|
@@ -1,22 +1,52 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { JsonEnvFieldSpec, SettingsJson } from "@mono-agent/agent-contracts";
|
|
2
2
|
import { type WebhookInvocationMode } from "./server.js";
|
|
3
|
+
/** One HTTP endpoint of the webhook server (shares the server's host + port). */
|
|
4
|
+
export interface WebhookEndpointConfig {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly path: string;
|
|
7
|
+
readonly mode: WebhookInvocationMode;
|
|
8
|
+
readonly enabled: boolean;
|
|
9
|
+
/** Pre-instructions prepended to the incoming request text. Same role as a cron job's prompt. */
|
|
10
|
+
readonly prompt?: string;
|
|
11
|
+
readonly notify?: boolean;
|
|
12
|
+
readonly notifyConversationId?: string;
|
|
13
|
+
/** Per-endpoint runtime model override (e.g. `claude:claude-opus-4-8`). A request body `model` wins. */
|
|
14
|
+
readonly model?: string;
|
|
15
|
+
/** Per-endpoint reasoning effort override (e.g. `high`). A request body `effort` wins. */
|
|
16
|
+
readonly effort?: string;
|
|
17
|
+
}
|
|
3
18
|
export interface WebhookAdapterConfig {
|
|
4
19
|
readonly enabled: boolean;
|
|
5
20
|
readonly host: string;
|
|
6
21
|
readonly port: number;
|
|
7
|
-
readonly path: string;
|
|
8
22
|
readonly allowNonLoopback: boolean;
|
|
9
|
-
readonly defaultMode: WebhookInvocationMode;
|
|
10
23
|
readonly retentionMs: number;
|
|
11
24
|
readonly maxStoredRequests: number;
|
|
25
|
+
/** Wall-clock bound (ms) per webhook run. Omit to use the adapter default (20 min). */
|
|
26
|
+
readonly maxRunMs?: number;
|
|
27
|
+
readonly endpoints: readonly WebhookEndpointConfig[];
|
|
28
|
+
/** Back-compat mirror of `endpoints[0].path`. */
|
|
29
|
+
readonly path: string;
|
|
30
|
+
/** Back-compat mirror of `endpoints[0].mode`. */
|
|
31
|
+
readonly defaultMode: WebhookInvocationMode;
|
|
12
32
|
}
|
|
13
33
|
export type RedactedWebhookAdapterConfig = WebhookAdapterConfig;
|
|
14
34
|
export interface LoadWebhookAdapterConfigInput {
|
|
15
35
|
readonly env: Record<string, string | undefined>;
|
|
16
36
|
readonly json?: SettingsJson;
|
|
17
37
|
readonly jsonPath?: string;
|
|
38
|
+
/** Base directory the webhook endpoints folder resolves against (usually the app cwd). */
|
|
39
|
+
readonly cwd?: string;
|
|
40
|
+
/** Overrides the endpoints folder; defaults to `webhook.dir` / `MONO_AGENT_WEBHOOK_DIR` / `webhook`. */
|
|
41
|
+
readonly dir?: string;
|
|
18
42
|
}
|
|
19
|
-
export declare const webhookFieldGroup: FieldGroup;
|
|
20
43
|
export declare function loadWebhookAdapterConfig(input: LoadWebhookAdapterConfigInput): Promise<WebhookAdapterConfig>;
|
|
21
44
|
export declare function redactWebhookAdapterConfig(config: WebhookAdapterConfig): RedactedWebhookAdapterConfig;
|
|
45
|
+
/**
|
|
46
|
+
* The `webhook` section's field registry: the single source of truth both the
|
|
47
|
+
* JSON→env layering below and the app's config provenance view derive from.
|
|
48
|
+
* Covers the single-endpoint fields (multi-endpoint `endpoints[]` and `dir`
|
|
49
|
+
* are read straight from JSON / their own env forms).
|
|
50
|
+
*/
|
|
51
|
+
export declare const WEBHOOK_CONFIG_FIELDS: readonly JsonEnvFieldSpec[];
|
|
22
52
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGlF,OAAO,EAAsC,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE7F,iFAAiF;AACjF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,iGAAiG;IACjG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,wGAAwG;IACxG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,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,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACrD,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;CAC7C;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;IAC3B,0FAA0F;IAC1F,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,wGAAwG;IACxG,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAgBD,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,oBAAoB,CAAC,CAkC/B;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,oBAAoB,GAAG,4BAA4B,CAErG;AAmLD;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,gBAAgB,EAgB5D,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { fieldSpecMappings, layerJsonOntoEnv, normalizeOptionalString, readBoolean, readChoice, readInteger, readJsonSection, readSettingsJson, readString, } from "@mono-agent/agent-contracts";
|
|
3
|
+
import { loadWebhookEndpointsFromDirectory } from "./endpoints-dir.js";
|
|
4
|
+
import { normalizePath, WebhookAdapterError } from "./server.js";
|
|
3
5
|
const DEFAULT_ENABLED = false;
|
|
4
6
|
const DEFAULT_HOST = "127.0.0.1";
|
|
5
7
|
const DEFAULT_PORT = 0;
|
|
@@ -7,114 +9,236 @@ const DEFAULT_PATH = "/webhook/invoke";
|
|
|
7
9
|
const DEFAULT_MODE = "sync";
|
|
8
10
|
const DEFAULT_RETENTION_MS = 300_000;
|
|
9
11
|
const DEFAULT_MAX_STORED_REQUESTS = 100;
|
|
12
|
+
const DEFAULT_WEBHOOK_DIR = "webhook";
|
|
10
13
|
const WEBHOOK_MODES = ["sync", "async"];
|
|
11
14
|
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
15
|
export async function loadWebhookAdapterConfig(input) {
|
|
91
16
|
const json = input.json ?? (input.jsonPath === undefined ? {} : (await readSettingsJson(input.jsonPath)).json);
|
|
92
17
|
const env = layerWebhookJsonOntoEnv(json, input.env);
|
|
18
|
+
const enabled = readBoolean(env.MONO_AGENT_WEBHOOK_ENABLED, "MONO_AGENT_WEBHOOK_ENABLED", DEFAULT_ENABLED, invalidConfig);
|
|
19
|
+
const host = readString(env.MONO_AGENT_WEBHOOK_HOST, DEFAULT_HOST);
|
|
20
|
+
const port = readInteger(env.MONO_AGENT_WEBHOOK_PORT, "MONO_AGENT_WEBHOOK_PORT", DEFAULT_PORT, invalidConfig, { min: 0, max: 65535 });
|
|
21
|
+
const allowNonLoopback = readBoolean(env.MONO_AGENT_WEBHOOK_ALLOW_NON_LOOPBACK, "MONO_AGENT_WEBHOOK_ALLOW_NON_LOOPBACK", false, invalidConfig);
|
|
22
|
+
const defaultMode = readChoice(env.MONO_AGENT_WEBHOOK_DEFAULT_MODE, "MONO_AGENT_WEBHOOK_DEFAULT_MODE", WEBHOOK_MODES, DEFAULT_MODE, invalidConfig);
|
|
23
|
+
const retentionMs = readInteger(env.MONO_AGENT_WEBHOOK_RETENTION_MS, "MONO_AGENT_WEBHOOK_RETENTION_MS", DEFAULT_RETENTION_MS, invalidConfig, { min: 1, max: 86_400_000 });
|
|
24
|
+
const 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 });
|
|
25
|
+
const maxRunMsRaw = normalizeOptionalString(env.MONO_AGENT_WEBHOOK_MAX_RUN_MS);
|
|
26
|
+
const maxRunMs = maxRunMsRaw === undefined
|
|
27
|
+
? undefined
|
|
28
|
+
: readInteger(maxRunMsRaw, "MONO_AGENT_WEBHOOK_MAX_RUN_MS", 0, invalidConfig, { min: 0, max: 86_400_000 });
|
|
29
|
+
const configEndpoints = loadConfigEndpoints(json, env, defaultMode);
|
|
30
|
+
const directoryEndpoints = await loadDirectoryEndpoints(json, input, defaultMode);
|
|
31
|
+
const merged = mergeEndpoints(configEndpoints, directoryEndpoints);
|
|
32
|
+
const endpoints = merged.length > 0 ? merged : [defaultEndpoint(defaultMode)];
|
|
33
|
+
const primary = endpoints[0] ?? defaultEndpoint(defaultMode);
|
|
93
34
|
return {
|
|
94
|
-
enabled
|
|
95
|
-
host
|
|
96
|
-
port
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
35
|
+
enabled,
|
|
36
|
+
host,
|
|
37
|
+
port,
|
|
38
|
+
allowNonLoopback,
|
|
39
|
+
retentionMs,
|
|
40
|
+
maxStoredRequests,
|
|
41
|
+
...(maxRunMs === undefined ? {} : { maxRunMs }),
|
|
42
|
+
endpoints,
|
|
43
|
+
path: primary.path,
|
|
44
|
+
defaultMode: primary.mode,
|
|
102
45
|
};
|
|
103
46
|
}
|
|
104
47
|
export function redactWebhookAdapterConfig(config) {
|
|
105
|
-
return { ...config };
|
|
48
|
+
return { ...config, endpoints: config.endpoints.map((endpoint) => ({ ...endpoint })) };
|
|
106
49
|
}
|
|
107
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Endpoints defined inline in config: `MONO_AGENT_WEBHOOK_ENDPOINTS_JSON` (highest),
|
|
52
|
+
* then the `webhook.endpoints` array, then the single legacy `webhook.path`/`prompt`
|
|
53
|
+
* fields. Returns an empty list when nothing inline is configured (the webhook
|
|
54
|
+
* folder may still add endpoints, and a default endpoint is synthesized when both
|
|
55
|
+
* sources are empty).
|
|
56
|
+
*/
|
|
57
|
+
function loadConfigEndpoints(json, env, defaultMode) {
|
|
58
|
+
const endpointsJson = normalizeOptionalString(env.MONO_AGENT_WEBHOOK_ENDPOINTS_JSON);
|
|
59
|
+
if (endpointsJson !== undefined) {
|
|
60
|
+
return [...readEndpointsJson(endpointsJson, defaultMode)];
|
|
61
|
+
}
|
|
62
|
+
const section = readJsonSection(json, "webhook");
|
|
63
|
+
if (section.endpoints !== undefined) {
|
|
64
|
+
if (!Array.isArray(section.endpoints)) {
|
|
65
|
+
throw invalidConfig("webhook.endpoints must be an array of endpoint objects.");
|
|
66
|
+
}
|
|
67
|
+
return section.endpoints.map((entry, index) => normalizeEndpointConfig(entry, index, defaultMode));
|
|
68
|
+
}
|
|
69
|
+
const path = normalizeOptionalString(env.MONO_AGENT_WEBHOOK_PATH);
|
|
70
|
+
const prompt = normalizeOptionalString(env.MONO_AGENT_WEBHOOK_PROMPT);
|
|
71
|
+
const notify = readBoolean(env.MONO_AGENT_WEBHOOK_NOTIFY, "MONO_AGENT_WEBHOOK_NOTIFY", false, invalidConfig);
|
|
72
|
+
const notifyConversationId = normalizeOptionalString(env.MONO_AGENT_WEBHOOK_NOTIFY_CONVERSATION_ID);
|
|
73
|
+
const model = normalizeOptionalString(env.MONO_AGENT_WEBHOOK_MODEL);
|
|
74
|
+
const effort = normalizeOptionalString(env.MONO_AGENT_WEBHOOK_EFFORT);
|
|
75
|
+
if (path === undefined &&
|
|
76
|
+
prompt === undefined &&
|
|
77
|
+
!notify &&
|
|
78
|
+
notifyConversationId === undefined &&
|
|
79
|
+
model === undefined &&
|
|
80
|
+
effort === undefined) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
return [{
|
|
84
|
+
name: "default",
|
|
85
|
+
path: normalizePath(path ?? DEFAULT_PATH),
|
|
86
|
+
mode: defaultMode,
|
|
87
|
+
enabled: true,
|
|
88
|
+
...(prompt === undefined ? {} : { prompt }),
|
|
89
|
+
...(notify ? { notify } : {}),
|
|
90
|
+
...(notifyConversationId === undefined ? {} : { notifyConversationId }),
|
|
91
|
+
...(model === undefined ? {} : { model }),
|
|
92
|
+
...(effort === undefined ? {} : { effort }),
|
|
93
|
+
}];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Endpoints authored as `*.md` files in the webhook folder. Skipped unless a
|
|
97
|
+
* base directory (`input.cwd`) is known, so a loader called without a host never
|
|
98
|
+
* scans the process working directory implicitly.
|
|
99
|
+
*/
|
|
100
|
+
async function loadDirectoryEndpoints(json, input, defaultMode) {
|
|
101
|
+
if (input.cwd === undefined) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
108
104
|
const section = readJsonSection(json, "webhook");
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
105
|
+
if (section.dir !== undefined && typeof section.dir !== "string") {
|
|
106
|
+
throw invalidConfig("webhook.dir must be a string.");
|
|
107
|
+
}
|
|
108
|
+
const dirName = normalizeOptionalString(input.dir) ??
|
|
109
|
+
normalizeOptionalString(input.env.MONO_AGENT_WEBHOOK_DIR) ??
|
|
110
|
+
asOptionalString(section.dir) ??
|
|
111
|
+
DEFAULT_WEBHOOK_DIR;
|
|
112
|
+
return await loadWebhookEndpointsFromDirectory(resolve(input.cwd, dirName), defaultMode);
|
|
113
|
+
}
|
|
114
|
+
/** Combine inline-config endpoints with folder endpoints; duplicate name or path is a hard error. */
|
|
115
|
+
function mergeEndpoints(configEndpoints, directoryEndpoints) {
|
|
116
|
+
const merged = [];
|
|
117
|
+
const nameSource = new Map();
|
|
118
|
+
const pathSource = new Map();
|
|
119
|
+
const append = (endpoint, source) => {
|
|
120
|
+
const priorName = nameSource.get(endpoint.name);
|
|
121
|
+
if (priorName !== undefined) {
|
|
122
|
+
throw invalidConfig(`Duplicate webhook endpoint name "${endpoint.name}" from ${priorName} and ${source}.`, { name: endpoint.name });
|
|
123
|
+
}
|
|
124
|
+
const priorPath = pathSource.get(endpoint.path);
|
|
125
|
+
if (priorPath !== undefined) {
|
|
126
|
+
throw invalidConfig(`Duplicate webhook endpoint path "${endpoint.path}" from ${priorPath} and ${source}.`, { path: endpoint.path });
|
|
127
|
+
}
|
|
128
|
+
nameSource.set(endpoint.name, source);
|
|
129
|
+
pathSource.set(endpoint.path, source);
|
|
130
|
+
merged.push(endpoint);
|
|
131
|
+
};
|
|
132
|
+
for (const endpoint of configEndpoints) {
|
|
133
|
+
append(endpoint, "config");
|
|
134
|
+
}
|
|
135
|
+
for (const endpoint of directoryEndpoints) {
|
|
136
|
+
append(endpoint, "webhook folder");
|
|
137
|
+
}
|
|
138
|
+
return merged;
|
|
139
|
+
}
|
|
140
|
+
function defaultEndpoint(defaultMode) {
|
|
141
|
+
return { name: "default", path: DEFAULT_PATH, mode: defaultMode, enabled: true };
|
|
142
|
+
}
|
|
143
|
+
function readEndpointsJson(value, defaultMode) {
|
|
144
|
+
let parsed;
|
|
145
|
+
try {
|
|
146
|
+
parsed = JSON.parse(value);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw invalidConfig("MONO_AGENT_WEBHOOK_ENDPOINTS_JSON must contain valid JSON.", {
|
|
150
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (!Array.isArray(parsed)) {
|
|
154
|
+
throw invalidConfig("MONO_AGENT_WEBHOOK_ENDPOINTS_JSON must be an array.");
|
|
155
|
+
}
|
|
156
|
+
return parsed.map((entry, index) => normalizeEndpointConfig(entry, index, defaultMode));
|
|
157
|
+
}
|
|
158
|
+
function normalizeEndpointConfig(entry, index, defaultMode) {
|
|
159
|
+
if (!isRecord(entry)) {
|
|
160
|
+
throw invalidConfig("Webhook endpoint entries must be objects.", { index });
|
|
161
|
+
}
|
|
162
|
+
const rawPath = asOptionalString(entry.path);
|
|
163
|
+
if (rawPath === undefined) {
|
|
164
|
+
throw invalidConfig("Webhook endpoints require a path.", { index });
|
|
165
|
+
}
|
|
166
|
+
const path = normalizePath(rawPath);
|
|
167
|
+
const mode = readEndpointMode(entry.mode, index, defaultMode);
|
|
168
|
+
const prompt = asOptionalString(entry.prompt);
|
|
169
|
+
const notify = asOptionalBoolean(entry.notify, "webhook.endpoints[].notify", { index });
|
|
170
|
+
const notifyConversationId = asOptionalString(entry.notifyConversationId);
|
|
171
|
+
const model = asOptionalString(entry.model);
|
|
172
|
+
const effort = asOptionalString(entry.effort);
|
|
173
|
+
const name = asOptionalString(entry.name) ?? deriveEndpointName(path);
|
|
174
|
+
const enabled = typeof entry.enabled === "boolean" ? entry.enabled : true;
|
|
175
|
+
return {
|
|
176
|
+
name,
|
|
177
|
+
path,
|
|
178
|
+
mode,
|
|
179
|
+
enabled,
|
|
180
|
+
...(prompt === undefined ? {} : { prompt }),
|
|
181
|
+
...(notify === undefined ? {} : { notify }),
|
|
182
|
+
...(notifyConversationId === undefined ? {} : { notifyConversationId }),
|
|
183
|
+
...(model === undefined ? {} : { model }),
|
|
184
|
+
...(effort === undefined ? {} : { effort }),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function readEndpointMode(value, index, defaultMode) {
|
|
188
|
+
const mode = asOptionalString(value);
|
|
189
|
+
if (mode === undefined) {
|
|
190
|
+
return defaultMode;
|
|
191
|
+
}
|
|
192
|
+
if (mode !== "sync" && mode !== "async") {
|
|
193
|
+
throw invalidConfig("Webhook endpoint mode must be sync or async.", { index });
|
|
194
|
+
}
|
|
195
|
+
return mode;
|
|
196
|
+
}
|
|
197
|
+
/** Default an endpoint name to the last path segment (e.g. `/webhook/results` → `results`). */
|
|
198
|
+
function deriveEndpointName(path) {
|
|
199
|
+
const segments = path.split("/").filter((segment) => segment.length > 0);
|
|
200
|
+
return segments[segments.length - 1] ?? "default";
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* The `webhook` section's field registry: the single source of truth both the
|
|
204
|
+
* JSON→env layering below and the app's config provenance view derive from.
|
|
205
|
+
* Covers the single-endpoint fields (multi-endpoint `endpoints[]` and `dir`
|
|
206
|
+
* are read straight from JSON / their own env forms).
|
|
207
|
+
*/
|
|
208
|
+
export const WEBHOOK_CONFIG_FIELDS = [
|
|
209
|
+
{ id: "webhook.enabled", env: "MONO_AGENT_WEBHOOK_ENABLED", kind: "boolean", fromJson: (s) => s.enabled },
|
|
210
|
+
{ id: "webhook.dir", env: "MONO_AGENT_WEBHOOK_DIR", fromJson: (s) => s.dir },
|
|
211
|
+
{ id: "webhook.host", env: "MONO_AGENT_WEBHOOK_HOST", fromJson: (s) => s.host },
|
|
212
|
+
{ id: "webhook.port", env: "MONO_AGENT_WEBHOOK_PORT", kind: "integer", fromJson: (s) => s.port },
|
|
213
|
+
{ id: "webhook.path", env: "MONO_AGENT_WEBHOOK_PATH", fromJson: (s) => s.path },
|
|
214
|
+
{ id: "webhook.prompt", env: "MONO_AGENT_WEBHOOK_PROMPT", fromJson: (s) => s.prompt },
|
|
215
|
+
{ id: "webhook.notify", env: "MONO_AGENT_WEBHOOK_NOTIFY", kind: "boolean", fromJson: (s) => s.notify },
|
|
216
|
+
{ id: "webhook.notifyConversationId", env: "MONO_AGENT_WEBHOOK_NOTIFY_CONVERSATION_ID", fromJson: (s) => s.notifyConversationId },
|
|
217
|
+
{ id: "webhook.model", env: "MONO_AGENT_WEBHOOK_MODEL", fromJson: (s) => s.model },
|
|
218
|
+
{ id: "webhook.effort", env: "MONO_AGENT_WEBHOOK_EFFORT", fromJson: (s) => s.effort },
|
|
219
|
+
{ id: "webhook.allowNonLoopback", env: "MONO_AGENT_WEBHOOK_ALLOW_NON_LOOPBACK", kind: "boolean", fromJson: (s) => s.allowNonLoopback },
|
|
220
|
+
{ id: "webhook.defaultMode", env: "MONO_AGENT_WEBHOOK_DEFAULT_MODE", fromJson: (s) => s.defaultMode },
|
|
221
|
+
{ id: "webhook.retentionMs", env: "MONO_AGENT_WEBHOOK_RETENTION_MS", kind: "integer", fromJson: (s) => s.retentionMs },
|
|
222
|
+
{ id: "webhook.maxStoredRequests", env: "MONO_AGENT_WEBHOOK_MAX_STORED_REQUESTS", kind: "integer", fromJson: (s) => s.maxStoredRequests },
|
|
223
|
+
{ id: "webhook.maxRunMs", env: "MONO_AGENT_WEBHOOK_MAX_RUN_MS", kind: "integer", fromJson: (s) => s.maxRunMs },
|
|
224
|
+
];
|
|
225
|
+
function layerWebhookJsonOntoEnv(json, env) {
|
|
226
|
+
return layerJsonOntoEnv(env, fieldSpecMappings(readJsonSection(json, "webhook"), WEBHOOK_CONFIG_FIELDS));
|
|
227
|
+
}
|
|
228
|
+
/** Trim a JSON value to a non-empty string, treating non-strings as absent. */
|
|
229
|
+
function asOptionalString(value) {
|
|
230
|
+
return typeof value === "string" ? normalizeOptionalString(value) : undefined;
|
|
231
|
+
}
|
|
232
|
+
function asOptionalBoolean(value, field, details) {
|
|
233
|
+
if (value === undefined) {
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
if (typeof value !== "boolean") {
|
|
237
|
+
throw invalidConfig(`${field} must be a boolean.`, { ...details, value });
|
|
238
|
+
}
|
|
239
|
+
return value;
|
|
240
|
+
}
|
|
241
|
+
function isRecord(value) {
|
|
242
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
119
243
|
}
|
|
120
244
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { WebhookEndpointConfig } from "./config.js";
|
|
2
|
+
import { type WebhookInvocationMode } from "./server.js";
|
|
3
|
+
/**
|
|
4
|
+
* Load every `*.md` webhook endpoint in {@link dir}. A missing directory is not
|
|
5
|
+
* an error (returns `[]`); files are read in sorted filename order for a stable
|
|
6
|
+
* endpoint list. Two files that resolve to the same `name` are a hard error.
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadWebhookEndpointsFromDirectory(dir: string, defaultMode: WebhookInvocationMode): Promise<WebhookEndpointConfig[]>;
|
|
9
|
+
/**
|
|
10
|
+
* Parse one webhook endpoint markdown file: frontmatter holds the routing
|
|
11
|
+
* metadata and the markdown body is the `prompt` (pre-instructions). `name`
|
|
12
|
+
* defaults to the filename stem, `mode` to the shared default, and `enabled` to
|
|
13
|
+
* true. Unlike cron jobs, the body may be empty — an endpoint with no prompt
|
|
14
|
+
* just forwards the posted text unchanged.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseWebhookEndpointMarkdown(fileName: string, content: string, defaultMode: WebhookInvocationMode): WebhookEndpointConfig;
|
|
17
|
+
//# sourceMappingURL=endpoints-dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints-dir.d.ts","sourceRoot":"","sources":["../src/endpoints-dir.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAsC,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAU7F;;;;GAIG;AACH,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,qBAAqB,GACjC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAsClC;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,qBAAqB,GACjC,qBAAqB,CAgCvB"}
|