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.
- package/LICENSE +21 -0
- package/README.md +454 -0
- package/dist/agent/context-monitor.d.ts +40 -0
- package/dist/agent/context-monitor.d.ts.map +1 -0
- package/dist/agent/context-monitor.js +138 -0
- package/dist/agent/context-monitor.js.map +1 -0
- package/dist/agent/context.d.ts +8 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +197 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/runner.d.ts +42 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +168 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +10 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +120 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/boot/sequence.d.ts +34 -0
- package/dist/boot/sequence.d.ts.map +1 -0
- package/dist/boot/sequence.js +103 -0
- package/dist/boot/sequence.js.map +1 -0
- package/dist/channels/__test__/integration.test.d.ts +8 -0
- package/dist/channels/__test__/integration.test.d.ts.map +1 -0
- package/dist/channels/__test__/integration.test.js +221 -0
- package/dist/channels/__test__/integration.test.js.map +1 -0
- package/dist/channels/adapter.d.ts +53 -0
- package/dist/channels/adapter.d.ts.map +1 -0
- package/dist/channels/adapter.js +164 -0
- package/dist/channels/adapter.js.map +1 -0
- package/dist/channels/adapters/discord.d.ts +49 -0
- package/dist/channels/adapters/discord.d.ts.map +1 -0
- package/dist/channels/adapters/discord.js +382 -0
- package/dist/channels/adapters/discord.js.map +1 -0
- package/dist/channels/adapters/whatsapp.d.ts +59 -0
- package/dist/channels/adapters/whatsapp.d.ts.map +1 -0
- package/dist/channels/adapters/whatsapp.js +503 -0
- package/dist/channels/adapters/whatsapp.js.map +1 -0
- package/dist/channels/bus.d.ts +55 -0
- package/dist/channels/bus.d.ts.map +1 -0
- package/dist/channels/bus.js +307 -0
- package/dist/channels/bus.js.map +1 -0
- package/dist/channels/formatter.d.ts +16 -0
- package/dist/channels/formatter.d.ts.map +1 -0
- package/dist/channels/formatter.js +226 -0
- package/dist/channels/formatter.js.map +1 -0
- package/dist/channels/presence.d.ts +67 -0
- package/dist/channels/presence.d.ts.map +1 -0
- package/dist/channels/presence.js +209 -0
- package/dist/channels/presence.js.map +1 -0
- package/dist/channels/registry.d.ts +57 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +159 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/router.d.ts +49 -0
- package/dist/channels/router.d.ts.map +1 -0
- package/dist/channels/router.js +244 -0
- package/dist/channels/router.js.map +1 -0
- package/dist/channels/types.d.ts +279 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +67 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/cli/brand.d.ts +71 -0
- package/dist/cli/brand.d.ts.map +1 -0
- package/dist/cli/brand.js +194 -0
- package/dist/cli/brand.js.map +1 -0
- package/dist/cli/wizard.d.ts +8 -0
- package/dist/cli/wizard.d.ts.map +1 -0
- package/dist/cli/wizard.js +520 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/config/config.d.ts +47 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +63 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/validator.d.ts +18 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +92 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/cron/budget.d.ts +39 -0
- package/dist/cron/budget.d.ts.map +1 -0
- package/dist/cron/budget.js +98 -0
- package/dist/cron/budget.js.map +1 -0
- package/dist/formatters/markdown.d.ts +6 -0
- package/dist/formatters/markdown.d.ts.map +1 -0
- package/dist/formatters/markdown.js +85 -0
- package/dist/formatters/markdown.js.map +1 -0
- package/dist/gateway/daemon.d.ts +97 -0
- package/dist/gateway/daemon.d.ts.map +1 -0
- package/dist/gateway/daemon.js +772 -0
- package/dist/gateway/daemon.js.map +1 -0
- package/dist/heartbeat/scheduler.d.ts +45 -0
- package/dist/heartbeat/scheduler.d.ts.map +1 -0
- package/dist/heartbeat/scheduler.js +102 -0
- package/dist/heartbeat/scheduler.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +305 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/integrity.d.ts +37 -0
- package/dist/memory/integrity.d.ts.map +1 -0
- package/dist/memory/integrity.js +108 -0
- package/dist/memory/integrity.js.map +1 -0
- package/dist/providers/anthropic.d.ts +3 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +232 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/diagnostics.d.ts +18 -0
- package/dist/providers/diagnostics.d.ts.map +1 -0
- package/dist/providers/diagnostics.js +87 -0
- package/dist/providers/diagnostics.js.map +1 -0
- package/dist/providers/github-copilot.d.ts +3 -0
- package/dist/providers/github-copilot.d.ts.map +1 -0
- package/dist/providers/github-copilot.js +145 -0
- package/dist/providers/github-copilot.js.map +1 -0
- package/dist/providers/gladius.d.ts +3 -0
- package/dist/providers/gladius.d.ts.map +1 -0
- package/dist/providers/gladius.js +16 -0
- package/dist/providers/gladius.js.map +1 -0
- package/dist/providers/openai.d.ts +3 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +161 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/retry.d.ts +2 -0
- package/dist/providers/retry.d.ts.map +1 -0
- package/dist/providers/retry.js +50 -0
- package/dist/providers/retry.js.map +1 -0
- package/dist/providers/types.d.ts +78 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +3 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/security/sanitizer.d.ts +26 -0
- package/dist/security/sanitizer.d.ts.map +1 -0
- package/dist/security/sanitizer.js +115 -0
- package/dist/security/sanitizer.js.map +1 -0
- package/dist/sessions/manager.d.ts +40 -0
- package/dist/sessions/manager.d.ts.map +1 -0
- package/dist/sessions/manager.js +255 -0
- package/dist/sessions/manager.js.map +1 -0
- package/dist/sessions/queue.d.ts +41 -0
- package/dist/sessions/queue.d.ts.map +1 -0
- package/dist/sessions/queue.js +93 -0
- package/dist/sessions/queue.js.map +1 -0
- package/dist/sessions/store.d.ts +12 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +74 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/sessions/sub-agent.d.ts +18 -0
- package/dist/sessions/sub-agent.d.ts.map +1 -0
- package/dist/sessions/sub-agent.js +117 -0
- package/dist/sessions/sub-agent.js.map +1 -0
- package/dist/sessions/types.d.ts +48 -0
- package/dist/sessions/types.d.ts.map +1 -0
- package/dist/sessions/types.js +3 -0
- package/dist/sessions/types.js.map +1 -0
- package/dist/test/channel-integration.d.ts +10 -0
- package/dist/test/channel-integration.d.ts.map +1 -0
- package/dist/test/channel-integration.js +226 -0
- package/dist/test/channel-integration.js.map +1 -0
- package/dist/test/prompt-test.d.ts +2 -0
- package/dist/test/prompt-test.d.ts.map +1 -0
- package/dist/test/prompt-test.js +33 -0
- package/dist/test/prompt-test.js.map +1 -0
- package/dist/test/smoke.d.ts +8 -0
- package/dist/test/smoke.d.ts.map +1 -0
- package/dist/test/smoke.js +134 -0
- package/dist/test/smoke.js.map +1 -0
- package/dist/tools/builtin/comb.d.ts +4 -0
- package/dist/tools/builtin/comb.d.ts.map +1 -0
- package/dist/tools/builtin/comb.js +50 -0
- package/dist/tools/builtin/comb.js.map +1 -0
- package/dist/tools/builtin/edit.d.ts +3 -0
- package/dist/tools/builtin/edit.d.ts.map +1 -0
- package/dist/tools/builtin/edit.js +42 -0
- package/dist/tools/builtin/edit.js.map +1 -0
- package/dist/tools/builtin/exec.d.ts +3 -0
- package/dist/tools/builtin/exec.d.ts.map +1 -0
- package/dist/tools/builtin/exec.js +75 -0
- package/dist/tools/builtin/exec.js.map +1 -0
- package/dist/tools/builtin/image.d.ts +3 -0
- package/dist/tools/builtin/image.d.ts.map +1 -0
- package/dist/tools/builtin/image.js +208 -0
- package/dist/tools/builtin/image.js.map +1 -0
- package/dist/tools/builtin/memory.d.ts +3 -0
- package/dist/tools/builtin/memory.d.ts.map +1 -0
- package/dist/tools/builtin/memory.js +36 -0
- package/dist/tools/builtin/memory.js.map +1 -0
- package/dist/tools/builtin/message.d.ts +13 -0
- package/dist/tools/builtin/message.d.ts.map +1 -0
- package/dist/tools/builtin/message.js +330 -0
- package/dist/tools/builtin/message.js.map +1 -0
- package/dist/tools/builtin/process.d.ts +43 -0
- package/dist/tools/builtin/process.d.ts.map +1 -0
- package/dist/tools/builtin/process.js +178 -0
- package/dist/tools/builtin/process.js.map +1 -0
- package/dist/tools/builtin/read.d.ts +3 -0
- package/dist/tools/builtin/read.d.ts.map +1 -0
- package/dist/tools/builtin/read.js +36 -0
- package/dist/tools/builtin/read.js.map +1 -0
- package/dist/tools/builtin/spawn.d.ts +8 -0
- package/dist/tools/builtin/spawn.d.ts.map +1 -0
- package/dist/tools/builtin/spawn.js +90 -0
- package/dist/tools/builtin/spawn.js.map +1 -0
- package/dist/tools/builtin/tts.d.ts +3 -0
- package/dist/tools/builtin/tts.d.ts.map +1 -0
- package/dist/tools/builtin/tts.js +77 -0
- package/dist/tools/builtin/tts.js.map +1 -0
- package/dist/tools/builtin/web-fetch.d.ts +3 -0
- package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
- package/dist/tools/builtin/web-fetch.js +46 -0
- package/dist/tools/builtin/web-fetch.js.map +1 -0
- package/dist/tools/builtin/write.d.ts +3 -0
- package/dist/tools/builtin/write.d.ts.map +1 -0
- package/dist/tools/builtin/write.js +31 -0
- package/dist/tools/builtin/write.js.map +1 -0
- package/dist/tools/mcp-bridge.d.ts +42 -0
- package/dist/tools/mcp-bridge.d.ts.map +1 -0
- package/dist/tools/mcp-bridge.js +198 -0
- package/dist/tools/mcp-bridge.js.map +1 -0
- package/dist/tools/policy.d.ts +57 -0
- package/dist/tools/policy.d.ts.map +1 -0
- package/dist/tools/policy.js +106 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/registry.d.ts +15 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +41 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/sandbox.d.ts +91 -0
- package/dist/tools/sandbox.d.ts.map +1 -0
- package/dist/tools/sandbox.js +279 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/types.d.ts +23 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +3 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/web/http-api.d.ts +61 -0
- package/dist/web/http-api.d.ts.map +1 -0
- package/dist/web/http-api.js +200 -0
- package/dist/web/http-api.js.map +1 -0
- package/dist/web/server.d.ts +7 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +396 -0
- package/dist/web/server.js.map +1 -0
- package/mach6.example.json +50 -0
- package/package.json +58 -0
- 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"}
|