@songsid/agend 0.0.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.
Files changed (232) hide show
  1. package/README.md +210 -0
  2. package/README.zh-TW.md +134 -0
  3. package/dist/access-path.d.ts +10 -0
  4. package/dist/access-path.js +32 -0
  5. package/dist/access-path.js.map +1 -0
  6. package/dist/adapter-world.d.ts +25 -0
  7. package/dist/adapter-world.js +41 -0
  8. package/dist/adapter-world.js.map +1 -0
  9. package/dist/agent-cli-instructions.md +50 -0
  10. package/dist/agent-cli.d.ts +2 -0
  11. package/dist/agent-cli.js +200 -0
  12. package/dist/agent-cli.js.map +1 -0
  13. package/dist/agent-endpoint.d.ts +25 -0
  14. package/dist/agent-endpoint.js +162 -0
  15. package/dist/agent-endpoint.js.map +1 -0
  16. package/dist/backend/antigravity.d.ts +17 -0
  17. package/dist/backend/antigravity.js +98 -0
  18. package/dist/backend/antigravity.js.map +1 -0
  19. package/dist/backend/claude-code.d.ts +23 -0
  20. package/dist/backend/claude-code.js +171 -0
  21. package/dist/backend/claude-code.js.map +1 -0
  22. package/dist/backend/codex.d.ts +18 -0
  23. package/dist/backend/codex.js +160 -0
  24. package/dist/backend/codex.js.map +1 -0
  25. package/dist/backend/factory.d.ts +2 -0
  26. package/dist/backend/factory.js +28 -0
  27. package/dist/backend/factory.js.map +1 -0
  28. package/dist/backend/gemini-cli.d.ts +17 -0
  29. package/dist/backend/gemini-cli.js +163 -0
  30. package/dist/backend/gemini-cli.js.map +1 -0
  31. package/dist/backend/index.d.ts +7 -0
  32. package/dist/backend/index.js +7 -0
  33. package/dist/backend/index.js.map +1 -0
  34. package/dist/backend/kiro.d.ts +17 -0
  35. package/dist/backend/kiro.js +147 -0
  36. package/dist/backend/kiro.js.map +1 -0
  37. package/dist/backend/marker-utils.d.ts +13 -0
  38. package/dist/backend/marker-utils.js +64 -0
  39. package/dist/backend/marker-utils.js.map +1 -0
  40. package/dist/backend/mock.d.ts +25 -0
  41. package/dist/backend/mock.js +85 -0
  42. package/dist/backend/mock.js.map +1 -0
  43. package/dist/backend/opencode.d.ts +16 -0
  44. package/dist/backend/opencode.js +136 -0
  45. package/dist/backend/opencode.js.map +1 -0
  46. package/dist/backend/types.d.ts +86 -0
  47. package/dist/backend/types.js +33 -0
  48. package/dist/backend/types.js.map +1 -0
  49. package/dist/channel/access-manager.d.ts +18 -0
  50. package/dist/channel/access-manager.js +153 -0
  51. package/dist/channel/access-manager.js.map +1 -0
  52. package/dist/channel/adapters/telegram.d.ts +63 -0
  53. package/dist/channel/adapters/telegram.js +646 -0
  54. package/dist/channel/adapters/telegram.js.map +1 -0
  55. package/dist/channel/attachment-handler.d.ts +15 -0
  56. package/dist/channel/attachment-handler.js +88 -0
  57. package/dist/channel/attachment-handler.js.map +1 -0
  58. package/dist/channel/factory.d.ts +12 -0
  59. package/dist/channel/factory.js +67 -0
  60. package/dist/channel/factory.js.map +1 -0
  61. package/dist/channel/ipc-bridge.d.ts +26 -0
  62. package/dist/channel/ipc-bridge.js +220 -0
  63. package/dist/channel/ipc-bridge.js.map +1 -0
  64. package/dist/channel/mcp-server.d.ts +10 -0
  65. package/dist/channel/mcp-server.js +288 -0
  66. package/dist/channel/mcp-server.js.map +1 -0
  67. package/dist/channel/mcp-tools.d.ts +17 -0
  68. package/dist/channel/mcp-tools.js +110 -0
  69. package/dist/channel/mcp-tools.js.map +1 -0
  70. package/dist/channel/message-bus.d.ts +17 -0
  71. package/dist/channel/message-bus.js +86 -0
  72. package/dist/channel/message-bus.js.map +1 -0
  73. package/dist/channel/message-queue.d.ts +39 -0
  74. package/dist/channel/message-queue.js +253 -0
  75. package/dist/channel/message-queue.js.map +1 -0
  76. package/dist/channel/tool-router.d.ts +6 -0
  77. package/dist/channel/tool-router.js +75 -0
  78. package/dist/channel/tool-router.js.map +1 -0
  79. package/dist/channel/tool-tracker.d.ts +13 -0
  80. package/dist/channel/tool-tracker.js +58 -0
  81. package/dist/channel/tool-tracker.js.map +1 -0
  82. package/dist/channel/types.d.ts +118 -0
  83. package/dist/channel/types.js +2 -0
  84. package/dist/channel/types.js.map +1 -0
  85. package/dist/chat-export.d.ts +4 -0
  86. package/dist/chat-export.js +91 -0
  87. package/dist/chat-export.js.map +1 -0
  88. package/dist/classic-channel-manager.d.ts +59 -0
  89. package/dist/classic-channel-manager.js +193 -0
  90. package/dist/classic-channel-manager.js.map +1 -0
  91. package/dist/cli.d.ts +2 -0
  92. package/dist/cli.js +1833 -0
  93. package/dist/cli.js.map +1 -0
  94. package/dist/config.d.ts +9 -0
  95. package/dist/config.js +118 -0
  96. package/dist/config.js.map +1 -0
  97. package/dist/context-guardian.d.ts +26 -0
  98. package/dist/context-guardian.js +73 -0
  99. package/dist/context-guardian.js.map +1 -0
  100. package/dist/cost-guard.d.ts +36 -0
  101. package/dist/cost-guard.js +147 -0
  102. package/dist/cost-guard.js.map +1 -0
  103. package/dist/daemon-entry.d.ts +1 -0
  104. package/dist/daemon-entry.js +29 -0
  105. package/dist/daemon-entry.js.map +1 -0
  106. package/dist/daemon.d.ts +152 -0
  107. package/dist/daemon.js +1714 -0
  108. package/dist/daemon.js.map +1 -0
  109. package/dist/daily-summary.d.ts +13 -0
  110. package/dist/daily-summary.js +55 -0
  111. package/dist/daily-summary.js.map +1 -0
  112. package/dist/event-log.d.ts +36 -0
  113. package/dist/event-log.js +100 -0
  114. package/dist/event-log.js.map +1 -0
  115. package/dist/export-import.d.ts +2 -0
  116. package/dist/export-import.js +162 -0
  117. package/dist/export-import.js.map +1 -0
  118. package/dist/fleet-context.d.ts +61 -0
  119. package/dist/fleet-context.js +4 -0
  120. package/dist/fleet-context.js.map +1 -0
  121. package/dist/fleet-dashboard-html.d.ts +6 -0
  122. package/dist/fleet-dashboard-html.js +443 -0
  123. package/dist/fleet-dashboard-html.js.map +1 -0
  124. package/dist/fleet-health-server.d.ts +35 -0
  125. package/dist/fleet-health-server.js +290 -0
  126. package/dist/fleet-health-server.js.map +1 -0
  127. package/dist/fleet-instructions.d.ts +5 -0
  128. package/dist/fleet-instructions.js +161 -0
  129. package/dist/fleet-instructions.js.map +1 -0
  130. package/dist/fleet-manager.d.ts +212 -0
  131. package/dist/fleet-manager.js +3655 -0
  132. package/dist/fleet-manager.js.map +1 -0
  133. package/dist/fleet-rpc-handlers.d.ts +42 -0
  134. package/dist/fleet-rpc-handlers.js +356 -0
  135. package/dist/fleet-rpc-handlers.js.map +1 -0
  136. package/dist/fleet-system-prompt.d.ts +11 -0
  137. package/dist/fleet-system-prompt.js +61 -0
  138. package/dist/fleet-system-prompt.js.map +1 -0
  139. package/dist/general-knowledge/skills.md +177 -0
  140. package/dist/hang-detector.d.ts +16 -0
  141. package/dist/hang-detector.js +53 -0
  142. package/dist/hang-detector.js.map +1 -0
  143. package/dist/index.d.ts +8 -0
  144. package/dist/index.js +6 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/instance-lifecycle.d.ts +90 -0
  147. package/dist/instance-lifecycle.js +592 -0
  148. package/dist/instance-lifecycle.js.map +1 -0
  149. package/dist/instructions.d.ts +15 -0
  150. package/dist/instructions.js +90 -0
  151. package/dist/instructions.js.map +1 -0
  152. package/dist/logger.d.ts +7 -0
  153. package/dist/logger.js +84 -0
  154. package/dist/logger.js.map +1 -0
  155. package/dist/outbound-handlers.d.ts +51 -0
  156. package/dist/outbound-handlers.js +739 -0
  157. package/dist/outbound-handlers.js.map +1 -0
  158. package/dist/outbound-schemas.d.ts +238 -0
  159. package/dist/outbound-schemas.js +248 -0
  160. package/dist/outbound-schemas.js.map +1 -0
  161. package/dist/paths.d.ts +10 -0
  162. package/dist/paths.js +42 -0
  163. package/dist/paths.js.map +1 -0
  164. package/dist/plugin/agend/.claude-plugin/plugin.json +5 -0
  165. package/dist/quickstart.d.ts +1 -0
  166. package/dist/quickstart.js +595 -0
  167. package/dist/quickstart.js.map +1 -0
  168. package/dist/routing-engine.d.ts +22 -0
  169. package/dist/routing-engine.js +44 -0
  170. package/dist/routing-engine.js.map +1 -0
  171. package/dist/safe-async.d.ts +6 -0
  172. package/dist/safe-async.js +20 -0
  173. package/dist/safe-async.js.map +1 -0
  174. package/dist/scheduler/db.d.ts +37 -0
  175. package/dist/scheduler/db.js +360 -0
  176. package/dist/scheduler/db.js.map +1 -0
  177. package/dist/scheduler/db.test.d.ts +1 -0
  178. package/dist/scheduler/db.test.js +92 -0
  179. package/dist/scheduler/db.test.js.map +1 -0
  180. package/dist/scheduler/index.d.ts +4 -0
  181. package/dist/scheduler/index.js +4 -0
  182. package/dist/scheduler/index.js.map +1 -0
  183. package/dist/scheduler/scheduler.d.ts +44 -0
  184. package/dist/scheduler/scheduler.js +197 -0
  185. package/dist/scheduler/scheduler.js.map +1 -0
  186. package/dist/scheduler/scheduler.test.d.ts +1 -0
  187. package/dist/scheduler/scheduler.test.js +119 -0
  188. package/dist/scheduler/scheduler.test.js.map +1 -0
  189. package/dist/scheduler/types.d.ts +107 -0
  190. package/dist/scheduler/types.js +7 -0
  191. package/dist/scheduler/types.js.map +1 -0
  192. package/dist/service-installer.d.ts +17 -0
  193. package/dist/service-installer.js +182 -0
  194. package/dist/service-installer.js.map +1 -0
  195. package/dist/setup-wizard.d.ts +48 -0
  196. package/dist/setup-wizard.js +701 -0
  197. package/dist/setup-wizard.js.map +1 -0
  198. package/dist/statusline-watcher.d.ts +34 -0
  199. package/dist/statusline-watcher.js +73 -0
  200. package/dist/statusline-watcher.js.map +1 -0
  201. package/dist/stt.d.ts +10 -0
  202. package/dist/stt.js +33 -0
  203. package/dist/stt.js.map +1 -0
  204. package/dist/tmux-control.d.ts +52 -0
  205. package/dist/tmux-control.js +207 -0
  206. package/dist/tmux-control.js.map +1 -0
  207. package/dist/tmux-manager.d.ts +44 -0
  208. package/dist/tmux-manager.js +218 -0
  209. package/dist/tmux-manager.js.map +1 -0
  210. package/dist/topic-archiver.d.ts +40 -0
  211. package/dist/topic-archiver.js +103 -0
  212. package/dist/topic-archiver.js.map +1 -0
  213. package/dist/topic-commands.d.ts +28 -0
  214. package/dist/topic-commands.js +359 -0
  215. package/dist/topic-commands.js.map +1 -0
  216. package/dist/transcript-monitor.d.ts +23 -0
  217. package/dist/transcript-monitor.js +164 -0
  218. package/dist/transcript-monitor.js.map +1 -0
  219. package/dist/types.d.ts +211 -0
  220. package/dist/types.js +2 -0
  221. package/dist/types.js.map +1 -0
  222. package/dist/ui/dashboard.html +719 -0
  223. package/dist/web-api.d.ts +101 -0
  224. package/dist/web-api.js +648 -0
  225. package/dist/web-api.js.map +1 -0
  226. package/dist/webhook-emitter.d.ts +15 -0
  227. package/dist/webhook-emitter.js +41 -0
  228. package/dist/webhook-emitter.js.map +1 -0
  229. package/dist/workflow-templates/default.md +35 -0
  230. package/package.json +76 -0
  231. package/templates/launchd.plist.ejs +31 -0
  232. package/templates/systemd.service.ejs +16 -0
@@ -0,0 +1,90 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export function buildFleetInstructions(params) {
5
+ const { instanceName, workingDirectory, displayName, description, customPrompt } = params;
6
+ const sections = [];
7
+ // ── Identity ──
8
+ sections.push(`# AgEnD Fleet Context\nYou are **${instanceName}**, an instance in an AgEnD fleet.\nYour working directory is \`${workingDirectory}\`.`);
9
+ if (displayName) {
10
+ sections.push(`Your display name is "${displayName}". Use this when introducing yourself.`);
11
+ }
12
+ else {
13
+ sections.push("You don't have a display name yet. Use set_display_name to choose one that reflects your personality.");
14
+ }
15
+ if (description) {
16
+ sections.push(`## Role\n${description}`);
17
+ }
18
+ // ── Message format & tool usage ──
19
+ if (params.cliInstructions) {
20
+ // CLI mode: inject CLI quick reference
21
+ sections.push(params.cliInstructions);
22
+ }
23
+ else {
24
+ // MCP mode: inject MCP tool usage instructions
25
+ sections.push([
26
+ "## Message Format",
27
+ "- `[user:name]` — from a Telegram/Discord user → reply with the `reply` tool.",
28
+ "- `[from:instance-name]` — from another fleet instance → reply with `send_to_instance`, NOT the reply tool.",
29
+ "",
30
+ "**Always use the `reply` tool for ALL responses to users.** Do not respond directly in the terminal.",
31
+ "",
32
+ "## Tool Usage",
33
+ "- reply: respond to users. react: emoji reactions. edit_message: update a sent message. download_attachment: fetch files.",
34
+ "- If the inbound message has image_path, Read that file — it is a photo.",
35
+ "- If the inbound message has attachment_file_id, call download_attachment then Read the returned path.",
36
+ "- If the inbound message has reply_to_text, the user is quoting a previous message.",
37
+ "- Use list_instances to discover fleet members. Use describe_instance for details.",
38
+ "- High-level collaboration: request_information (ask), delegate_task (assign), report_result (return results with correlation_id).",
39
+ "",
40
+ "## Collaboration Rules",
41
+ "1. Use fleet tools for cross-instance communication. Never assume direct file access to another instance's repo.",
42
+ "2. Cross-instance messages appear as `[from:instance-name]`. Reply via send_to_instance or report_result, NOT reply.",
43
+ "3. Use list_instances to discover available instances before sending messages.",
44
+ "4. You only have direct access to files under your own working directory.",
45
+ "5. Task flow: `delegate_task` → silent work → `report_result`. Zero messages in between. Never send ack/confirmation.",
46
+ ].join("\n"));
47
+ }
48
+ // ── Workflow template ──
49
+ if (params.workflow !== false) {
50
+ let workflowContent = null;
51
+ if (params.workflow) {
52
+ workflowContent = params.workflow;
53
+ }
54
+ else {
55
+ try {
56
+ const here = dirname(fileURLToPath(import.meta.url));
57
+ workflowContent = readFileSync(join(here, "workflow-templates/default.md"), "utf-8");
58
+ }
59
+ catch { /* template not found — skip */ }
60
+ }
61
+ if (workflowContent) {
62
+ const trimmed = workflowContent.trim();
63
+ if (trimmed.startsWith("#")) {
64
+ sections.push(trimmed);
65
+ }
66
+ else {
67
+ sections.push(`## Development Workflow\n\n${trimmed}`);
68
+ }
69
+ }
70
+ }
71
+ // ── Active decisions ──
72
+ const decisions = params.decisions;
73
+ if (decisions && decisions.length > 0) {
74
+ const MAX = 15;
75
+ const lines = decisions.slice(0, MAX).map(d => {
76
+ const firstLine = (d.content ?? "").split(/[.\n]/)[0].trim().slice(0, 120);
77
+ return `- **${d.title}**: ${firstLine}`;
78
+ });
79
+ if (decisions.length > MAX) {
80
+ lines.push(`- *(${decisions.length - MAX} more — use \`list_decisions\` to see all)*`);
81
+ }
82
+ sections.push(`## Active Decisions\n\n${lines.join("\n")}`);
83
+ }
84
+ // ── Custom user prompt ──
85
+ if (customPrompt) {
86
+ sections.push(customPrompt);
87
+ }
88
+ return sections.join("\n\n");
89
+ }
90
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import pino from "pino";
2
+ /** Truncate log to tail when it exceeds MAX_LOG_SIZE (no rotation/backup files) */
3
+ export declare function truncateLogIfNeeded(logPath: string): void;
4
+ /** Rotate a log file: foo.log → foo.log.1 → foo.log.2 → foo.log.3 (deleted) */
5
+ export declare function rotateLogIfNeeded(logPath: string, maxSize?: number, maxFiles?: number): void;
6
+ export declare function createLogger(level?: string): pino.Logger<never, boolean>;
7
+ export type Logger = ReturnType<typeof createLogger>;
package/dist/logger.js ADDED
@@ -0,0 +1,84 @@
1
+ import pino from "pino";
2
+ import { join } from "node:path";
3
+ import { mkdirSync, statSync, readFileSync, writeFileSync, renameSync, unlinkSync, existsSync } from "node:fs";
4
+ import { getAgendHome } from "./paths.js";
5
+ const DATA_DIR = getAgendHome();
6
+ const LOG_FILE = join(DATA_DIR, "daemon.log");
7
+ const MAX_LOG_SIZE = 10 * 1024 * 1024; // 10 MB
8
+ const TRUNCATE_TO = 5 * 1024 * 1024; // keep last 5 MB
9
+ const ROTATE_MAX_FILES = 3;
10
+ /** Truncate log to tail when it exceeds MAX_LOG_SIZE (no rotation/backup files) */
11
+ export function truncateLogIfNeeded(logPath) {
12
+ try {
13
+ const stat = statSync(logPath);
14
+ if (stat.size < MAX_LOG_SIZE)
15
+ return;
16
+ const buf = readFileSync(logPath);
17
+ const tail = buf.subarray(buf.length - TRUNCATE_TO);
18
+ const nl = tail.indexOf(0x0a);
19
+ writeFileSync(logPath, nl >= 0 ? tail.subarray(nl + 1) : tail);
20
+ }
21
+ catch { /* file may not exist yet */ }
22
+ }
23
+ /** Rotate a log file: foo.log → foo.log.1 → foo.log.2 → foo.log.3 (deleted) */
24
+ export function rotateLogIfNeeded(logPath, maxSize = MAX_LOG_SIZE, maxFiles = ROTATE_MAX_FILES) {
25
+ try {
26
+ if (!existsSync(logPath))
27
+ return;
28
+ const stat = statSync(logPath);
29
+ if (stat.size < maxSize)
30
+ return;
31
+ // Shift existing rotated files
32
+ for (let i = maxFiles; i >= 1; i--) {
33
+ const src = i === 1 ? logPath : `${logPath}.${i - 1}`;
34
+ const dst = `${logPath}.${i}`;
35
+ if (i === maxFiles) {
36
+ try {
37
+ unlinkSync(dst);
38
+ }
39
+ catch { }
40
+ }
41
+ if (existsSync(src)) {
42
+ try {
43
+ renameSync(src, dst);
44
+ }
45
+ catch { }
46
+ }
47
+ }
48
+ // Truncate current log
49
+ writeFileSync(logPath, "");
50
+ }
51
+ catch { /* best effort */ }
52
+ }
53
+ export function createLogger(level = "info") {
54
+ mkdirSync(DATA_DIR, { recursive: true });
55
+ truncateLogIfNeeded(LOG_FILE);
56
+ return pino({
57
+ level,
58
+ transport: {
59
+ targets: [
60
+ {
61
+ target: "pino-pretty",
62
+ options: {
63
+ destination: 1,
64
+ colorize: true,
65
+ translateTime: "SYS:HH:MM:ss",
66
+ ignore: "pid,hostname",
67
+ },
68
+ level,
69
+ },
70
+ {
71
+ target: "pino-pretty",
72
+ options: {
73
+ destination: LOG_FILE,
74
+ colorize: false,
75
+ translateTime: "SYS:HH:MM:ss",
76
+ ignore: "pid,hostname",
77
+ },
78
+ level,
79
+ },
80
+ ],
81
+ },
82
+ });
83
+ }
84
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { FleetConfig, InstanceConfig } from "./types.js";
2
+ import type { ChannelAdapter } from "./channel/types.js";
3
+ import type { IpcClient } from "./channel/ipc-bridge.js";
4
+ import type { Logger } from "./logger.js";
5
+ import type { RoutingEngine } from "./routing-engine.js";
6
+ import type { InstanceLifecycle } from "./instance-lifecycle.js";
7
+ import type { EventLog } from "./event-log.js";
8
+ /** Shared context available to all outbound tool handlers. */
9
+ export interface OutboundContext {
10
+ readonly fleetConfig: FleetConfig | null;
11
+ readonly adapter: ChannelAdapter | null;
12
+ readonly adapters?: Map<string, ChannelAdapter>;
13
+ readonly logger: Logger;
14
+ readonly routing: RoutingEngine;
15
+ readonly instanceIpcClients: Map<string, IpcClient>;
16
+ readonly lifecycle: InstanceLifecycle;
17
+ readonly sessionRegistry: Map<string, string>;
18
+ readonly eventLog: EventLog | null;
19
+ readonly classicChannels: {
20
+ getAll(): {
21
+ instanceName: string;
22
+ name: string;
23
+ backend?: string;
24
+ channelId: string;
25
+ }[];
26
+ } | null;
27
+ lastActivityMs(name: string): number;
28
+ startInstance(name: string, config: InstanceConfig, topicMode: boolean): Promise<void>;
29
+ restartSingleInstance(name: string): Promise<void>;
30
+ connectIpcToInstance(name: string): Promise<void>;
31
+ saveFleetConfig(): void;
32
+ queueMirrorMessage?(text: string): void;
33
+ getAdapterForInstance?(name: string): ChannelAdapter | null;
34
+ getChannelConfig?(adapterId?: string): import("./types.js").ChannelConfig | undefined;
35
+ getGroupIdForInstance?(name: string): string;
36
+ getWorldForInstance?(name: string): {
37
+ id: string;
38
+ adapter: ChannelAdapter;
39
+ } | undefined;
40
+ }
41
+ /** Metadata extracted from the raw outbound message. */
42
+ export interface OutboundMeta {
43
+ instanceName: string;
44
+ requestId: number | undefined;
45
+ fleetRequestId: string | undefined;
46
+ senderSessionName: string | undefined;
47
+ }
48
+ type Respond = (result: unknown, error?: string) => void;
49
+ type Handler = (ctx: OutboundContext, args: Record<string, unknown>, respond: Respond, meta: OutboundMeta) => Promise<void> | void;
50
+ export declare const outboundHandlers: Map<string, Handler>;
51
+ export {};