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,244 @@
|
|
|
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 { randomUUID } from 'node:crypto';
|
|
9
|
+
// ─── WhatsApp JID Normalization ────────────────────────────────────────────
|
|
10
|
+
// Baileys v7 uses JIDs with device suffix: "1234567890:5@s.whatsapp.net"
|
|
11
|
+
// Config stores them without suffix: "1234567890@s.whatsapp.net"
|
|
12
|
+
// Normalize by stripping the device part before comparison.
|
|
13
|
+
function normalizeJid(jid) {
|
|
14
|
+
// Strip device suffix from WhatsApp JIDs: "num:device@s.whatsapp.net" → "num@s.whatsapp.net"
|
|
15
|
+
return jid.replace(/:\d+@s\.whatsapp\.net$/, '@s.whatsapp.net');
|
|
16
|
+
}
|
|
17
|
+
function jidMatches(jid, target) {
|
|
18
|
+
return normalizeJid(jid) === normalizeJid(target);
|
|
19
|
+
}
|
|
20
|
+
function jidInList(jid, list) {
|
|
21
|
+
const normalized = normalizeJid(jid);
|
|
22
|
+
return list.some(item => normalizeJid(item) === normalized);
|
|
23
|
+
}
|
|
24
|
+
// ─── Interrupt Detection ───────────────────────────────────────────────────
|
|
25
|
+
const INTERRUPT_PATTERNS = [
|
|
26
|
+
/^(stop|wait|hold on|pause|cancel|actually|never ?mind)/i,
|
|
27
|
+
/^(no[,.]?\s|don'?t\s|abort)/i,
|
|
28
|
+
/^(scratch that|forget it|hold up)/i,
|
|
29
|
+
];
|
|
30
|
+
// ─── Deduplication ─────────────────────────────────────────────────────────
|
|
31
|
+
class DeduplicationCache {
|
|
32
|
+
seen = new Map(); // messageId → timestamp
|
|
33
|
+
maxSize;
|
|
34
|
+
ttlMs;
|
|
35
|
+
constructor(maxSize = 10_000, ttlMs = 5 * 60 * 1000) {
|
|
36
|
+
this.maxSize = maxSize;
|
|
37
|
+
this.ttlMs = ttlMs;
|
|
38
|
+
}
|
|
39
|
+
/** Returns true if this is a duplicate */
|
|
40
|
+
check(id) {
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
this.evict(now);
|
|
43
|
+
if (this.seen.has(id))
|
|
44
|
+
return true;
|
|
45
|
+
this.seen.set(id, now);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
evict(now) {
|
|
49
|
+
if (this.seen.size < this.maxSize)
|
|
50
|
+
return;
|
|
51
|
+
// Remove expired entries
|
|
52
|
+
for (const [id, ts] of this.seen) {
|
|
53
|
+
if (now - ts > this.ttlMs)
|
|
54
|
+
this.seen.delete(id);
|
|
55
|
+
}
|
|
56
|
+
// If still over, remove oldest
|
|
57
|
+
if (this.seen.size >= this.maxSize) {
|
|
58
|
+
const oldest = this.seen.keys().next().value;
|
|
59
|
+
if (oldest)
|
|
60
|
+
this.seen.delete(oldest);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export class InboundRouter {
|
|
65
|
+
bus;
|
|
66
|
+
config;
|
|
67
|
+
dedup = new DeduplicationCache();
|
|
68
|
+
routes = new Map(); // "channelType:chatId" → route
|
|
69
|
+
sessionCounter = 0;
|
|
70
|
+
constructor(bus, config) {
|
|
71
|
+
this.bus = bus;
|
|
72
|
+
this.config = config;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Route an inbound message from a channel adapter.
|
|
76
|
+
* Returns false if the message was rejected by policy.
|
|
77
|
+
*/
|
|
78
|
+
route(source, payload, platformMessageId) {
|
|
79
|
+
// 1. Deduplication
|
|
80
|
+
const dedupKey = platformMessageId ?? `${source.adapterId}:${source.chatId}:${Date.now()}`;
|
|
81
|
+
if (this.dedup.check(dedupKey))
|
|
82
|
+
return false;
|
|
83
|
+
// 2. Policy check
|
|
84
|
+
const policy = this.getPolicy(source.channelType);
|
|
85
|
+
if (!this.checkPolicy(policy, source))
|
|
86
|
+
return false;
|
|
87
|
+
// 3. Resolve session
|
|
88
|
+
const sessionId = this.resolveSession(source);
|
|
89
|
+
// 4. Determine priority
|
|
90
|
+
const priority = this.assignPriority(policy, source, payload, sessionId);
|
|
91
|
+
// 5. Build envelope
|
|
92
|
+
const envelope = {
|
|
93
|
+
id: randomUUID(),
|
|
94
|
+
timestamp: Date.now(),
|
|
95
|
+
priority,
|
|
96
|
+
source,
|
|
97
|
+
sessionId,
|
|
98
|
+
payload,
|
|
99
|
+
metadata: {
|
|
100
|
+
platformMessageId,
|
|
101
|
+
guildId: source.guildId,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
// 6. Publish to bus
|
|
105
|
+
this.bus.publish(envelope);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
// ── Policy ─────────────────────────────────────────────────────────────
|
|
109
|
+
getPolicy(channelType) {
|
|
110
|
+
return this.config.policies.get(channelType) ?? this.config.defaultPolicy ?? {
|
|
111
|
+
dmPolicy: 'deny',
|
|
112
|
+
groupPolicy: 'deny',
|
|
113
|
+
ownerIds: [],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
checkPolicy(policy, source) {
|
|
117
|
+
// Sibling bot yield: if message explicitly @mentions a sibling bot but NOT us, yield.
|
|
118
|
+
// This applies even for owners — ensures @Plug → only Plug, @AVA → only AVA.
|
|
119
|
+
// No mention at all → both respond (owner bypass or normal policy applies).
|
|
120
|
+
if (policy.siblingBotIds?.length && policy.selfId && source.mentions?.length) {
|
|
121
|
+
const mentionsMe = source.mentions.includes(policy.selfId);
|
|
122
|
+
const mentionsSibling = source.mentions.some(id => policy.siblingBotIds.includes(id));
|
|
123
|
+
if (mentionsSibling && !mentionsMe)
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
const isOwner = this.isOwner(policy, source.senderId);
|
|
127
|
+
if (isOwner)
|
|
128
|
+
return true; // Owners bypass all policy
|
|
129
|
+
if (source.chatType === 'dm') {
|
|
130
|
+
switch (policy.dmPolicy) {
|
|
131
|
+
case 'open': return true;
|
|
132
|
+
case 'allowlist': return jidInList(source.senderId, policy.allowedSenders ?? []);
|
|
133
|
+
case 'deny': return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (source.chatType === 'group' || source.chatType === 'channel') {
|
|
137
|
+
switch (policy.groupPolicy) {
|
|
138
|
+
case 'open': return true;
|
|
139
|
+
case 'allowlist': return jidInList(source.chatId, policy.allowedGroups ?? []);
|
|
140
|
+
case 'mention-only': return this.isMentioned(policy, source);
|
|
141
|
+
case 'deny': return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Threads inherit parent policy (treat as group)
|
|
145
|
+
if (source.chatType === 'thread') {
|
|
146
|
+
return policy.groupPolicy !== 'deny';
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
isOwner(policy, senderId) {
|
|
151
|
+
if (jidInList(senderId, policy.ownerIds))
|
|
152
|
+
return true;
|
|
153
|
+
if (this.config.globalOwnerIds && jidInList(senderId, this.config.globalOwnerIds))
|
|
154
|
+
return true;
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
isMentioned(policy, source) {
|
|
158
|
+
if (!policy.selfId || !source.mentions)
|
|
159
|
+
return false;
|
|
160
|
+
return source.mentions.includes(policy.selfId);
|
|
161
|
+
}
|
|
162
|
+
// ── Session Resolution ─────────────────────────────────────────────────
|
|
163
|
+
resolveSession(source) {
|
|
164
|
+
const routeKey = `${source.channelType}:${source.chatId}`;
|
|
165
|
+
const existing = this.routes.get(routeKey);
|
|
166
|
+
if (existing) {
|
|
167
|
+
existing.lastActive = Date.now();
|
|
168
|
+
return existing.sessionId;
|
|
169
|
+
}
|
|
170
|
+
// Create new session route
|
|
171
|
+
const sessionId = `${source.channelType}-${source.chatId}-${++this.sessionCounter}`;
|
|
172
|
+
this.routes.set(routeKey, {
|
|
173
|
+
channelType: source.channelType,
|
|
174
|
+
chatId: source.chatId,
|
|
175
|
+
sessionId,
|
|
176
|
+
lastActive: Date.now(),
|
|
177
|
+
});
|
|
178
|
+
return sessionId;
|
|
179
|
+
}
|
|
180
|
+
// ── Priority Assignment ────────────────────────────────────────────────
|
|
181
|
+
assignPriority(policy, source, payload, sessionId) {
|
|
182
|
+
// Non-text payloads
|
|
183
|
+
if (payload.type === 'typing' || payload.type === 'presence')
|
|
184
|
+
return 'background';
|
|
185
|
+
if (payload.type === 'reaction')
|
|
186
|
+
return 'low';
|
|
187
|
+
const isOwner = this.isOwner(policy, source.senderId);
|
|
188
|
+
const text = payload.text?.trim() ?? '';
|
|
189
|
+
// Check if this session has an active agent turn
|
|
190
|
+
const activeSessions = this.config.getActiveSessions?.() ?? new Set();
|
|
191
|
+
const sessionActive = activeSessions.has(sessionId);
|
|
192
|
+
// Owner message during active turn → interrupt
|
|
193
|
+
if (isOwner && sessionActive) {
|
|
194
|
+
// Check for explicit interrupt patterns
|
|
195
|
+
if (INTERRUPT_PATTERNS.some(p => p.test(text))) {
|
|
196
|
+
return 'interrupt';
|
|
197
|
+
}
|
|
198
|
+
// Owner sending anything during active turn is at least high priority
|
|
199
|
+
// The bus coalesce logic will handle rapid-fire messages
|
|
200
|
+
return 'high';
|
|
201
|
+
}
|
|
202
|
+
// Owner message (no active turn) → high
|
|
203
|
+
if (isOwner)
|
|
204
|
+
return 'high';
|
|
205
|
+
// DM from non-owner → normal
|
|
206
|
+
if (source.chatType === 'dm')
|
|
207
|
+
return 'normal';
|
|
208
|
+
// Group mention → normal
|
|
209
|
+
if (source.chatType === 'group' && this.isMentioned(policy, source))
|
|
210
|
+
return 'normal';
|
|
211
|
+
// Group without mention → low
|
|
212
|
+
return 'low';
|
|
213
|
+
}
|
|
214
|
+
// ── Route Management ───────────────────────────────────────────────────
|
|
215
|
+
/** Get all active routes */
|
|
216
|
+
getRoutes() {
|
|
217
|
+
return Array.from(this.routes.values());
|
|
218
|
+
}
|
|
219
|
+
/** Get session ID for a channel + chat */
|
|
220
|
+
getSessionId(channelType, chatId) {
|
|
221
|
+
return this.routes.get(`${channelType}:${chatId}`)?.sessionId;
|
|
222
|
+
}
|
|
223
|
+
/** Manually set a route (for restoring state) */
|
|
224
|
+
setRoute(route) {
|
|
225
|
+
this.routes.set(`${route.channelType}:${route.chatId}`, route);
|
|
226
|
+
}
|
|
227
|
+
/** Clean up stale routes (not active for given duration) */
|
|
228
|
+
pruneRoutes(maxIdleMs) {
|
|
229
|
+
const now = Date.now();
|
|
230
|
+
let pruned = 0;
|
|
231
|
+
for (const [key, route] of this.routes) {
|
|
232
|
+
if (now - route.lastActive > maxIdleMs) {
|
|
233
|
+
this.routes.delete(key);
|
|
234
|
+
pruned++;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return pruned;
|
|
238
|
+
}
|
|
239
|
+
/** Update policy for a channel */
|
|
240
|
+
setPolicy(channelType, policy) {
|
|
241
|
+
this.config.policies.set(channelType, policy);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/channels/router.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWzC,8EAA8E;AAC9E,yEAAyE;AACzE,iEAAiE;AACjE,4DAA4D;AAE5D,SAAS,YAAY,CAAC,GAAW;IAC/B,6FAA6F;IAC7F,OAAO,GAAG,CAAC,OAAO,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,MAAc;IAC7C,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,IAAc;IAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,CAAC;AAC9D,CAAC;AAED,8EAA8E;AAE9E,MAAM,kBAAkB,GAAG;IACzB,yDAAyD;IACzD,8BAA8B;IAC9B,oCAAoC;CACrC,CAAC;AAEF,8EAA8E;AAE9E,MAAM,kBAAkB;IACd,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,wBAAwB;IACjD,OAAO,CAAS;IAChB,KAAK,CAAS;IAE/B,YAAY,OAAO,GAAG,MAAM,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;QACjD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,0CAA0C;IAC1C,KAAK,CAAC,EAAU;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEhB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,GAAW;QACvB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1C,yBAAyB;QACzB,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,+BAA+B;QAC/B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC7C,IAAI,MAAM;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;CACF;AAeD,MAAM,OAAO,aAAa;IAChB,GAAG,CAAW;IACd,MAAM,CAAe;IACrB,KAAK,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACjC,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC,CAAC,+BAA+B;IACzE,cAAc,GAAG,CAAC,CAAC;IAE3B,YAAY,GAAa,EAAE,MAAoB;QAC7C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAqB,EAAE,OAAuB,EAAE,iBAA0B;QAC9E,mBAAmB;QACnB,MAAM,QAAQ,GAAG,iBAAiB,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC3F,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAE7C,kBAAkB;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAEpD,qBAAqB;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE9C,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAEzE,oBAAoB;QACpB,MAAM,QAAQ,GAAgB;YAC5B,EAAE,EAAE,UAAU,EAAE;YAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,QAAQ;YACR,MAAM;YACN,SAAS;YACT,OAAO;YACP,QAAQ,EAAE;gBACR,iBAAiB;gBACjB,OAAO,EAAG,MAAc,CAAC,OAAO;aACjC;SACF,CAAC;QAEF,oBAAoB;QACpB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0EAA0E;IAElE,SAAS,CAAC,WAAmB;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI;YAC3E,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,MAAM;YACnB,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,MAAqB,EAAE,MAAqB;QAC9D,sFAAsF;QACtF,6EAA6E;QAC7E,4EAA4E;QAC5E,IAAI,MAAM,CAAC,aAAa,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC7E,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YACvF,IAAI,eAAe,IAAI,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC,CAAC,2BAA2B;QAErD,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC7B,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACxB,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC;gBACzB,KAAK,WAAW,CAAC,CAAC,OAAO,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;gBACjF,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjE,QAAQ,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC3B,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC;gBACzB,KAAK,WAAW,CAAC,CAAC,OAAO,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;gBAC9E,KAAK,cAAc,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC7D,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,iDAAiD;QACjD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC;QACvC,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,OAAO,CAAC,MAAqB,EAAE,QAAgB;QACrD,IAAI,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/F,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,WAAW,CAAC,MAAqB,EAAE,MAAqB;QAC9D,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACrD,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,0EAA0E;IAElE,cAAc,CAAC,MAAqB;QAC1C,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC,SAAS,CAAC;QAC5B,CAAC;QAED,2BAA2B;QAC3B,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;YACxB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS;YACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;SACvB,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,0EAA0E;IAElE,cAAc,CACpB,MAAqB,EACrB,MAAqB,EACrB,OAAuB,EACvB,SAAiB;QAEjB,oBAAoB;QACpB,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,YAAY,CAAC;QAClF,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAE9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAExC,iDAAiD;QACjD,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;QACtE,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEpD,+CAA+C;QAC/C,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;YAC7B,wCAAwC;YACxC,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC/C,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,sEAAsE;YACtE,yDAAyD;YACzD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,wCAAwC;QACxC,IAAI,OAAO;YAAE,OAAO,MAAM,CAAC;QAE3B,6BAA6B;QAC7B,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,QAAQ,CAAC;QAE9C,yBAAyB;QACzB,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;YAAE,OAAO,QAAQ,CAAC;QAErF,8BAA8B;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0EAA0E;IAE1E,4BAA4B;IAC5B,SAAS;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,0CAA0C;IAC1C,YAAY,CAAC,WAAmB,EAAE,MAAc;QAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,IAAI,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC;IAChE,CAAC;IAED,iDAAiD;IACjD,QAAQ,CAAC,KAAmB;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;IAED,4DAA4D;IAC5D,WAAW,CAAC,SAAiB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,GAAG,GAAG,KAAK,CAAC,UAAU,GAAG,SAAS,EAAE,CAAC;gBACvC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxB,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kCAAkC;IAClC,SAAS,CAAC,WAAmB,EAAE,MAAqB;QAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mach6 — Channel System Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Core types for the message bus, channel adapters, and routing layer.
|
|
5
|
+
* Zero dependencies. This file imports nothing.
|
|
6
|
+
*/
|
|
7
|
+
export type MessagePriority = 'interrupt' | 'high' | 'normal' | 'low' | 'background';
|
|
8
|
+
export interface BusEnvelope {
|
|
9
|
+
/** Unique envelope ID (UUID) */
|
|
10
|
+
id: string;
|
|
11
|
+
/** When the envelope entered the bus */
|
|
12
|
+
timestamp: number;
|
|
13
|
+
/** Processing priority */
|
|
14
|
+
priority: MessagePriority;
|
|
15
|
+
/** Where this message came from */
|
|
16
|
+
source: ChannelSource;
|
|
17
|
+
/** Which session should handle it (resolved by router) */
|
|
18
|
+
sessionId?: string;
|
|
19
|
+
/** The actual message content */
|
|
20
|
+
payload: InboundPayload;
|
|
21
|
+
/** Platform-specific preserved data */
|
|
22
|
+
metadata: EnvelopeMetadata;
|
|
23
|
+
}
|
|
24
|
+
export interface ChannelSource {
|
|
25
|
+
/** Channel type: "discord", "whatsapp", "telegram", etc. */
|
|
26
|
+
channelType: string;
|
|
27
|
+
/** Adapter instance ID: "discord-main", "wa-0987654321" */
|
|
28
|
+
adapterId: string;
|
|
29
|
+
/** Chat/conversation identifier on the platform */
|
|
30
|
+
chatId: string;
|
|
31
|
+
/** Chat type */
|
|
32
|
+
chatType: 'dm' | 'group' | 'channel' | 'thread';
|
|
33
|
+
/** Sender's platform-specific ID */
|
|
34
|
+
senderId: string;
|
|
35
|
+
/** Sender display name */
|
|
36
|
+
senderName?: string;
|
|
37
|
+
/** If this is a reply, the message being replied to */
|
|
38
|
+
replyToId?: string;
|
|
39
|
+
/** Thread ID if in a thread */
|
|
40
|
+
threadId?: string;
|
|
41
|
+
/** Mentioned user IDs */
|
|
42
|
+
mentions?: string[];
|
|
43
|
+
}
|
|
44
|
+
export type PayloadType = 'text' | 'media' | 'reaction' | 'edit' | 'delete' | 'typing' | 'presence' | 'system';
|
|
45
|
+
export interface InboundPayload {
|
|
46
|
+
type: PayloadType;
|
|
47
|
+
text?: string;
|
|
48
|
+
media?: MediaPayload[];
|
|
49
|
+
reaction?: ReactionPayload;
|
|
50
|
+
edit?: EditPayload;
|
|
51
|
+
/** Original platform event — never discarded, never parsed by core */
|
|
52
|
+
raw?: unknown;
|
|
53
|
+
}
|
|
54
|
+
export interface MediaPayload {
|
|
55
|
+
type: 'image' | 'video' | 'audio' | 'document' | 'sticker' | 'voice';
|
|
56
|
+
url?: string;
|
|
57
|
+
path?: string;
|
|
58
|
+
mimeType?: string;
|
|
59
|
+
filename?: string;
|
|
60
|
+
sizeBytes?: number;
|
|
61
|
+
durationMs?: number;
|
|
62
|
+
width?: number;
|
|
63
|
+
height?: number;
|
|
64
|
+
/** Caption text (for platforms that support media + caption) */
|
|
65
|
+
caption?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface ReactionPayload {
|
|
68
|
+
emoji: string;
|
|
69
|
+
messageId: string;
|
|
70
|
+
remove?: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface EditPayload {
|
|
73
|
+
messageId: string;
|
|
74
|
+
newText: string;
|
|
75
|
+
}
|
|
76
|
+
export interface EnvelopeMetadata {
|
|
77
|
+
/** Platform-specific message ID */
|
|
78
|
+
platformMessageId?: string;
|
|
79
|
+
/** Guild/server ID (Discord, Slack) */
|
|
80
|
+
guildId?: string;
|
|
81
|
+
/** Is this an ephemeral/disappearing message? */
|
|
82
|
+
ephemeral?: boolean;
|
|
83
|
+
/** Forwarded from another chat? */
|
|
84
|
+
forwarded?: boolean;
|
|
85
|
+
/** Additional platform data */
|
|
86
|
+
extra?: Record<string, unknown>;
|
|
87
|
+
}
|
|
88
|
+
export interface OutboundMessage {
|
|
89
|
+
/** Markdown content (agent output) */
|
|
90
|
+
content: string;
|
|
91
|
+
/** Media attachments */
|
|
92
|
+
media?: MediaPayload[];
|
|
93
|
+
/** Reply to a specific message */
|
|
94
|
+
replyToId?: string;
|
|
95
|
+
/** Post in a thread */
|
|
96
|
+
threadId?: string;
|
|
97
|
+
/** Ephemeral/disappearing */
|
|
98
|
+
ephemeral?: boolean;
|
|
99
|
+
/** Interactive components (buttons, keyboards) */
|
|
100
|
+
components?: MessageComponent[];
|
|
101
|
+
/** How to handle messages exceeding platform limit */
|
|
102
|
+
splitStrategy?: 'truncate' | 'paginate' | 'thread';
|
|
103
|
+
/** Priority for rate limiting */
|
|
104
|
+
priority?: 'interactive' | 'proactive' | 'background';
|
|
105
|
+
}
|
|
106
|
+
export interface MessageComponent {
|
|
107
|
+
type: 'button' | 'select' | 'action_row';
|
|
108
|
+
label?: string;
|
|
109
|
+
value?: string;
|
|
110
|
+
style?: string;
|
|
111
|
+
children?: MessageComponent[];
|
|
112
|
+
}
|
|
113
|
+
export interface SendResult {
|
|
114
|
+
success: boolean;
|
|
115
|
+
messageId?: string;
|
|
116
|
+
error?: string;
|
|
117
|
+
/** Timestamp when actually delivered (if platform confirms) */
|
|
118
|
+
deliveredAt?: number;
|
|
119
|
+
}
|
|
120
|
+
export type AdapterHealthState = 'connected' | 'degraded' | 'disconnected' | 'reconnecting';
|
|
121
|
+
export interface AdapterHealth {
|
|
122
|
+
state: AdapterHealthState;
|
|
123
|
+
lastConnected: number;
|
|
124
|
+
disconnectCount: number;
|
|
125
|
+
lastError?: string;
|
|
126
|
+
uptimePercent?: number;
|
|
127
|
+
latencyMs?: number;
|
|
128
|
+
}
|
|
129
|
+
export interface ChannelCapabilities {
|
|
130
|
+
media: boolean;
|
|
131
|
+
reactions: boolean;
|
|
132
|
+
messageEdit: boolean;
|
|
133
|
+
messageDelete: boolean;
|
|
134
|
+
threads: boolean;
|
|
135
|
+
embeds: boolean;
|
|
136
|
+
components: boolean;
|
|
137
|
+
voiceNotes: boolean;
|
|
138
|
+
readReceipts: boolean;
|
|
139
|
+
typingIndicator: boolean;
|
|
140
|
+
ephemeral: boolean;
|
|
141
|
+
polls: boolean;
|
|
142
|
+
/** Platform's native formatting dialect */
|
|
143
|
+
formatting: 'markdown' | 'html' | 'plain' | 'whatsapp' | 'slack-mrkdwn';
|
|
144
|
+
/** Maximum message length in characters */
|
|
145
|
+
maxMessageLength: number;
|
|
146
|
+
/** Maximum media size in bytes */
|
|
147
|
+
maxMediaSize: number;
|
|
148
|
+
/** Rate limits */
|
|
149
|
+
rateLimits: RateLimitConfig;
|
|
150
|
+
}
|
|
151
|
+
export interface RateLimitConfig {
|
|
152
|
+
messagesPerSecond?: number;
|
|
153
|
+
messagesPerMinute?: number;
|
|
154
|
+
burstSize?: number;
|
|
155
|
+
}
|
|
156
|
+
export interface ChannelConfig {
|
|
157
|
+
/** Adapter-specific configuration (API keys, tokens, etc.) */
|
|
158
|
+
[key: string]: unknown;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Channel Adapter — the contract every platform adapter implements.
|
|
162
|
+
*
|
|
163
|
+
* 5 core methods + optional platform-specific actions.
|
|
164
|
+
* Adapters own their platform SDK. The bus and agent never touch it.
|
|
165
|
+
*/
|
|
166
|
+
export interface ChannelAdapter {
|
|
167
|
+
/** Unique adapter instance ID */
|
|
168
|
+
readonly id: string;
|
|
169
|
+
/** Channel type identifier */
|
|
170
|
+
readonly channelType: string;
|
|
171
|
+
/** What this platform supports */
|
|
172
|
+
readonly capabilities: ChannelCapabilities;
|
|
173
|
+
/** Initialize and connect to the platform */
|
|
174
|
+
connect(config: ChannelConfig, signal?: AbortSignal): Promise<void>;
|
|
175
|
+
/** Graceful disconnect */
|
|
176
|
+
disconnect(): Promise<void>;
|
|
177
|
+
/** Force reconnect (after disconnect/error) */
|
|
178
|
+
reconnect(): Promise<void>;
|
|
179
|
+
/** Current health status */
|
|
180
|
+
getHealth(): AdapterHealth;
|
|
181
|
+
/** Register handler for incoming messages. Adapter normalizes and calls handler. */
|
|
182
|
+
onMessage(handler: (envelope: BusEnvelope) => void): void;
|
|
183
|
+
/** Register handler for health state changes */
|
|
184
|
+
onHealthChange(handler: (health: AdapterHealth) => void): void;
|
|
185
|
+
/** Send a message to a target chat */
|
|
186
|
+
send(chatId: string, message: OutboundMessage): Promise<SendResult>;
|
|
187
|
+
/** React to a message with an emoji */
|
|
188
|
+
react?(chatId: string, messageId: string, emoji: string): Promise<void>;
|
|
189
|
+
/** Edit a previously sent message */
|
|
190
|
+
editMessage?(chatId: string, messageId: string, newContent: string): Promise<void>;
|
|
191
|
+
/** Delete a message */
|
|
192
|
+
deleteMessage?(chatId: string, messageId: string): Promise<void>;
|
|
193
|
+
/** Send typing indicator */
|
|
194
|
+
typing?(chatId: string, durationMs?: number): Promise<void>;
|
|
195
|
+
/** Mark a message as read */
|
|
196
|
+
markRead?(chatId: string, messageId: string): Promise<void>;
|
|
197
|
+
}
|
|
198
|
+
export interface ChannelPolicy {
|
|
199
|
+
/** DM handling: open to all, allowlist only, or deny all */
|
|
200
|
+
dmPolicy: 'open' | 'allowlist' | 'deny';
|
|
201
|
+
/** Group handling */
|
|
202
|
+
groupPolicy: 'open' | 'allowlist' | 'mention-only' | 'deny';
|
|
203
|
+
/** Allowed sender IDs (for allowlist mode) */
|
|
204
|
+
allowedSenders?: string[];
|
|
205
|
+
/** Allowed group IDs (for group allowlist) */
|
|
206
|
+
allowedGroups?: string[];
|
|
207
|
+
/** Owner IDs — always allowed, always high priority */
|
|
208
|
+
ownerIds: string[];
|
|
209
|
+
/** Require @mention in groups to trigger response */
|
|
210
|
+
requireMention?: boolean;
|
|
211
|
+
/** Bot's own ID on this platform (for mention detection) */
|
|
212
|
+
selfId?: string;
|
|
213
|
+
/** Sibling bot IDs — if a message @mentions a sibling but NOT us, yield */
|
|
214
|
+
siblingBotIds?: string[];
|
|
215
|
+
}
|
|
216
|
+
export interface SessionRoute {
|
|
217
|
+
/** Channel type + chat ID → session ID mapping */
|
|
218
|
+
channelType: string;
|
|
219
|
+
chatId: string;
|
|
220
|
+
sessionId: string;
|
|
221
|
+
/** When this route was last active */
|
|
222
|
+
lastActive: number;
|
|
223
|
+
}
|
|
224
|
+
export type BusEventType = 'message' | 'interrupt' | 'drain' | 'backpressure' | 'health';
|
|
225
|
+
export interface BusEvent {
|
|
226
|
+
type: BusEventType;
|
|
227
|
+
envelope?: BusEnvelope;
|
|
228
|
+
sessionId?: string;
|
|
229
|
+
data?: unknown;
|
|
230
|
+
}
|
|
231
|
+
export type BusSubscription = {
|
|
232
|
+
unsubscribe(): void;
|
|
233
|
+
};
|
|
234
|
+
export interface MessageBus {
|
|
235
|
+
/** Publish an envelope to the bus */
|
|
236
|
+
publish(envelope: BusEnvelope): void;
|
|
237
|
+
/** Subscribe to messages for a session (filtered by priority) */
|
|
238
|
+
subscribe(sessionId: string, handler: (envelope: BusEnvelope) => void, filter?: {
|
|
239
|
+
priorities?: MessagePriority[];
|
|
240
|
+
}): BusSubscription;
|
|
241
|
+
/** Subscribe to interrupt signals for a session */
|
|
242
|
+
onInterrupt(sessionId: string, handler: (envelope: BusEnvelope) => void): BusSubscription;
|
|
243
|
+
/** Drain all pending messages for a session (removes from queue) */
|
|
244
|
+
drain(sessionId: string, filter?: {
|
|
245
|
+
priorities?: MessagePriority[];
|
|
246
|
+
}): BusEnvelope[];
|
|
247
|
+
/** Peek at pending count without draining */
|
|
248
|
+
pending(sessionId: string): number;
|
|
249
|
+
/** Current bus stats */
|
|
250
|
+
stats(): BusStats;
|
|
251
|
+
}
|
|
252
|
+
export interface BusStats {
|
|
253
|
+
totalPublished: number;
|
|
254
|
+
totalDelivered: number;
|
|
255
|
+
totalDropped: number;
|
|
256
|
+
pendingBySession: Map<string, number>;
|
|
257
|
+
queueDepth: number;
|
|
258
|
+
}
|
|
259
|
+
export interface OutboundFormatter {
|
|
260
|
+
/** Convert markdown to platform-native format */
|
|
261
|
+
format(markdown: string, capabilities: ChannelCapabilities): string;
|
|
262
|
+
/** Split content into chunks that fit platform limits */
|
|
263
|
+
split(content: string, maxLength: number): string[];
|
|
264
|
+
}
|
|
265
|
+
export declare class HealthTracker {
|
|
266
|
+
private _state;
|
|
267
|
+
private _lastConnected;
|
|
268
|
+
private _disconnectCount;
|
|
269
|
+
private _lastError?;
|
|
270
|
+
private _connectedSince;
|
|
271
|
+
private _totalConnectedMs;
|
|
272
|
+
private _trackingSince;
|
|
273
|
+
private _handlers;
|
|
274
|
+
get state(): AdapterHealthState;
|
|
275
|
+
get status(): AdapterHealth;
|
|
276
|
+
transition(to: AdapterHealthState, error?: string): boolean;
|
|
277
|
+
onChange(handler: (health: AdapterHealth) => void): void;
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mach6 — Channel System Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Core types for the message bus, channel adapters, and routing layer.
|
|
5
|
+
* Zero dependencies. This file imports nothing.
|
|
6
|
+
*/
|
|
7
|
+
// ─── Health Tracker ────────────────────────────────────────────────────────
|
|
8
|
+
const VALID_TRANSITIONS = {
|
|
9
|
+
connected: ['degraded', 'disconnected'],
|
|
10
|
+
degraded: ['connected', 'disconnected'],
|
|
11
|
+
disconnected: ['reconnecting'],
|
|
12
|
+
reconnecting: ['connected', 'disconnected'],
|
|
13
|
+
};
|
|
14
|
+
export class HealthTracker {
|
|
15
|
+
_state = 'disconnected';
|
|
16
|
+
_lastConnected = 0;
|
|
17
|
+
_disconnectCount = 0;
|
|
18
|
+
_lastError;
|
|
19
|
+
_connectedSince = 0;
|
|
20
|
+
_totalConnectedMs = 0;
|
|
21
|
+
_trackingSince = Date.now();
|
|
22
|
+
_handlers = [];
|
|
23
|
+
get state() { return this._state; }
|
|
24
|
+
get status() {
|
|
25
|
+
const now = Date.now();
|
|
26
|
+
let connectedMs = this._totalConnectedMs;
|
|
27
|
+
if (this._state === 'connected' && this._connectedSince > 0) {
|
|
28
|
+
connectedMs += now - this._connectedSince;
|
|
29
|
+
}
|
|
30
|
+
const totalMs = now - this._trackingSince;
|
|
31
|
+
return {
|
|
32
|
+
state: this._state,
|
|
33
|
+
lastConnected: this._lastConnected,
|
|
34
|
+
disconnectCount: this._disconnectCount,
|
|
35
|
+
lastError: this._lastError,
|
|
36
|
+
uptimePercent: totalMs > 0 ? Math.round((connectedMs / totalMs) * 100) : 0,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
transition(to, error) {
|
|
40
|
+
const allowed = VALID_TRANSITIONS[this._state];
|
|
41
|
+
if (!allowed?.includes(to))
|
|
42
|
+
return false;
|
|
43
|
+
const now = Date.now();
|
|
44
|
+
if (this._state === 'connected' && this._connectedSince > 0) {
|
|
45
|
+
this._totalConnectedMs += now - this._connectedSince;
|
|
46
|
+
this._connectedSince = 0;
|
|
47
|
+
}
|
|
48
|
+
if (to === 'connected') {
|
|
49
|
+
this._lastConnected = now;
|
|
50
|
+
this._connectedSince = now;
|
|
51
|
+
}
|
|
52
|
+
if (to === 'disconnected') {
|
|
53
|
+
this._disconnectCount++;
|
|
54
|
+
if (error)
|
|
55
|
+
this._lastError = error;
|
|
56
|
+
}
|
|
57
|
+
this._state = to;
|
|
58
|
+
const status = this.status;
|
|
59
|
+
for (const h of this._handlers)
|
|
60
|
+
h(status);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
onChange(handler) {
|
|
64
|
+
this._handlers.push(handler);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgUH,8EAA8E;AAE9E,MAAM,iBAAiB,GAAqD;IAC1E,SAAS,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC;IACvC,QAAQ,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;IACvC,YAAY,EAAE,CAAC,cAAc,CAAC;IAC9B,YAAY,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;CAC5C,CAAC;AAEF,MAAM,OAAO,aAAa;IAChB,MAAM,GAAuB,cAAc,CAAC;IAC5C,cAAc,GAAG,CAAC,CAAC;IACnB,gBAAgB,GAAG,CAAC,CAAC;IACrB,UAAU,CAAU;IACpB,eAAe,GAAG,CAAC,CAAC;IACpB,iBAAiB,GAAG,CAAC,CAAC;IACtB,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5B,SAAS,GAA2C,EAAE,CAAC;IAE/D,IAAI,KAAK,KAAyB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvD,IAAI,MAAM;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACzC,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YAC5D,WAAW,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,aAAa,EAAE,IAAI,CAAC,cAAc;YAClC,eAAe,EAAE,IAAI,CAAC,gBAAgB;YACtC,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,aAAa,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3E,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,EAAsB,EAAE,KAAc;QAC/C,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QAEzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,iBAAiB,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;YACrD,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;QAC7B,CAAC;QACD,IAAI,EAAE,KAAK,cAAc,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,KAAK;gBAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS;YAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,OAAwC;QAC/C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;CACF"}
|