mach6-core 1.1.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.
Files changed (245) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +454 -0
  3. package/dist/agent/context-monitor.d.ts +40 -0
  4. package/dist/agent/context-monitor.d.ts.map +1 -0
  5. package/dist/agent/context-monitor.js +138 -0
  6. package/dist/agent/context-monitor.js.map +1 -0
  7. package/dist/agent/context.d.ts +8 -0
  8. package/dist/agent/context.d.ts.map +1 -0
  9. package/dist/agent/context.js +197 -0
  10. package/dist/agent/context.js.map +1 -0
  11. package/dist/agent/runner.d.ts +42 -0
  12. package/dist/agent/runner.d.ts.map +1 -0
  13. package/dist/agent/runner.js +168 -0
  14. package/dist/agent/runner.js.map +1 -0
  15. package/dist/agent/system-prompt.d.ts +10 -0
  16. package/dist/agent/system-prompt.d.ts.map +1 -0
  17. package/dist/agent/system-prompt.js +120 -0
  18. package/dist/agent/system-prompt.js.map +1 -0
  19. package/dist/boot/sequence.d.ts +34 -0
  20. package/dist/boot/sequence.d.ts.map +1 -0
  21. package/dist/boot/sequence.js +103 -0
  22. package/dist/boot/sequence.js.map +1 -0
  23. package/dist/channels/__test__/integration.test.d.ts +8 -0
  24. package/dist/channels/__test__/integration.test.d.ts.map +1 -0
  25. package/dist/channels/__test__/integration.test.js +221 -0
  26. package/dist/channels/__test__/integration.test.js.map +1 -0
  27. package/dist/channels/adapter.d.ts +53 -0
  28. package/dist/channels/adapter.d.ts.map +1 -0
  29. package/dist/channels/adapter.js +164 -0
  30. package/dist/channels/adapter.js.map +1 -0
  31. package/dist/channels/adapters/discord.d.ts +49 -0
  32. package/dist/channels/adapters/discord.d.ts.map +1 -0
  33. package/dist/channels/adapters/discord.js +382 -0
  34. package/dist/channels/adapters/discord.js.map +1 -0
  35. package/dist/channels/adapters/whatsapp.d.ts +59 -0
  36. package/dist/channels/adapters/whatsapp.d.ts.map +1 -0
  37. package/dist/channels/adapters/whatsapp.js +503 -0
  38. package/dist/channels/adapters/whatsapp.js.map +1 -0
  39. package/dist/channels/bus.d.ts +55 -0
  40. package/dist/channels/bus.d.ts.map +1 -0
  41. package/dist/channels/bus.js +307 -0
  42. package/dist/channels/bus.js.map +1 -0
  43. package/dist/channels/formatter.d.ts +16 -0
  44. package/dist/channels/formatter.d.ts.map +1 -0
  45. package/dist/channels/formatter.js +226 -0
  46. package/dist/channels/formatter.js.map +1 -0
  47. package/dist/channels/presence.d.ts +67 -0
  48. package/dist/channels/presence.d.ts.map +1 -0
  49. package/dist/channels/presence.js +209 -0
  50. package/dist/channels/presence.js.map +1 -0
  51. package/dist/channels/registry.d.ts +57 -0
  52. package/dist/channels/registry.d.ts.map +1 -0
  53. package/dist/channels/registry.js +159 -0
  54. package/dist/channels/registry.js.map +1 -0
  55. package/dist/channels/router.d.ts +49 -0
  56. package/dist/channels/router.d.ts.map +1 -0
  57. package/dist/channels/router.js +244 -0
  58. package/dist/channels/router.js.map +1 -0
  59. package/dist/channels/types.d.ts +279 -0
  60. package/dist/channels/types.d.ts.map +1 -0
  61. package/dist/channels/types.js +67 -0
  62. package/dist/channels/types.js.map +1 -0
  63. package/dist/cli/brand.d.ts +71 -0
  64. package/dist/cli/brand.d.ts.map +1 -0
  65. package/dist/cli/brand.js +194 -0
  66. package/dist/cli/brand.js.map +1 -0
  67. package/dist/cli/wizard.d.ts +8 -0
  68. package/dist/cli/wizard.d.ts.map +1 -0
  69. package/dist/cli/wizard.js +520 -0
  70. package/dist/cli/wizard.js.map +1 -0
  71. package/dist/config/config.d.ts +47 -0
  72. package/dist/config/config.d.ts.map +1 -0
  73. package/dist/config/config.js +63 -0
  74. package/dist/config/config.js.map +1 -0
  75. package/dist/config/validator.d.ts +18 -0
  76. package/dist/config/validator.d.ts.map +1 -0
  77. package/dist/config/validator.js +92 -0
  78. package/dist/config/validator.js.map +1 -0
  79. package/dist/cron/budget.d.ts +39 -0
  80. package/dist/cron/budget.d.ts.map +1 -0
  81. package/dist/cron/budget.js +98 -0
  82. package/dist/cron/budget.js.map +1 -0
  83. package/dist/formatters/markdown.d.ts +6 -0
  84. package/dist/formatters/markdown.d.ts.map +1 -0
  85. package/dist/formatters/markdown.js +85 -0
  86. package/dist/formatters/markdown.js.map +1 -0
  87. package/dist/gateway/daemon.d.ts +97 -0
  88. package/dist/gateway/daemon.d.ts.map +1 -0
  89. package/dist/gateway/daemon.js +772 -0
  90. package/dist/gateway/daemon.js.map +1 -0
  91. package/dist/heartbeat/scheduler.d.ts +45 -0
  92. package/dist/heartbeat/scheduler.d.ts.map +1 -0
  93. package/dist/heartbeat/scheduler.js +102 -0
  94. package/dist/heartbeat/scheduler.js.map +1 -0
  95. package/dist/index.d.ts +3 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +305 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/memory/integrity.d.ts +37 -0
  100. package/dist/memory/integrity.d.ts.map +1 -0
  101. package/dist/memory/integrity.js +108 -0
  102. package/dist/memory/integrity.js.map +1 -0
  103. package/dist/providers/anthropic.d.ts +3 -0
  104. package/dist/providers/anthropic.d.ts.map +1 -0
  105. package/dist/providers/anthropic.js +232 -0
  106. package/dist/providers/anthropic.js.map +1 -0
  107. package/dist/providers/diagnostics.d.ts +18 -0
  108. package/dist/providers/diagnostics.d.ts.map +1 -0
  109. package/dist/providers/diagnostics.js +87 -0
  110. package/dist/providers/diagnostics.js.map +1 -0
  111. package/dist/providers/github-copilot.d.ts +3 -0
  112. package/dist/providers/github-copilot.d.ts.map +1 -0
  113. package/dist/providers/github-copilot.js +145 -0
  114. package/dist/providers/github-copilot.js.map +1 -0
  115. package/dist/providers/gladius.d.ts +3 -0
  116. package/dist/providers/gladius.d.ts.map +1 -0
  117. package/dist/providers/gladius.js +16 -0
  118. package/dist/providers/gladius.js.map +1 -0
  119. package/dist/providers/openai.d.ts +3 -0
  120. package/dist/providers/openai.d.ts.map +1 -0
  121. package/dist/providers/openai.js +161 -0
  122. package/dist/providers/openai.js.map +1 -0
  123. package/dist/providers/retry.d.ts +2 -0
  124. package/dist/providers/retry.d.ts.map +1 -0
  125. package/dist/providers/retry.js +50 -0
  126. package/dist/providers/retry.js.map +1 -0
  127. package/dist/providers/types.d.ts +78 -0
  128. package/dist/providers/types.d.ts.map +1 -0
  129. package/dist/providers/types.js +3 -0
  130. package/dist/providers/types.js.map +1 -0
  131. package/dist/security/sanitizer.d.ts +26 -0
  132. package/dist/security/sanitizer.d.ts.map +1 -0
  133. package/dist/security/sanitizer.js +115 -0
  134. package/dist/security/sanitizer.js.map +1 -0
  135. package/dist/sessions/manager.d.ts +40 -0
  136. package/dist/sessions/manager.d.ts.map +1 -0
  137. package/dist/sessions/manager.js +255 -0
  138. package/dist/sessions/manager.js.map +1 -0
  139. package/dist/sessions/queue.d.ts +41 -0
  140. package/dist/sessions/queue.d.ts.map +1 -0
  141. package/dist/sessions/queue.js +93 -0
  142. package/dist/sessions/queue.js.map +1 -0
  143. package/dist/sessions/store.d.ts +12 -0
  144. package/dist/sessions/store.d.ts.map +1 -0
  145. package/dist/sessions/store.js +74 -0
  146. package/dist/sessions/store.js.map +1 -0
  147. package/dist/sessions/sub-agent.d.ts +18 -0
  148. package/dist/sessions/sub-agent.d.ts.map +1 -0
  149. package/dist/sessions/sub-agent.js +117 -0
  150. package/dist/sessions/sub-agent.js.map +1 -0
  151. package/dist/sessions/types.d.ts +48 -0
  152. package/dist/sessions/types.d.ts.map +1 -0
  153. package/dist/sessions/types.js +3 -0
  154. package/dist/sessions/types.js.map +1 -0
  155. package/dist/test/channel-integration.d.ts +10 -0
  156. package/dist/test/channel-integration.d.ts.map +1 -0
  157. package/dist/test/channel-integration.js +226 -0
  158. package/dist/test/channel-integration.js.map +1 -0
  159. package/dist/test/prompt-test.d.ts +2 -0
  160. package/dist/test/prompt-test.d.ts.map +1 -0
  161. package/dist/test/prompt-test.js +33 -0
  162. package/dist/test/prompt-test.js.map +1 -0
  163. package/dist/test/smoke.d.ts +8 -0
  164. package/dist/test/smoke.d.ts.map +1 -0
  165. package/dist/test/smoke.js +134 -0
  166. package/dist/test/smoke.js.map +1 -0
  167. package/dist/tools/builtin/comb.d.ts +4 -0
  168. package/dist/tools/builtin/comb.d.ts.map +1 -0
  169. package/dist/tools/builtin/comb.js +50 -0
  170. package/dist/tools/builtin/comb.js.map +1 -0
  171. package/dist/tools/builtin/edit.d.ts +3 -0
  172. package/dist/tools/builtin/edit.d.ts.map +1 -0
  173. package/dist/tools/builtin/edit.js +42 -0
  174. package/dist/tools/builtin/edit.js.map +1 -0
  175. package/dist/tools/builtin/exec.d.ts +3 -0
  176. package/dist/tools/builtin/exec.d.ts.map +1 -0
  177. package/dist/tools/builtin/exec.js +75 -0
  178. package/dist/tools/builtin/exec.js.map +1 -0
  179. package/dist/tools/builtin/image.d.ts +3 -0
  180. package/dist/tools/builtin/image.d.ts.map +1 -0
  181. package/dist/tools/builtin/image.js +208 -0
  182. package/dist/tools/builtin/image.js.map +1 -0
  183. package/dist/tools/builtin/memory.d.ts +3 -0
  184. package/dist/tools/builtin/memory.d.ts.map +1 -0
  185. package/dist/tools/builtin/memory.js +36 -0
  186. package/dist/tools/builtin/memory.js.map +1 -0
  187. package/dist/tools/builtin/message.d.ts +13 -0
  188. package/dist/tools/builtin/message.d.ts.map +1 -0
  189. package/dist/tools/builtin/message.js +330 -0
  190. package/dist/tools/builtin/message.js.map +1 -0
  191. package/dist/tools/builtin/process.d.ts +43 -0
  192. package/dist/tools/builtin/process.d.ts.map +1 -0
  193. package/dist/tools/builtin/process.js +178 -0
  194. package/dist/tools/builtin/process.js.map +1 -0
  195. package/dist/tools/builtin/read.d.ts +3 -0
  196. package/dist/tools/builtin/read.d.ts.map +1 -0
  197. package/dist/tools/builtin/read.js +36 -0
  198. package/dist/tools/builtin/read.js.map +1 -0
  199. package/dist/tools/builtin/spawn.d.ts +8 -0
  200. package/dist/tools/builtin/spawn.d.ts.map +1 -0
  201. package/dist/tools/builtin/spawn.js +90 -0
  202. package/dist/tools/builtin/spawn.js.map +1 -0
  203. package/dist/tools/builtin/tts.d.ts +3 -0
  204. package/dist/tools/builtin/tts.d.ts.map +1 -0
  205. package/dist/tools/builtin/tts.js +77 -0
  206. package/dist/tools/builtin/tts.js.map +1 -0
  207. package/dist/tools/builtin/web-fetch.d.ts +3 -0
  208. package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
  209. package/dist/tools/builtin/web-fetch.js +46 -0
  210. package/dist/tools/builtin/web-fetch.js.map +1 -0
  211. package/dist/tools/builtin/write.d.ts +3 -0
  212. package/dist/tools/builtin/write.d.ts.map +1 -0
  213. package/dist/tools/builtin/write.js +31 -0
  214. package/dist/tools/builtin/write.js.map +1 -0
  215. package/dist/tools/mcp-bridge.d.ts +42 -0
  216. package/dist/tools/mcp-bridge.d.ts.map +1 -0
  217. package/dist/tools/mcp-bridge.js +198 -0
  218. package/dist/tools/mcp-bridge.js.map +1 -0
  219. package/dist/tools/policy.d.ts +57 -0
  220. package/dist/tools/policy.d.ts.map +1 -0
  221. package/dist/tools/policy.js +106 -0
  222. package/dist/tools/policy.js.map +1 -0
  223. package/dist/tools/registry.d.ts +15 -0
  224. package/dist/tools/registry.d.ts.map +1 -0
  225. package/dist/tools/registry.js +41 -0
  226. package/dist/tools/registry.js.map +1 -0
  227. package/dist/tools/sandbox.d.ts +91 -0
  228. package/dist/tools/sandbox.d.ts.map +1 -0
  229. package/dist/tools/sandbox.js +279 -0
  230. package/dist/tools/sandbox.js.map +1 -0
  231. package/dist/tools/types.d.ts +23 -0
  232. package/dist/tools/types.d.ts.map +1 -0
  233. package/dist/tools/types.js +3 -0
  234. package/dist/tools/types.js.map +1 -0
  235. package/dist/web/http-api.d.ts +61 -0
  236. package/dist/web/http-api.d.ts.map +1 -0
  237. package/dist/web/http-api.js +200 -0
  238. package/dist/web/http-api.js.map +1 -0
  239. package/dist/web/server.d.ts +7 -0
  240. package/dist/web/server.d.ts.map +1 -0
  241. package/dist/web/server.js +396 -0
  242. package/dist/web/server.js.map +1 -0
  243. package/mach6.example.json +50 -0
  244. package/package.json +58 -0
  245. package/web/index.html +1370 -0
@@ -0,0 +1,209 @@
1
+ // Mach6 — Social Presence Manager v2
2
+ // Sustained typing + granular activity states.
3
+ //
4
+ // Shows what AVA is actually doing during a turn:
5
+ // thinking, reading, writing, searching, executing, etc.
6
+ //
7
+ // Discord: setActivity("Reading files...") + sendTyping() refresh
8
+ // WhatsApp: composing indicator refresh (no custom text)
9
+ import { ActivityType } from 'discord.js';
10
+ // Map tool names → human-readable activity
11
+ const TOOL_ACTIVITY = {
12
+ read: { text: '📖 Reading files...', type: ActivityType.Custom },
13
+ write: { text: '✍️ Writing...', type: ActivityType.Custom },
14
+ edit: { text: '✏️ Editing...', type: ActivityType.Custom },
15
+ exec: { text: '⚡ Executing...', type: ActivityType.Custom },
16
+ process_start: { text: '🚀 Launching process...', type: ActivityType.Custom },
17
+ process_poll: { text: '📊 Checking process...', type: ActivityType.Custom },
18
+ process_kill: { text: '🛑 Stopping process...', type: ActivityType.Custom },
19
+ process_list: { text: '📋 Listing processes...', type: ActivityType.Custom },
20
+ image: { text: '👁️ Analyzing image...', type: ActivityType.Custom },
21
+ web_fetch: { text: '🌐 Browsing the web...', type: ActivityType.Custom },
22
+ memory_search: { text: '🧠 Searching memory...', type: ActivityType.Custom },
23
+ comb_recall: { text: '🧠 Recalling...', type: ActivityType.Custom },
24
+ comb_stage: { text: '💾 Staging memory...', type: ActivityType.Custom },
25
+ tts: { text: '🔊 Generating speech...', type: ActivityType.Custom },
26
+ message: { text: '💬 Sending message...', type: ActivityType.Custom },
27
+ typing: { text: '💬 Communicating...', type: ActivityType.Custom },
28
+ presence: { text: '💬 Updating presence...', type: ActivityType.Custom },
29
+ delete_message: { text: '🗑️ Cleaning up...', type: ActivityType.Custom },
30
+ mark_read: { text: '👀 Reading messages...', type: ActivityType.Custom },
31
+ spawn: { text: '🧬 Spawning sub-agent...', type: ActivityType.Custom },
32
+ subagent_status: { text: '🔍 Checking sub-agent...', type: ActivityType.Custom },
33
+ };
34
+ const THINKING_ACTIVITY = { text: '🤔 Thinking...', type: ActivityType.Custom };
35
+ const IDLE_ACTIVITY = { text: '🔮', type: ActivityType.Custom };
36
+ // ─── Presence Manager ──────────────────────────────────────────────────────
37
+ export class PresenceManager {
38
+ activeTyping = new Map();
39
+ typingFunctions = new Map();
40
+ discordClients = new Map();
41
+ currentActivity = IDLE_ACTIVITY;
42
+ activityTimeout = null;
43
+ // How often to refresh typing indicator (ms)
44
+ // WhatsApp composing lasts ~5s, Discord lasts ~10s
45
+ refreshIntervalMs = 4000;
46
+ // Safety: max typing duration to prevent zombie typing (5 min)
47
+ maxTypingMs = 5 * 60 * 1000;
48
+ /**
49
+ * Register a typing function for an adapter.
50
+ */
51
+ registerAdapter(adapterId, typingFn) {
52
+ this.typingFunctions.set(adapterId, typingFn);
53
+ }
54
+ /**
55
+ * Register a Discord client for rich presence (activity status).
56
+ */
57
+ registerDiscordClient(adapterId, client) {
58
+ this.discordClients.set(adapterId, client);
59
+ }
60
+ /**
61
+ * Unregister an adapter (on disconnect).
62
+ */
63
+ unregisterAdapter(adapterId) {
64
+ for (const [key, active] of this.activeTyping) {
65
+ if (active.target.adapterId === adapterId) {
66
+ this.stopTyping(active.target);
67
+ }
68
+ }
69
+ this.typingFunctions.delete(adapterId);
70
+ this.discordClients.delete(adapterId);
71
+ }
72
+ /**
73
+ * Start sustained typing indicator. Refreshes automatically
74
+ * until stopTyping is called or maxTypingMs is reached.
75
+ */
76
+ startTyping(target) {
77
+ const key = `${target.adapterId}:${target.chatId}`;
78
+ // Already typing? Reset timer
79
+ if (this.activeTyping.has(key)) {
80
+ this.stopTyping(target);
81
+ }
82
+ const typingFn = this.typingFunctions.get(target.adapterId);
83
+ if (!typingFn)
84
+ return;
85
+ // Fire immediately
86
+ typingFn(target.chatId).catch(() => { });
87
+ // Set activity to thinking (default state at start of turn)
88
+ this.setActivity(THINKING_ACTIVITY);
89
+ // Set up refresh interval
90
+ const interval = setInterval(() => {
91
+ const active = this.activeTyping.get(key);
92
+ if (!active)
93
+ return;
94
+ // Safety timeout
95
+ if (Date.now() - active.startedAt > this.maxTypingMs) {
96
+ console.warn(`[presence] Typing timeout for ${key} (>${this.maxTypingMs}ms)`);
97
+ this.stopTyping(target);
98
+ return;
99
+ }
100
+ typingFn(target.chatId).catch(() => { });
101
+ }, this.refreshIntervalMs);
102
+ this.activeTyping.set(key, {
103
+ target,
104
+ interval,
105
+ startedAt: Date.now(),
106
+ });
107
+ }
108
+ /**
109
+ * Stop typing indicator for a target.
110
+ */
111
+ stopTyping(target) {
112
+ const key = `${target.adapterId}:${target.chatId}`;
113
+ const active = this.activeTyping.get(key);
114
+ if (active) {
115
+ clearInterval(active.interval);
116
+ this.activeTyping.delete(key);
117
+ }
118
+ // Return to idle when all typing stops
119
+ if (this.activeTyping.size === 0) {
120
+ this.setActivity(IDLE_ACTIVITY);
121
+ }
122
+ }
123
+ /**
124
+ * Signal that a tool has started executing.
125
+ * Updates Discord activity to reflect what's happening.
126
+ */
127
+ toolStart(toolName) {
128
+ const activity = TOOL_ACTIVITY[toolName] ?? THINKING_ACTIVITY;
129
+ this.setActivity(activity);
130
+ // Clear any pending "back to thinking" timeout
131
+ if (this.activityTimeout) {
132
+ clearTimeout(this.activityTimeout);
133
+ this.activityTimeout = null;
134
+ }
135
+ }
136
+ /**
137
+ * Signal that a tool has finished executing.
138
+ * Returns to "Thinking..." after a brief delay (the LLM processes next).
139
+ */
140
+ toolEnd(_toolName) {
141
+ // Brief delay before going back to thinking — avoids flickering
142
+ // if another tool starts immediately
143
+ if (this.activityTimeout)
144
+ clearTimeout(this.activityTimeout);
145
+ this.activityTimeout = setTimeout(() => {
146
+ // Only go back to thinking if we're still in an active turn
147
+ if (this.activeTyping.size > 0) {
148
+ this.setActivity(THINKING_ACTIVITY);
149
+ }
150
+ this.activityTimeout = null;
151
+ }, 300);
152
+ }
153
+ /**
154
+ * Signal the LLM is streaming (between tool calls).
155
+ */
156
+ llmStreaming() {
157
+ if (this.activityTimeout)
158
+ clearTimeout(this.activityTimeout);
159
+ this.setActivity(THINKING_ACTIVITY);
160
+ }
161
+ /**
162
+ * Stop all active typing (shutdown).
163
+ */
164
+ stopAll() {
165
+ for (const [, active] of this.activeTyping) {
166
+ clearInterval(active.interval);
167
+ }
168
+ this.activeTyping.clear();
169
+ if (this.activityTimeout) {
170
+ clearTimeout(this.activityTimeout);
171
+ this.activityTimeout = null;
172
+ }
173
+ this.setActivity(IDLE_ACTIVITY);
174
+ }
175
+ /**
176
+ * Get stats for monitoring.
177
+ */
178
+ stats() {
179
+ return {
180
+ activeCount: this.activeTyping.size,
181
+ adapters: this.typingFunctions.size,
182
+ currentActivity: this.currentActivity.text,
183
+ };
184
+ }
185
+ // ── Internal ─────────────────────────────────────────────────────────
186
+ setActivity(activity) {
187
+ if (this.currentActivity.text === activity.text)
188
+ return; // no-op for same state
189
+ this.currentActivity = activity;
190
+ // Update all registered Discord clients
191
+ for (const [, client] of this.discordClients) {
192
+ try {
193
+ if (activity.text === IDLE_ACTIVITY.text) {
194
+ // Clear to just the crystal ball
195
+ client.user?.setActivity('🔮', { type: ActivityType.Custom });
196
+ }
197
+ else {
198
+ client.user?.setActivity(activity.text, { type: ActivityType.Custom });
199
+ }
200
+ }
201
+ catch (err) {
202
+ // Ignore — client might not be ready
203
+ }
204
+ }
205
+ }
206
+ }
207
+ // Singleton — one presence manager for the entire gateway
208
+ export const presenceManager = new PresenceManager();
209
+ //# sourceMappingURL=presence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presence.js","sourceRoot":"","sources":["../../src/channels/presence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Mach6 — Channel Registry
3
+ *
4
+ * Manages channel adapter lifecycle. Hot-plug adapters without restart.
5
+ * Wires adapters → router → bus → agent.
6
+ */
7
+ import type { ChannelAdapter, ChannelConfig, ChannelPolicy, AdapterHealth } from './types.js';
8
+ import { Mach6Bus } from './bus.js';
9
+ import { InboundRouter } from './router.js';
10
+ export declare class ChannelRegistry {
11
+ private adapters;
12
+ private bus;
13
+ private router;
14
+ private activeSessions;
15
+ private onAdapterHealthChange?;
16
+ constructor(options?: {
17
+ busOptions?: ConstructorParameters<typeof Mach6Bus>[0];
18
+ globalOwnerIds?: string[];
19
+ onAdapterHealthChange?: (adapterId: string, health: AdapterHealth) => void;
20
+ });
21
+ /** Get the message bus (for agent runner to subscribe) */
22
+ getBus(): Mach6Bus;
23
+ /** Get the router (for policy updates) */
24
+ getRouter(): InboundRouter;
25
+ /** Mark a session as having an active agent turn (for interrupt detection) */
26
+ setSessionActive(sessionId: string, active: boolean): void;
27
+ /**
28
+ * Register and start a channel adapter.
29
+ * Hot-pluggable — can be called while the system is running.
30
+ */
31
+ register(adapter: ChannelAdapter, config: ChannelConfig, policy: ChannelPolicy): Promise<void>;
32
+ /**
33
+ * Stop and remove an adapter. Hot-unplug.
34
+ */
35
+ unregister(adapterId: string): Promise<void>;
36
+ /**
37
+ * Send a message through a specific adapter.
38
+ */
39
+ send(adapterId: string, chatId: string, message: import('./types.js').OutboundMessage): Promise<import("./types.js").SendResult>;
40
+ /**
41
+ * Send through whatever adapter handles this channel type.
42
+ */
43
+ sendToChannel(channelType: string, chatId: string, message: import('./types.js').OutboundMessage): Promise<import("./types.js").SendResult>;
44
+ /** List all registered adapters with their status */
45
+ list(): Array<{
46
+ id: string;
47
+ channelType: string;
48
+ status: string;
49
+ health: AdapterHealth;
50
+ startedAt?: number;
51
+ error?: string;
52
+ }>;
53
+ /** Get a specific adapter */
54
+ get(adapterId: string): ChannelAdapter | undefined;
55
+ destroy(): Promise<void>;
56
+ }
57
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/channels/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAe5C,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,qBAAqB,CAAC,CAAqD;gBAEvE,OAAO,CAAC,EAAE;QACpB,UAAU,CAAC,EAAE,qBAAqB,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,qBAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;KAC5E;IAWD,0DAA0D;IAC1D,MAAM,IAAI,QAAQ;IAIlB,0CAA0C;IAC1C,SAAS,IAAI,aAAa;IAI1B,8EAA8E;IAC9E,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAU1D;;;OAGG;IACG,QAAQ,CACZ,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC;IAuDhB;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalD;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,YAAY,EAAE,eAAe;IAO3F;;OAEG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,YAAY,EAAE,eAAe;IAWtG,qDAAqD;IACrD,IAAI,IAAI,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,aAAa,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAWF,6BAA6B;IAC7B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAM5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Mach6 — Channel Registry
3
+ *
4
+ * Manages channel adapter lifecycle. Hot-plug adapters without restart.
5
+ * Wires adapters → router → bus → agent.
6
+ */
7
+ import { Mach6Bus } from './bus.js';
8
+ import { InboundRouter } from './router.js';
9
+ // ─── Registry ──────────────────────────────────────────────────────────────
10
+ export class ChannelRegistry {
11
+ adapters = new Map();
12
+ bus;
13
+ router;
14
+ activeSessions = new Set();
15
+ onAdapterHealthChange;
16
+ constructor(options) {
17
+ this.bus = new Mach6Bus(options?.busOptions);
18
+ this.onAdapterHealthChange = options?.onAdapterHealthChange;
19
+ this.router = new InboundRouter(this.bus, {
20
+ policies: new Map(),
21
+ globalOwnerIds: options?.globalOwnerIds,
22
+ getActiveSessions: () => this.activeSessions,
23
+ });
24
+ }
25
+ /** Get the message bus (for agent runner to subscribe) */
26
+ getBus() {
27
+ return this.bus;
28
+ }
29
+ /** Get the router (for policy updates) */
30
+ getRouter() {
31
+ return this.router;
32
+ }
33
+ /** Mark a session as having an active agent turn (for interrupt detection) */
34
+ setSessionActive(sessionId, active) {
35
+ if (active) {
36
+ this.activeSessions.add(sessionId);
37
+ }
38
+ else {
39
+ this.activeSessions.delete(sessionId);
40
+ }
41
+ }
42
+ // ── Adapter Lifecycle ──────────────────────────────────────────────────
43
+ /**
44
+ * Register and start a channel adapter.
45
+ * Hot-pluggable — can be called while the system is running.
46
+ */
47
+ async register(adapter, config, policy) {
48
+ if (this.adapters.has(adapter.id)) {
49
+ throw new Error(`Adapter "${adapter.id}" is already registered`);
50
+ }
51
+ const entry = {
52
+ adapter,
53
+ config,
54
+ policy,
55
+ status: 'stopped',
56
+ };
57
+ this.adapters.set(adapter.id, entry);
58
+ // Set policy in router
59
+ this.router.setPolicy(adapter.channelType, policy);
60
+ // Wire inbound messages through the router
61
+ adapter.onMessage((envelope) => {
62
+ this.router.route(envelope.source, envelope.payload, envelope.metadata.platformMessageId);
63
+ });
64
+ // Wire health changes
65
+ adapter.onHealthChange((health) => {
66
+ this.onAdapterHealthChange?.(adapter.id, health);
67
+ if (health.state === 'disconnected') {
68
+ entry.status = 'error';
69
+ entry.error = health.lastError;
70
+ // Auto-reconnect with appropriate delay
71
+ // 440 conflict = another socket took over, wait longer before retrying
72
+ const is440 = health.lastError?.includes('440');
73
+ const delay = is440 ? 30_000 : 2_000; // 30s for conflict, 2s for others
74
+ if (is440) {
75
+ console.log(`[registry] 440 conflict for ${adapter.id} — waiting ${delay / 1000}s before reconnect`);
76
+ }
77
+ setTimeout(() => {
78
+ adapter.reconnect().catch(err => {
79
+ console.error(`[registry] Auto-reconnect failed for ${adapter.id}:`, err);
80
+ });
81
+ }, delay);
82
+ }
83
+ });
84
+ // Start the adapter
85
+ entry.status = 'starting';
86
+ try {
87
+ await adapter.connect(config);
88
+ entry.status = 'running';
89
+ entry.startedAt = Date.now();
90
+ }
91
+ catch (err) {
92
+ entry.status = 'error';
93
+ entry.error = err instanceof Error ? err.message : String(err);
94
+ throw err;
95
+ }
96
+ }
97
+ /**
98
+ * Stop and remove an adapter. Hot-unplug.
99
+ */
100
+ async unregister(adapterId) {
101
+ const entry = this.adapters.get(adapterId);
102
+ if (!entry)
103
+ return;
104
+ entry.status = 'stopping';
105
+ try {
106
+ await entry.adapter.disconnect();
107
+ }
108
+ catch (err) {
109
+ console.error(`[registry] Error disconnecting ${adapterId}:`, err);
110
+ }
111
+ this.adapters.delete(adapterId);
112
+ }
113
+ /**
114
+ * Send a message through a specific adapter.
115
+ */
116
+ async send(adapterId, chatId, message) {
117
+ const entry = this.adapters.get(adapterId);
118
+ if (!entry)
119
+ throw new Error(`Adapter "${adapterId}" not found`);
120
+ if (entry.status !== 'running')
121
+ throw new Error(`Adapter "${adapterId}" is ${entry.status}`);
122
+ return entry.adapter.send(chatId, message);
123
+ }
124
+ /**
125
+ * Send through whatever adapter handles this channel type.
126
+ */
127
+ async sendToChannel(channelType, chatId, message) {
128
+ for (const [, entry] of this.adapters) {
129
+ if (entry.adapter.channelType === channelType && entry.status === 'running') {
130
+ return entry.adapter.send(chatId, message);
131
+ }
132
+ }
133
+ throw new Error(`No running adapter for channel type "${channelType}"`);
134
+ }
135
+ // ── Status ─────────────────────────────────────────────────────────────
136
+ /** List all registered adapters with their status */
137
+ list() {
138
+ return Array.from(this.adapters.entries()).map(([id, entry]) => ({
139
+ id,
140
+ channelType: entry.adapter.channelType,
141
+ status: entry.status,
142
+ health: entry.adapter.getHealth(),
143
+ startedAt: entry.startedAt,
144
+ error: entry.error,
145
+ }));
146
+ }
147
+ /** Get a specific adapter */
148
+ get(adapterId) {
149
+ return this.adapters.get(adapterId)?.adapter;
150
+ }
151
+ // ── Cleanup ────────────────────────────────────────────────────────────
152
+ async destroy() {
153
+ for (const [id] of this.adapters) {
154
+ await this.unregister(id);
155
+ }
156
+ this.bus.destroy();
157
+ }
158
+ }
159
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/channels/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Mach6 — Inbound Router
3
+ *
4
+ * Sits between channel adapters and the message bus.
5
+ * Handles: policy enforcement, session routing, priority assignment,
6
+ * deduplication, interrupt detection.
7
+ */
8
+ import type { ChannelPolicy, ChannelSource, InboundPayload, SessionRoute } from './types.js';
9
+ import type { Mach6Bus } from './bus.js';
10
+ export interface RouterConfig {
11
+ /** Policy per channel type */
12
+ policies: Map<string, ChannelPolicy>;
13
+ /** Default policy if no channel-specific one exists */
14
+ defaultPolicy?: ChannelPolicy;
15
+ /** Global owner IDs — always allowed on any channel */
16
+ globalOwnerIds?: string[];
17
+ /** Active session tracking — which sessions have an agent turn in progress */
18
+ getActiveSessions?: () => Set<string>;
19
+ }
20
+ export declare class InboundRouter {
21
+ private bus;
22
+ private config;
23
+ private dedup;
24
+ private routes;
25
+ private sessionCounter;
26
+ constructor(bus: Mach6Bus, config: RouterConfig);
27
+ /**
28
+ * Route an inbound message from a channel adapter.
29
+ * Returns false if the message was rejected by policy.
30
+ */
31
+ route(source: ChannelSource, payload: InboundPayload, platformMessageId?: string): boolean;
32
+ private getPolicy;
33
+ private checkPolicy;
34
+ private isOwner;
35
+ private isMentioned;
36
+ private resolveSession;
37
+ private assignPriority;
38
+ /** Get all active routes */
39
+ getRoutes(): SessionRoute[];
40
+ /** Get session ID for a channel + chat */
41
+ getSessionId(channelType: string, chatId: string): string | undefined;
42
+ /** Manually set a route (for restoring state) */
43
+ setRoute(route: SessionRoute): void;
44
+ /** Clean up stale routes (not active for given duration) */
45
+ pruneRoutes(maxIdleMs: number): number;
46
+ /** Update policy for a channel */
47
+ setPolicy(channelType: string, policy: ChannelPolicy): void;
48
+ }
49
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/channels/router.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAEV,aAAa,EACb,aAAa,EACb,cAAc,EAEd,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAmEzC,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrC,uDAAuD;IACvD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,cAAc,CAAK;gBAEf,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY;IAK/C;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO;IAoC1F,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,WAAW;IAsCnB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,cAAc;IA2CtB,4BAA4B;IAC5B,SAAS,IAAI,YAAY,EAAE;IAI3B,0CAA0C;IAC1C,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIrE,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAInC,4DAA4D;IAC5D,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAYtC,kCAAkC;IAClC,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;CAG5D"}