@mono-agent/messenger-adapter 0.21.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/dist/server.js ADDED
@@ -0,0 +1,155 @@
1
+ import { createServer } from "node:http";
2
+ import { assertMessengerBindAllowed } from "./config.js";
3
+ import { verifyMessengerSignature } from "./text.js";
4
+ const DEFAULT_MAX_BODY_BYTES = 1_048_576;
5
+ /**
6
+ * Meta webhook endpoint: `GET <path>` answers the `hub.challenge` handshake,
7
+ * `POST <path>` validates `X-Hub-Signature-256` over the raw body, and
8
+ * `GET <path>/health` reports liveness. Everything else is 404.
9
+ */
10
+ export function createMessengerWebhookServer(options) {
11
+ const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;
12
+ const healthPath = `${options.webhookPath}/health`;
13
+ let server;
14
+ let started = false;
15
+ const handle = (request, response) => {
16
+ const url = new URL(request.url ?? "/", "http://localhost");
17
+ const pathname = url.pathname.length > 1 ? url.pathname.replace(/\/+$/u, "") : url.pathname;
18
+ if (pathname === healthPath && request.method === "GET") {
19
+ sendJson(response, 200, { ok: true, channel: "messenger" });
20
+ return;
21
+ }
22
+ if (pathname !== options.webhookPath) {
23
+ sendText(response, 404, "Not found");
24
+ return;
25
+ }
26
+ if (request.method === "GET") {
27
+ const mode = url.searchParams.get("hub.mode");
28
+ const token = url.searchParams.get("hub.verify_token");
29
+ const challenge = url.searchParams.get("hub.challenge");
30
+ if (mode === "subscribe" && token !== null && token === options.verifyToken && challenge !== null) {
31
+ sendText(response, 200, challenge);
32
+ return;
33
+ }
34
+ options.logger?.warn?.("Messenger webhook verification rejected.", { mode });
35
+ sendText(response, 403, "Verification failed");
36
+ return;
37
+ }
38
+ if (request.method !== "POST") {
39
+ response.setHeader("allow", "GET, POST");
40
+ sendText(response, 405, "Method not allowed");
41
+ return;
42
+ }
43
+ readBody(request, maxBodyBytes).then((body) => {
44
+ if (body === undefined) {
45
+ sendText(response, 413, "Webhook body too large");
46
+ return;
47
+ }
48
+ const signature = request.headers["x-hub-signature-256"];
49
+ const header = Array.isArray(signature) ? signature[0] : signature;
50
+ if (header === undefined || header.length === 0) {
51
+ sendText(response, 400, "Missing signature");
52
+ return;
53
+ }
54
+ if (!verifyMessengerSignature(body, header, options.appSecret)) {
55
+ options.logger?.warn?.("Messenger webhook signature rejected.");
56
+ sendText(response, 401, "Invalid signature");
57
+ return;
58
+ }
59
+ let payload;
60
+ try {
61
+ payload = JSON.parse(body.toString("utf8"));
62
+ }
63
+ catch {
64
+ sendText(response, 400, "Invalid JSON");
65
+ return;
66
+ }
67
+ sendJson(response, 200, { status: "ok" });
68
+ Promise.resolve()
69
+ .then(() => options.onPayload(payload))
70
+ .catch((error) => {
71
+ options.logger?.error?.("Messenger webhook payload processing failed.", {
72
+ error: error instanceof Error ? error.message : String(error),
73
+ });
74
+ });
75
+ }).catch((error) => {
76
+ options.logger?.error?.("Messenger webhook request failed.", {
77
+ error: error instanceof Error ? error.message : String(error),
78
+ });
79
+ if (!response.headersSent) {
80
+ sendText(response, 400, "Bad request");
81
+ }
82
+ });
83
+ };
84
+ return {
85
+ async start() {
86
+ if (server !== undefined) {
87
+ throw new Error("Messenger webhook server already started.");
88
+ }
89
+ // Last gate before the socket exists: a contradictory config assembled
90
+ // programmatically cannot reach a public listener.
91
+ assertMessengerBindAllowed(options.host, options.allowNonLoopback);
92
+ const instance = createServer(handle);
93
+ server = instance;
94
+ instance.on("error", (error) => {
95
+ if (started) {
96
+ options.onServerError?.(error instanceof Error ? error.message : String(error));
97
+ }
98
+ });
99
+ await new Promise((resolvePromise, rejectPromise) => {
100
+ const onError = (error) => {
101
+ instance.off("listening", onListening);
102
+ rejectPromise(error);
103
+ };
104
+ const onListening = () => {
105
+ instance.off("error", onError);
106
+ resolvePromise();
107
+ };
108
+ instance.once("error", onError);
109
+ instance.once("listening", onListening);
110
+ instance.listen(options.port, options.host);
111
+ });
112
+ started = true;
113
+ const address = instance.address();
114
+ const port = typeof address === "object" && address !== null ? address.port : options.port;
115
+ return { host: options.host, port };
116
+ },
117
+ async stop() {
118
+ const instance = server;
119
+ if (instance === undefined) {
120
+ return;
121
+ }
122
+ server = undefined;
123
+ started = false;
124
+ instance.closeAllConnections?.();
125
+ await new Promise((resolvePromise) => {
126
+ instance.close(() => resolvePromise());
127
+ });
128
+ },
129
+ };
130
+ }
131
+ async function readBody(request, maxBytes) {
132
+ const chunks = [];
133
+ let total = 0;
134
+ for await (const chunk of request) {
135
+ const buffer = typeof chunk === "string" ? Buffer.from(chunk, "utf8") : Buffer.from(chunk);
136
+ total += buffer.byteLength;
137
+ if (total > maxBytes) {
138
+ request.destroy();
139
+ return undefined;
140
+ }
141
+ chunks.push(buffer);
142
+ }
143
+ return Buffer.concat(chunks);
144
+ }
145
+ function sendText(response, status, text) {
146
+ response.statusCode = status;
147
+ response.setHeader("content-type", "text/plain; charset=utf-8");
148
+ response.end(text);
149
+ }
150
+ function sendJson(response, status, body) {
151
+ response.statusCode = status;
152
+ response.setHeader("content-type", "application/json; charset=utf-8");
153
+ response.end(JSON.stringify(body));
154
+ }
155
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type ProcessJobProjection } from "@mono-agent/agent-contracts";
2
+ import { MessengerAdapter, type AgentResponder, type MessengerAdapterLogger, type MessengerAdapterMessages, type MessengerNotifyOptions, type MessengerNotifyResult } from "./adapter.js";
3
+ import { type MessengerAdapterConfig } from "./config.js";
4
+ import { type MessengerGraphClientLike } from "./graph-client.js";
5
+ import { type MessengerWebhookServer, type MessengerWebhookServerLogger, type MessengerWebhookServerOptions } from "./server.js";
6
+ export interface MessengerAdapterStartLogger extends MessengerAdapterLogger, MessengerWebhookServerLogger {
7
+ }
8
+ export interface StartMessengerAdapterOptions {
9
+ readonly config: MessengerAdapterConfig;
10
+ readonly responder: AgentResponder;
11
+ readonly logger?: MessengerAdapterStartLogger;
12
+ readonly messages?: MessengerAdapterMessages;
13
+ /** Injectable Graph client (tests); defaults to the real Send API client. */
14
+ readonly client?: MessengerGraphClientLike;
15
+ /** Injectable `fetch` for both the Graph client and attachment downloads. */
16
+ readonly fetch?: typeof fetch;
17
+ /** Injectable webhook server factory (tests). */
18
+ readonly createServer?: (options: MessengerWebhookServerOptions) => MessengerWebhookServer;
19
+ /** Reports a webhook server that died after start. */
20
+ readonly onServerError?: (reason: string) => void;
21
+ }
22
+ export interface MessengerAdapterStartResult {
23
+ readonly adapter: MessengerAdapter;
24
+ readonly host: string;
25
+ readonly port: number;
26
+ readonly webhookPath: string;
27
+ stop(): Promise<void>;
28
+ notify(userId: string, text: string, options?: MessengerNotifyOptions): Promise<MessengerNotifyResult>;
29
+ updateProcessJob(userId: string, projection: ProcessJobProjection): ReturnType<MessengerAdapter["updateProcessJob"]>;
30
+ }
31
+ /**
32
+ * Composition-root entrypoint: builds the Graph client, the adapter, and the
33
+ * webhook server, then starts listening. Fail-closed on a missing responder or
34
+ * an incomplete config.
35
+ */
36
+ export declare function startMessengerAdapter(options: StartMessengerAdapterOptions): Promise<MessengerAdapterStartResult>;
37
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAErG,OAAO,EACL,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAwB,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EACnC,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,2BAA4B,SAAQ,sBAAsB,EAAE,4BAA4B;CAAG;AAE5G,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IAC7C,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAC3C,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,iDAAiD;IACjD,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,6BAA6B,KAAK,sBAAsB,CAAC;IAC3F,sDAAsD;IACtD,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACvG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,GAAG,UAAU,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC;CACtH;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAkEvH"}
package/dist/start.js ADDED
@@ -0,0 +1,77 @@
1
+ import { AgentResponseCancelledError } from "@mono-agent/agent-contracts";
2
+ import { MessengerAdapter, } from "./adapter.js";
3
+ import { assertValidMessengerAdapterConfig, MessengerAdapterConfigError, } from "./config.js";
4
+ import { MessengerGraphClient } from "./graph-client.js";
5
+ import { createMessengerWebhookServer, } from "./server.js";
6
+ /**
7
+ * Composition-root entrypoint: builds the Graph client, the adapter, and the
8
+ * webhook server, then starts listening. Fail-closed on a missing responder or
9
+ * an incomplete config.
10
+ */
11
+ export async function startMessengerAdapter(options) {
12
+ if (typeof options.responder?.respond !== "function") {
13
+ throw new MessengerAdapterConfigError("missing_required_config", "startMessengerAdapter requires a responder.");
14
+ }
15
+ const { config } = options;
16
+ if (!config.enabled) {
17
+ throw new MessengerAdapterConfigError("missing_required_config", "startMessengerAdapter requires an enabled config.");
18
+ }
19
+ // The loader is not the only way to reach here: a caller can hand us a
20
+ // programmatically built config that never passed validation. Re-check the
21
+ // whole thing (secrets, allowlist, non-loopback opt-in, proactive tag).
22
+ assertValidMessengerAdapterConfig(config);
23
+ const client = options.client ?? new MessengerGraphClient({
24
+ pageAccessToken: config.pageAccessToken,
25
+ apiVersion: config.apiVersion,
26
+ ...(options.fetch === undefined ? {} : { fetch: options.fetch }),
27
+ ...(options.logger === undefined ? {} : { logger: options.logger }),
28
+ });
29
+ const adapter = new MessengerAdapter({
30
+ client,
31
+ responder: options.responder,
32
+ allowedUserIds: [...config.allowedUserIds],
33
+ allowAllUsers: config.allowAllUsers,
34
+ proactive: {
35
+ messagingType: config.proactiveMessagingType,
36
+ ...(config.proactiveTag === undefined ? {} : { tag: config.proactiveTag }),
37
+ },
38
+ ...(options.fetch === undefined ? {} : { attachments: { fetch: options.fetch } }),
39
+ ...(options.messages === undefined ? {} : { messages: options.messages }),
40
+ ...(options.logger === undefined ? {} : { logger: options.logger }),
41
+ });
42
+ const createServer = options.createServer ?? createMessengerWebhookServer;
43
+ const server = createServer({
44
+ host: config.host,
45
+ port: config.port,
46
+ webhookPath: config.webhookPath,
47
+ verifyToken: config.verifyToken,
48
+ appSecret: config.appSecret,
49
+ allowNonLoopback: config.allowNonLoopback,
50
+ onPayload: (payload) => adapter.handleWebhookPayload(payload),
51
+ ...(options.logger === undefined ? {} : { logger: options.logger }),
52
+ ...(options.onServerError === undefined ? {} : { onServerError: options.onServerError }),
53
+ });
54
+ const listening = await server.start();
55
+ options.logger?.info?.("Messenger webhook listening.", {
56
+ host: listening.host,
57
+ port: listening.port,
58
+ path: config.webhookPath,
59
+ });
60
+ let stopPromise;
61
+ return {
62
+ adapter,
63
+ host: listening.host,
64
+ port: listening.port,
65
+ webhookPath: config.webhookPath,
66
+ stop() {
67
+ stopPromise ??= (async () => {
68
+ await server.stop();
69
+ adapter.stop(new AgentResponseCancelledError("Messenger adapter stopped."));
70
+ })();
71
+ return stopPromise;
72
+ },
73
+ notify: (userId, text, notifyOptions) => adapter.notify(userId, text, notifyOptions),
74
+ updateProcessJob: (userId, projection) => adapter.updateProcessJob(userId, projection),
75
+ };
76
+ }
77
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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"}
package/dist/text.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /** Messenger Send API text limit per message. */
2
+ export declare const MESSENGER_MAX_MESSAGE_CHARS = 2000;
3
+ /**
4
+ * Verify Meta's `X-Hub-Signature-256` header: `sha256=<hex HMAC-SHA256 of the
5
+ * raw body keyed by the app secret>`. Constant-time on the digest comparison.
6
+ */
7
+ export declare function verifyMessengerSignature(body: Uint8Array, signatureHeader: string | undefined, appSecret: string): boolean;
8
+ /** Messenger renders plain text only; flatten common Markdown to readable text. */
9
+ export declare function stripMarkdownForMessenger(text: string): string;
10
+ /**
11
+ * Split text into Send API chunks of at most `maxChars` code points, preferring
12
+ * paragraph, line, then word boundaries; a boundary earlier than 65% of the
13
+ * window falls back to a hard cut so one long token cannot stall splitting.
14
+ */
15
+ export declare function splitForMessenger(text: string, maxChars?: number): string[];
16
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAEA,iDAAiD;AACjD,eAAO,MAAM,2BAA2B,OAAQ,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,UAAU,EAChB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,GAChB,OAAO,CAcT;AAYD,mFAAmF;AACnF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAc9D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAoC,GAAG,MAAM,EAAE,CA+BxG"}
package/dist/text.js ADDED
@@ -0,0 +1,103 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
2
+ /** Messenger Send API text limit per message. */
3
+ export const MESSENGER_MAX_MESSAGE_CHARS = 2_000;
4
+ /**
5
+ * Verify Meta's `X-Hub-Signature-256` header: `sha256=<hex HMAC-SHA256 of the
6
+ * raw body keyed by the app secret>`. Constant-time on the digest comparison.
7
+ */
8
+ export function verifyMessengerSignature(body, signatureHeader, appSecret) {
9
+ if (body.byteLength === 0 || signatureHeader === undefined || appSecret.length === 0) {
10
+ return false;
11
+ }
12
+ const header = signatureHeader.trim();
13
+ if (!header.startsWith("sha256=")) {
14
+ return false;
15
+ }
16
+ const provided = header.slice("sha256=".length).toLowerCase();
17
+ const expected = createHmac("sha256", appSecret).update(body).digest("hex");
18
+ if (provided.length !== expected.length) {
19
+ return false;
20
+ }
21
+ return timingSafeEqual(Buffer.from(provided, "utf8"), Buffer.from(expected, "utf8"));
22
+ }
23
+ const CODE_BLOCK = /```[A-Za-z0-9_-]*\n?([\s\S]*?)```/gu;
24
+ const INLINE_CODE = /`([^`\n]+)`/gu;
25
+ const LINK = /\[([^\]]+)\]\(([^)\s]+)\)/gu;
26
+ const BOLD_STAR = /\*\*([^*]+)\*\*/gu;
27
+ const BOLD_UNDERSCORE = /__([^_]+)__/gu;
28
+ const ITALIC_STAR = /(?<![\w*])\*([^*\n]+)\*(?![\w*])/gu;
29
+ const ITALIC_UNDERSCORE = /(?<![\w_])_([^_\n]+)_(?![\w_])/gu;
30
+ const HEADING = /^#{1,6}\s+/gmu;
31
+ const BULLET = /^(\s*)[-*+]\s+/gmu;
32
+ /** Messenger renders plain text only; flatten common Markdown to readable text. */
33
+ export function stripMarkdownForMessenger(text) {
34
+ if (text.length === 0) {
35
+ return "";
36
+ }
37
+ return text
38
+ .replace(CODE_BLOCK, (_match, code) => code.replace(/\n+$/u, ""))
39
+ .replace(INLINE_CODE, "$1")
40
+ .replace(LINK, "$1 ($2)")
41
+ .replace(BOLD_STAR, "$1")
42
+ .replace(BOLD_UNDERSCORE, "$1")
43
+ .replace(ITALIC_STAR, "$1")
44
+ .replace(ITALIC_UNDERSCORE, "$1")
45
+ .replace(HEADING, "")
46
+ .replace(BULLET, "$1• ");
47
+ }
48
+ /**
49
+ * Split text into Send API chunks of at most `maxChars` code points, preferring
50
+ * paragraph, line, then word boundaries; a boundary earlier than 65% of the
51
+ * window falls back to a hard cut so one long token cannot stall splitting.
52
+ */
53
+ export function splitForMessenger(text, maxChars = MESSENGER_MAX_MESSAGE_CHARS) {
54
+ if (!Number.isInteger(maxChars) || maxChars < 32) {
55
+ throw new RangeError("maxChars must be an integer of at least 32.");
56
+ }
57
+ const points = Array.from(text);
58
+ if (points.length <= maxChars) {
59
+ return [text];
60
+ }
61
+ const chunks = [];
62
+ let remaining = points;
63
+ while (remaining.length > 0) {
64
+ if (remaining.length <= maxChars) {
65
+ chunks.push(remaining.join(""));
66
+ break;
67
+ }
68
+ const window = remaining.slice(0, maxChars);
69
+ let splitAt = Math.max(lastIndexOfSequence(window, ["\n", "\n"]), window.lastIndexOf("\n"), window.lastIndexOf(" "));
70
+ if (splitAt < Math.floor(maxChars * 0.65)) {
71
+ splitAt = maxChars;
72
+ }
73
+ const chunk = remaining.slice(0, splitAt).join("").replace(/\s+$/u, "");
74
+ if (chunk.length > 0) {
75
+ chunks.push(chunk);
76
+ }
77
+ remaining = trimLeadingWhitespace(remaining.slice(splitAt));
78
+ }
79
+ return chunks.length === 0 ? [""] : chunks;
80
+ }
81
+ function lastIndexOfSequence(points, sequence) {
82
+ for (let index = points.length - sequence.length; index >= 0; index -= 1) {
83
+ let matches = true;
84
+ for (let offset = 0; offset < sequence.length; offset += 1) {
85
+ if (points[index + offset] !== sequence[offset]) {
86
+ matches = false;
87
+ break;
88
+ }
89
+ }
90
+ if (matches) {
91
+ return index;
92
+ }
93
+ }
94
+ return -1;
95
+ }
96
+ function trimLeadingWhitespace(points) {
97
+ let start = 0;
98
+ while (start < points.length && /^\s$/u.test(points[start] ?? "")) {
99
+ start += 1;
100
+ }
101
+ return points.slice(start);
102
+ }
103
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@mono-agent/messenger-adapter",
3
+ "version": "0.21.0",
4
+ "description": "Facebook Messenger communication adapter for host-compatible runtimes using the Meta Graph API webhook and Send API.",
5
+ "type": "module",
6
+ "license": "GPL-3.0-only",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/robertsreberski/mono-agent.git",
10
+ "directory": "extras/messenger-adapter"
11
+ },
12
+ "private": false,
13
+ "engines": {
14
+ "node": ">=24.15.0"
15
+ },
16
+ "main": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md"
27
+ ],
28
+ "dependencies": {
29
+ "@mono-agent/agent-contracts": "0.21.0"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc -p tsconfig.build.json",
36
+ "typecheck": "tsc -p tsconfig.json --noEmit",
37
+ "test": "vitest run"
38
+ }
39
+ }