@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.
@@ -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, webhookFieldGroup, } from "./config.js";
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
@@ -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,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,6BAA6B,EAC7B,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
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, webhookFieldGroup, } from "./config.js";
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;AAcrB,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,GAClB,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
@@ -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;CACpC;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;QACzC,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACjC,CAAC;CACH;AAED,MAAM,MAAM,uBAAuB,GAC/B;IACE,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEN;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAClE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACjE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACnE;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,wBAAwB,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;IAChG,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;CACxC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAAC;IAClE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,MAAM,uBAAuB,GAC/B,gBAAgB,GAChB,yBAAyB,GACzB,aAAa,GACb,cAAc,CAAC;AAEnB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;gBAEjC,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,0BAA+B;CAMrG;AA0BD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAkK5G"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}