@terminals-tech/agent-zero 1.0.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/README.md +209 -0
- package/bin/agent-zero.js +332 -0
- package/dist/agency/commandRouter.d.ts +48 -0
- package/dist/agency/commandRouter.d.ts.map +1 -0
- package/dist/agency/commandRouter.js +343 -0
- package/dist/agency/commandRouter.js.map +1 -0
- package/dist/agency/runtime.d.ts +66 -0
- package/dist/agency/runtime.d.ts.map +1 -0
- package/dist/agency/runtime.js +247 -0
- package/dist/agency/runtime.js.map +1 -0
- package/dist/agency/summaryGenerator.d.ts +39 -0
- package/dist/agency/summaryGenerator.d.ts.map +1 -0
- package/dist/agency/summaryGenerator.js +110 -0
- package/dist/agency/summaryGenerator.js.map +1 -0
- package/dist/agency/summaryScheduler.d.ts +33 -0
- package/dist/agency/summaryScheduler.d.ts.map +1 -0
- package/dist/agency/summaryScheduler.js +68 -0
- package/dist/agency/summaryScheduler.js.map +1 -0
- package/dist/browser/agent-runtime/RuntimePanel.d.ts +20 -0
- package/dist/browser/agent-runtime/RuntimePanel.d.ts.map +1 -0
- package/dist/browser/agent-runtime/RuntimePanel.js +203 -0
- package/dist/browser/agent-runtime/RuntimePanel.js.map +1 -0
- package/dist/browser/agent-runtime/config.d.ts +28 -0
- package/dist/browser/agent-runtime/config.d.ts.map +1 -0
- package/dist/browser/agent-runtime/config.js +50 -0
- package/dist/browser/agent-runtime/config.js.map +1 -0
- package/dist/browser/agent-runtime/launcher.d.ts +71 -0
- package/dist/browser/agent-runtime/launcher.d.ts.map +1 -0
- package/dist/browser/agent-runtime/launcher.js +167 -0
- package/dist/browser/agent-runtime/launcher.js.map +1 -0
- package/dist/browser/rail-auth-bridge.d.ts +85 -0
- package/dist/browser/rail-auth-bridge.d.ts.map +1 -0
- package/dist/browser/rail-auth-bridge.js +209 -0
- package/dist/browser/rail-auth-bridge.js.map +1 -0
- package/dist/channels/index.d.ts +13 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +12 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/moltbook.d.ts +114 -0
- package/dist/channels/moltbook.d.ts.map +1 -0
- package/dist/channels/moltbook.js +348 -0
- package/dist/channels/moltbook.js.map +1 -0
- package/dist/channels/sms.d.ts +33 -0
- package/dist/channels/sms.d.ts.map +1 -0
- package/dist/channels/sms.js +160 -0
- package/dist/channels/sms.js.map +1 -0
- package/dist/channels/telegram.d.ts +47 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +276 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/twitter.d.ts +93 -0
- package/dist/channels/twitter.d.ts.map +1 -0
- package/dist/channels/twitter.js +411 -0
- package/dist/channels/twitter.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +77 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +514 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/checkout/index.d.ts +92 -0
- package/dist/checkout/index.d.ts.map +1 -0
- package/dist/checkout/index.js +125 -0
- package/dist/checkout/index.js.map +1 -0
- package/dist/cli/moltbook.d.ts +11 -0
- package/dist/cli/moltbook.d.ts.map +1 -0
- package/dist/cli/moltbook.js +259 -0
- package/dist/cli/moltbook.js.map +1 -0
- package/dist/cli/setup.d.ts +10 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +232 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/coherence/absorption.d.ts +141 -0
- package/dist/coherence/absorption.d.ts.map +1 -0
- package/dist/coherence/absorption.js +343 -0
- package/dist/coherence/absorption.js.map +1 -0
- package/dist/coherence/crossPlatform.d.ts +55 -0
- package/dist/coherence/crossPlatform.d.ts.map +1 -0
- package/dist/coherence/crossPlatform.js +219 -0
- package/dist/coherence/crossPlatform.js.map +1 -0
- package/dist/coherence/identityResolver.d.ts +27 -0
- package/dist/coherence/identityResolver.d.ts.map +1 -0
- package/dist/coherence/identityResolver.js +102 -0
- package/dist/coherence/identityResolver.js.map +1 -0
- package/dist/identity/burner.d.ts +100 -0
- package/dist/identity/burner.d.ts.map +1 -0
- package/dist/identity/burner.js +256 -0
- package/dist/identity/burner.js.map +1 -0
- package/dist/identity/burnerScheduler.d.ts +18 -0
- package/dist/identity/burnerScheduler.d.ts.map +1 -0
- package/dist/identity/burnerScheduler.js +82 -0
- package/dist/identity/burnerScheduler.js.map +1 -0
- package/dist/identity/moltbookBurnerAdapter.d.ts +14 -0
- package/dist/identity/moltbookBurnerAdapter.d.ts.map +1 -0
- package/dist/identity/moltbookBurnerAdapter.js +82 -0
- package/dist/identity/moltbookBurnerAdapter.js.map +1 -0
- package/dist/identity/operationalVault.d.ts +108 -0
- package/dist/identity/operationalVault.d.ts.map +1 -0
- package/dist/identity/operationalVault.js +259 -0
- package/dist/identity/operationalVault.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/moltbook/apiErrorHandler.d.ts +48 -0
- package/dist/moltbook/apiErrorHandler.d.ts.map +1 -0
- package/dist/moltbook/apiErrorHandler.js +125 -0
- package/dist/moltbook/apiErrorHandler.js.map +1 -0
- package/dist/moltbook/approvalGate.d.ts +81 -0
- package/dist/moltbook/approvalGate.d.ts.map +1 -0
- package/dist/moltbook/approvalGate.js +211 -0
- package/dist/moltbook/approvalGate.js.map +1 -0
- package/dist/moltbook/attentionField.d.ts +55 -0
- package/dist/moltbook/attentionField.d.ts.map +1 -0
- package/dist/moltbook/attentionField.js +163 -0
- package/dist/moltbook/attentionField.js.map +1 -0
- package/dist/moltbook/contentEnhancer.d.ts +28 -0
- package/dist/moltbook/contentEnhancer.d.ts.map +1 -0
- package/dist/moltbook/contentEnhancer.js +129 -0
- package/dist/moltbook/contentEnhancer.js.map +1 -0
- package/dist/moltbook/daemon.d.ts +111 -0
- package/dist/moltbook/daemon.d.ts.map +1 -0
- package/dist/moltbook/daemon.js +497 -0
- package/dist/moltbook/daemon.js.map +1 -0
- package/dist/moltbook/observer.d.ts +44 -0
- package/dist/moltbook/observer.d.ts.map +1 -0
- package/dist/moltbook/observer.js +71 -0
- package/dist/moltbook/observer.js.map +1 -0
- package/dist/moltbook/responseComposer.d.ts +54 -0
- package/dist/moltbook/responseComposer.d.ts.map +1 -0
- package/dist/moltbook/responseComposer.js +233 -0
- package/dist/moltbook/responseComposer.js.map +1 -0
- package/dist/openclaw/gateway.d.ts +45 -0
- package/dist/openclaw/gateway.d.ts.map +1 -0
- package/dist/openclaw/gateway.js +139 -0
- package/dist/openclaw/gateway.js.map +1 -0
- package/dist/openclaw/skill.d.ts +185 -0
- package/dist/openclaw/skill.d.ts.map +1 -0
- package/dist/openclaw/skill.js +297 -0
- package/dist/openclaw/skill.js.map +1 -0
- package/dist/primitives/index.d.ts +23 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +27 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/types.d.ts +673 -0
- package/dist/primitives/types.d.ts.map +1 -0
- package/dist/primitives/types.js +205 -0
- package/dist/primitives/types.js.map +1 -0
- package/dist/rail/absorptionBridge.d.ts +47 -0
- package/dist/rail/absorptionBridge.d.ts.map +1 -0
- package/dist/rail/absorptionBridge.js +78 -0
- package/dist/rail/absorptionBridge.js.map +1 -0
- package/dist/rail/authProtocol.d.ts +32 -0
- package/dist/rail/authProtocol.d.ts.map +1 -0
- package/dist/rail/authProtocol.js +83 -0
- package/dist/rail/authProtocol.js.map +1 -0
- package/dist/rail/clientRateLimiter.d.ts +17 -0
- package/dist/rail/clientRateLimiter.d.ts.map +1 -0
- package/dist/rail/clientRateLimiter.js +64 -0
- package/dist/rail/clientRateLimiter.js.map +1 -0
- package/dist/rail/index.d.ts +8 -0
- package/dist/rail/index.d.ts.map +1 -0
- package/dist/rail/index.js +38 -0
- package/dist/rail/index.js.map +1 -0
- package/dist/rail/jwtVerifier.d.ts +11 -0
- package/dist/rail/jwtVerifier.d.ts.map +1 -0
- package/dist/rail/jwtVerifier.js +55 -0
- package/dist/rail/jwtVerifier.js.map +1 -0
- package/dist/rail/logger.d.ts +13 -0
- package/dist/rail/logger.d.ts.map +1 -0
- package/dist/rail/logger.js +29 -0
- package/dist/rail/logger.js.map +1 -0
- package/dist/rail/metadataBroadcaster.d.ts +53 -0
- package/dist/rail/metadataBroadcaster.d.ts.map +1 -0
- package/dist/rail/metadataBroadcaster.js +126 -0
- package/dist/rail/metadataBroadcaster.js.map +1 -0
- package/dist/rail/persistence.d.ts +57 -0
- package/dist/rail/persistence.d.ts.map +1 -0
- package/dist/rail/persistence.js +103 -0
- package/dist/rail/persistence.js.map +1 -0
- package/dist/rail/securityMonitor.d.ts +23 -0
- package/dist/rail/securityMonitor.d.ts.map +1 -0
- package/dist/rail/securityMonitor.js +52 -0
- package/dist/rail/securityMonitor.js.map +1 -0
- package/dist/rail/server.d.ts +186 -0
- package/dist/rail/server.d.ts.map +1 -0
- package/dist/rail/server.js +568 -0
- package/dist/rail/server.js.map +1 -0
- package/dist/rail/userSessionManager.d.ts +29 -0
- package/dist/rail/userSessionManager.d.ts.map +1 -0
- package/dist/rail/userSessionManager.js +87 -0
- package/dist/rail/userSessionManager.js.map +1 -0
- package/dist/rail/wsServer.d.ts +39 -0
- package/dist/rail/wsServer.d.ts.map +1 -0
- package/dist/rail/wsServer.js +544 -0
- package/dist/rail/wsServer.js.map +1 -0
- package/dist/resonance/globalKuramoto.d.ts +67 -0
- package/dist/resonance/globalKuramoto.d.ts.map +1 -0
- package/dist/resonance/globalKuramoto.js +161 -0
- package/dist/resonance/globalKuramoto.js.map +1 -0
- package/dist/resonance/index.d.ts +12 -0
- package/dist/resonance/index.d.ts.map +1 -0
- package/dist/resonance/index.js +9 -0
- package/dist/resonance/index.js.map +1 -0
- package/dist/resonance/kuramoto.d.ts +118 -0
- package/dist/resonance/kuramoto.d.ts.map +1 -0
- package/dist/resonance/kuramoto.js +212 -0
- package/dist/resonance/kuramoto.js.map +1 -0
- package/dist/routing/distributedRouter.d.ts +84 -0
- package/dist/routing/distributedRouter.d.ts.map +1 -0
- package/dist/routing/distributedRouter.js +209 -0
- package/dist/routing/distributedRouter.js.map +1 -0
- package/dist/routing/index.d.ts +8 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +7 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/thermodynamic.d.ts +91 -0
- package/dist/routing/thermodynamic.d.ts.map +1 -0
- package/dist/routing/thermodynamic.js +184 -0
- package/dist/routing/thermodynamic.js.map +1 -0
- package/dist/runtime/agent-zero.d.ts +138 -0
- package/dist/runtime/agent-zero.d.ts.map +1 -0
- package/dist/runtime/agent-zero.js +435 -0
- package/dist/runtime/agent-zero.js.map +1 -0
- package/dist/runtime/index.d.ts +13 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +15 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/security/capabilities.d.ts +178 -0
- package/dist/security/capabilities.d.ts.map +1 -0
- package/dist/security/capabilities.js +270 -0
- package/dist/security/capabilities.js.map +1 -0
- package/dist/security/channelFirewallMiddleware.d.ts +22 -0
- package/dist/security/channelFirewallMiddleware.d.ts.map +1 -0
- package/dist/security/channelFirewallMiddleware.js +52 -0
- package/dist/security/channelFirewallMiddleware.js.map +1 -0
- package/dist/security/index.d.ts +11 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +11 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/injectionFirewall.d.ts +47 -0
- package/dist/security/injectionFirewall.d.ts.map +1 -0
- package/dist/security/injectionFirewall.js +262 -0
- package/dist/security/injectionFirewall.js.map +1 -0
- package/dist/security/outputSanitizer.d.ts +28 -0
- package/dist/security/outputSanitizer.d.ts.map +1 -0
- package/dist/security/outputSanitizer.js +66 -0
- package/dist/security/outputSanitizer.js.map +1 -0
- package/dist/security/sandbox.d.ts +192 -0
- package/dist/security/sandbox.d.ts.map +1 -0
- package/dist/security/sandbox.js +359 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/security/skillVerify.d.ts +128 -0
- package/dist/security/skillVerify.d.ts.map +1 -0
- package/dist/security/skillVerify.js +220 -0
- package/dist/security/skillVerify.js.map +1 -0
- package/dist/security/vault.d.ts +60 -0
- package/dist/security/vault.d.ts.map +1 -0
- package/dist/security/vault.js +522 -0
- package/dist/security/vault.js.map +1 -0
- package/dist/utils/persistentRateLimiter.d.ts +69 -0
- package/dist/utils/persistentRateLimiter.d.ts.map +1 -0
- package/dist/utils/persistentRateLimiter.js +128 -0
- package/dist/utils/persistentRateLimiter.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Router
|
|
3
|
+
*
|
|
4
|
+
* Parses inbound WhatsApp messages from the user and routes to handlers.
|
|
5
|
+
* Only processes messages from the configured user JID.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// ROUTER
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class CommandRouter {
|
|
11
|
+
config;
|
|
12
|
+
replyChannel = 'whatsapp';
|
|
13
|
+
reviewSession = new Map();
|
|
14
|
+
reviewSessionExpiry = 0;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Register as a message handler on WhatsApp and SMS adapters.
|
|
20
|
+
*/
|
|
21
|
+
attach() {
|
|
22
|
+
this.config.whatsApp.onMessage((msg) => {
|
|
23
|
+
void this.handleMessage(msg);
|
|
24
|
+
});
|
|
25
|
+
if (this.config.sms) {
|
|
26
|
+
this.config.sms.onMessage((msg) => {
|
|
27
|
+
void this.handleMessage(msg);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async handleMessage(msg) {
|
|
32
|
+
const payload = msg.payload;
|
|
33
|
+
const remoteJid = payload?.remoteJid;
|
|
34
|
+
const platform = payload?.platform;
|
|
35
|
+
if (!remoteJid)
|
|
36
|
+
return;
|
|
37
|
+
// Security: only process messages from configured user
|
|
38
|
+
if (platform === 'sms') {
|
|
39
|
+
// For SMS, match against userPhone (E.164 format)
|
|
40
|
+
const userPhone = this.config.userPhone;
|
|
41
|
+
if (!userPhone || remoteJid !== userPhone) {
|
|
42
|
+
console.log(`[SMS] Ignoring message from ${remoteJid} (expected ${userPhone ?? 'not configured'})`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.replyChannel = 'sms';
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
if (remoteJid !== this.config.userJid)
|
|
49
|
+
return;
|
|
50
|
+
this.replyChannel = 'whatsapp';
|
|
51
|
+
}
|
|
52
|
+
const text = (payload?.content || '').trim();
|
|
53
|
+
if (!text)
|
|
54
|
+
return;
|
|
55
|
+
console.log(`[CMD] Received (${platform ?? 'whatsapp'}): ${text.slice(0, 50)}`);
|
|
56
|
+
// Log command
|
|
57
|
+
this.config.observer?.log({
|
|
58
|
+
timestamp: new Date().toISOString(),
|
|
59
|
+
event: 'user_command',
|
|
60
|
+
mode: this.config.moltbookDaemon?.getMode() ?? 'supervised',
|
|
61
|
+
outcome: 'cycle',
|
|
62
|
+
detail: text.startsWith('/') ? text.split(' ')[0] : '(freetext)',
|
|
63
|
+
});
|
|
64
|
+
try {
|
|
65
|
+
if (text.startsWith('/')) {
|
|
66
|
+
await this.handleCommand(text);
|
|
67
|
+
}
|
|
68
|
+
else if (this.isApprovalInput(text)) {
|
|
69
|
+
await this.handleApproval(text);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
await this.handleFreeText(text);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
await this.reply(`Error: ${err.message}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async handleCommand(text) {
|
|
80
|
+
const [cmd, ...args] = text.split(/\s+/);
|
|
81
|
+
switch (cmd) {
|
|
82
|
+
case '/status':
|
|
83
|
+
await this.cmdStatus();
|
|
84
|
+
break;
|
|
85
|
+
case '/summary':
|
|
86
|
+
await this.cmdSummary();
|
|
87
|
+
break;
|
|
88
|
+
case '/toggle':
|
|
89
|
+
await this.cmdToggle();
|
|
90
|
+
break;
|
|
91
|
+
case '/review':
|
|
92
|
+
await this.cmdReview();
|
|
93
|
+
break;
|
|
94
|
+
case '/moltbook':
|
|
95
|
+
await this.cmdMoltbook();
|
|
96
|
+
break;
|
|
97
|
+
case '/help':
|
|
98
|
+
await this.cmdHelp();
|
|
99
|
+
break;
|
|
100
|
+
default:
|
|
101
|
+
await this.reply(`Unknown command: ${cmd}\nSend /help for available commands.`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async cmdStatus() {
|
|
105
|
+
const uptimeMs = Date.now() - this.config.startTime;
|
|
106
|
+
const hours = Math.floor(uptimeMs / 3_600_000);
|
|
107
|
+
const minutes = Math.floor((uptimeMs % 3_600_000) / 60_000);
|
|
108
|
+
const lines = [
|
|
109
|
+
'*Agent Zero Status*',
|
|
110
|
+
'',
|
|
111
|
+
`Uptime: ${hours}h ${minutes}m`,
|
|
112
|
+
`WhatsApp: ${this.config.whatsApp.getStatus()}`,
|
|
113
|
+
];
|
|
114
|
+
if (this.config.moltbookDaemon) {
|
|
115
|
+
const s = this.config.moltbookDaemon.getStatus();
|
|
116
|
+
lines.push(`Moltbook: ${s.running ? 'running' : 'stopped'} (${s.mode})`, ` Posted: ${s.totals.posted} | Queued: ${s.totals.queued}`);
|
|
117
|
+
}
|
|
118
|
+
await this.reply(lines.join('\n'));
|
|
119
|
+
}
|
|
120
|
+
async cmdSummary() {
|
|
121
|
+
if (this.config.summaryScheduler) {
|
|
122
|
+
await this.config.summaryScheduler.sendNow();
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
await this.reply('Summary scheduler not configured.');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async cmdToggle() {
|
|
129
|
+
if (!this.config.moltbookDaemon) {
|
|
130
|
+
await this.reply('Moltbook daemon not running.');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const newMode = await this.config.moltbookDaemon.toggleMode();
|
|
134
|
+
await this.reply(`Moltbook mode: *${newMode}*`);
|
|
135
|
+
}
|
|
136
|
+
async cmdReview() {
|
|
137
|
+
if (!this.config.moltbookDaemon) {
|
|
138
|
+
await this.reply('Moltbook daemon not running.');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const gate = this.config.moltbookDaemon.getGate();
|
|
142
|
+
const pending = await gate.listPending();
|
|
143
|
+
if (pending.length === 0) {
|
|
144
|
+
await this.reply('No pending items in queue.');
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Build numbered review session
|
|
148
|
+
this.reviewSession.clear();
|
|
149
|
+
pending.forEach((item, i) => this.reviewSession.set(i + 1, item));
|
|
150
|
+
this.reviewSessionExpiry = Date.now() + 30 * 60 * 1000; // 30min
|
|
151
|
+
const lines = [`*${pending.length} pending:*`, ''];
|
|
152
|
+
for (const [num, item] of this.reviewSession) {
|
|
153
|
+
const pct = `${(item.response.confidence * 100).toFixed(0)}%`;
|
|
154
|
+
const label = item.label ?? item.response.action;
|
|
155
|
+
const preview = (item.response.content ?? '').slice(0, 80);
|
|
156
|
+
lines.push(`*${num}.* ${label} (${pct})`);
|
|
157
|
+
lines.push(` ${preview}${preview.length >= 80 ? '...' : ''}`);
|
|
158
|
+
lines.push('');
|
|
159
|
+
}
|
|
160
|
+
lines.push('Reply: 1 3 5 / reject 2 / approve all');
|
|
161
|
+
await this.reply(lines.join('\n'));
|
|
162
|
+
}
|
|
163
|
+
isApprovalInput(text) {
|
|
164
|
+
if (this.reviewSession.size === 0 || Date.now() > this.reviewSessionExpiry)
|
|
165
|
+
return false;
|
|
166
|
+
const lower = text.toLowerCase().trim();
|
|
167
|
+
if (lower === 'approve all' || lower === 'all')
|
|
168
|
+
return true;
|
|
169
|
+
if (/^reject\s+[\d\s,]+$/.test(lower))
|
|
170
|
+
return true;
|
|
171
|
+
// Pure number patterns: "1 3 5", "1,3,5", "1, 3, 5", single "3"
|
|
172
|
+
if (/^[\d\s,]+$/.test(lower) && /\d/.test(lower))
|
|
173
|
+
return true;
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
async handleApproval(text) {
|
|
177
|
+
if (!this.config.moltbookDaemon)
|
|
178
|
+
return;
|
|
179
|
+
const gate = this.config.moltbookDaemon.getGate();
|
|
180
|
+
const lower = text.toLowerCase().trim();
|
|
181
|
+
const results = [];
|
|
182
|
+
if (lower === 'approve all' || lower === 'all') {
|
|
183
|
+
// Approve everything in session
|
|
184
|
+
for (const [num, item] of this.reviewSession) {
|
|
185
|
+
try {
|
|
186
|
+
const response = await gate.approve(item.id);
|
|
187
|
+
if (response) {
|
|
188
|
+
await this.config.moltbookDaemon.executeApproved(response);
|
|
189
|
+
results.push(`#${num}: posted (${item.response.action})`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
results.push(`#${num}: error — ${err.message}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
this.reviewSession.clear();
|
|
197
|
+
}
|
|
198
|
+
else if (lower.startsWith('reject')) {
|
|
199
|
+
// Reject specific numbers
|
|
200
|
+
const nums = lower.replace('reject', '').match(/\d+/g)?.map(Number) ?? [];
|
|
201
|
+
for (const num of nums) {
|
|
202
|
+
const item = this.reviewSession.get(num);
|
|
203
|
+
if (!item) {
|
|
204
|
+
results.push(`#${num}: not found`);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
await gate.reject(item.id);
|
|
208
|
+
this.reviewSession.delete(num);
|
|
209
|
+
results.push(`#${num}: rejected`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
// Approve specific numbers
|
|
214
|
+
const nums = text.match(/\d+/g)?.map(Number) ?? [];
|
|
215
|
+
for (const num of nums) {
|
|
216
|
+
const item = this.reviewSession.get(num);
|
|
217
|
+
if (!item) {
|
|
218
|
+
results.push(`#${num}: not found`);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
const response = await gate.approve(item.id);
|
|
223
|
+
if (response) {
|
|
224
|
+
await this.config.moltbookDaemon.executeApproved(response);
|
|
225
|
+
results.push(`#${num}: posted (${item.response.action})`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
results.push(`#${num}: error — ${err.message}`);
|
|
230
|
+
}
|
|
231
|
+
this.reviewSession.delete(num);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Cleanup approved/rejected files
|
|
235
|
+
await gate.cleanup();
|
|
236
|
+
const remaining = this.reviewSession.size;
|
|
237
|
+
if (remaining > 0) {
|
|
238
|
+
results.push(`${remaining} item${remaining > 1 ? 's' : ''} remaining.`);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
results.push('Queue clear.');
|
|
242
|
+
}
|
|
243
|
+
await this.reply(results.join('\n'));
|
|
244
|
+
}
|
|
245
|
+
async cmdMoltbook() {
|
|
246
|
+
if (!this.config.moltbookDaemon) {
|
|
247
|
+
await this.reply('Moltbook daemon not running.');
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const s = this.config.moltbookDaemon.getStatus();
|
|
251
|
+
const lines = [
|
|
252
|
+
'*Moltbook Engagement Stats*',
|
|
253
|
+
'',
|
|
254
|
+
`Mode: ${s.mode}`,
|
|
255
|
+
`Engaged threads: ${s.engagedThreads}`,
|
|
256
|
+
`Polled: ${s.totals.polled}`,
|
|
257
|
+
`Composed: ${s.totals.composed}`,
|
|
258
|
+
`Posted: ${s.totals.posted}`,
|
|
259
|
+
`Queued: ${s.totals.queued}`,
|
|
260
|
+
`Bait detected: ${s.totals.bait}`,
|
|
261
|
+
`Errors: ${s.totals.errors}`,
|
|
262
|
+
];
|
|
263
|
+
await this.reply(lines.join('\n'));
|
|
264
|
+
}
|
|
265
|
+
async cmdHelp() {
|
|
266
|
+
await this.reply([
|
|
267
|
+
'*Agent Zero Commands*',
|
|
268
|
+
'',
|
|
269
|
+
'/status — Runtime status',
|
|
270
|
+
'/summary — On-demand summary',
|
|
271
|
+
'/toggle — Switch Moltbook supervised/autonomous',
|
|
272
|
+
'/review — Review queue (1 3 5 / reject 2 / approve all)',
|
|
273
|
+
'/moltbook — Moltbook engagement stats',
|
|
274
|
+
'/help — This message',
|
|
275
|
+
'',
|
|
276
|
+
'Any other text → Agent Zero LLM response',
|
|
277
|
+
].join('\n'));
|
|
278
|
+
}
|
|
279
|
+
async handleFreeText(text) {
|
|
280
|
+
if (!this.config.llmApiKey) {
|
|
281
|
+
await this.reply('LLM not configured. Use /help for commands.');
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
286
|
+
method: 'POST',
|
|
287
|
+
headers: {
|
|
288
|
+
'Authorization': `Bearer ${this.config.llmApiKey}`,
|
|
289
|
+
'Content-Type': 'application/json',
|
|
290
|
+
'HTTP-Referer': 'https://terminals.tech',
|
|
291
|
+
'X-Title': 'Agent Zero Agency',
|
|
292
|
+
},
|
|
293
|
+
body: JSON.stringify({
|
|
294
|
+
model: this.config.llmModel ?? 'anthropic/claude-sonnet-4-20250514',
|
|
295
|
+
messages: [
|
|
296
|
+
{
|
|
297
|
+
role: 'system',
|
|
298
|
+
content: 'You are Agent Zero, a concise technical agent. Reply in under 500 characters. No filler.',
|
|
299
|
+
},
|
|
300
|
+
{ role: 'user', content: text },
|
|
301
|
+
],
|
|
302
|
+
max_tokens: 300,
|
|
303
|
+
temperature: 0.7,
|
|
304
|
+
}),
|
|
305
|
+
});
|
|
306
|
+
if (!response.ok) {
|
|
307
|
+
await this.reply('LLM request failed.');
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const json = await response.json();
|
|
311
|
+
const content = json.choices?.[0]?.message?.content;
|
|
312
|
+
if (content) {
|
|
313
|
+
await this.reply(content);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
await this.reply('No response generated.');
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
await this.reply(`LLM error: ${err.message}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
async reply(text) {
|
|
324
|
+
try {
|
|
325
|
+
if (this.replyChannel === 'sms' && this.config.sms && this.config.userPhone) {
|
|
326
|
+
console.log(`[CMD] Replying via SMS to ${this.config.userPhone}`);
|
|
327
|
+
await this.config.sms.send(text, this.config.userPhone);
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
console.log(`[CMD] Replying via WhatsApp to ${this.config.userJid}`);
|
|
331
|
+
await this.config.whatsApp.send(text, this.config.userJid);
|
|
332
|
+
}
|
|
333
|
+
console.log('[CMD] Reply sent');
|
|
334
|
+
}
|
|
335
|
+
catch (err) {
|
|
336
|
+
console.error(`[CMD] Reply failed: ${err.message}`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
export function createCommandRouter(config) {
|
|
341
|
+
return new CommandRouter(config);
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=commandRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandRouter.js","sourceRoot":"","sources":["../../src/agency/commandRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Agency Runtime
|
|
3
|
+
*
|
|
4
|
+
* Single entry point for the 24/7 Agent Zero agency.
|
|
5
|
+
* Manages WhatsApp bridge, Moltbook daemon, summary scheduler, and command router.
|
|
6
|
+
*/
|
|
7
|
+
import { Vault } from '../security/vault.js';
|
|
8
|
+
import { type SummarySchedule } from './summaryScheduler.js';
|
|
9
|
+
export interface AgencyConfig {
|
|
10
|
+
vault: Vault;
|
|
11
|
+
summarySchedule: SummarySchedule;
|
|
12
|
+
enableMoltbook: boolean;
|
|
13
|
+
enableWhatsApp: boolean;
|
|
14
|
+
enableSms: boolean;
|
|
15
|
+
railEndpoint?: string;
|
|
16
|
+
activePostIds?: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare class AgencyRuntime {
|
|
19
|
+
private config;
|
|
20
|
+
private whatsApp?;
|
|
21
|
+
private sms?;
|
|
22
|
+
private moltbookDaemon?;
|
|
23
|
+
private summaryScheduler?;
|
|
24
|
+
private commandRouter?;
|
|
25
|
+
private observer;
|
|
26
|
+
private operationalVault?;
|
|
27
|
+
private startTime;
|
|
28
|
+
private running;
|
|
29
|
+
constructor(config: AgencyConfig);
|
|
30
|
+
start(): Promise<void>;
|
|
31
|
+
stop(): Promise<void>;
|
|
32
|
+
getStatus(): {
|
|
33
|
+
running: boolean;
|
|
34
|
+
uptime: number;
|
|
35
|
+
whatsApp: string;
|
|
36
|
+
sms: string;
|
|
37
|
+
moltbook: {
|
|
38
|
+
running: boolean;
|
|
39
|
+
mode: import("../index.js").ApprovalMode;
|
|
40
|
+
engagedThreads: number;
|
|
41
|
+
attention: {
|
|
42
|
+
scored: number;
|
|
43
|
+
engaged: number;
|
|
44
|
+
skipped: number;
|
|
45
|
+
baitDetected: number;
|
|
46
|
+
};
|
|
47
|
+
composer: {
|
|
48
|
+
composed: number;
|
|
49
|
+
skipped: number;
|
|
50
|
+
failed: number;
|
|
51
|
+
};
|
|
52
|
+
gate: {
|
|
53
|
+
mode: import("../index.js").ApprovalMode;
|
|
54
|
+
approved: number;
|
|
55
|
+
queued: number;
|
|
56
|
+
rejected: number;
|
|
57
|
+
};
|
|
58
|
+
totals: import("../moltbook/observer.js").CycleStats & {
|
|
59
|
+
startedAt?: string;
|
|
60
|
+
};
|
|
61
|
+
} | null;
|
|
62
|
+
summarySchedule: SummarySchedule;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export declare function startAgency(passphrase: string): Promise<AgencyRuntime>;
|
|
66
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/agency/runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,KAAK,EAAe,MAAM,sBAAsB,CAAC;AAK1D,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AASvG,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,EAAE,eAAe,CAAC;IACjC,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAMD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAkB;IACnC,OAAO,CAAC,GAAG,CAAC,CAAa;IACzB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,YAAY;IAK1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8JtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAUV;AAMD,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA2B5E"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Agency Runtime
|
|
3
|
+
*
|
|
4
|
+
* Single entry point for the 24/7 Agent Zero agency.
|
|
5
|
+
* Manages WhatsApp bridge, Moltbook daemon, summary scheduler, and command router.
|
|
6
|
+
*/
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { createVault } from '../security/vault.js';
|
|
9
|
+
import { createWhatsAppAdapter } from '../channels/whatsapp.js';
|
|
10
|
+
import { createSmsAdapter } from '../channels/sms.js';
|
|
11
|
+
import { createMoltbookDaemon } from '../moltbook/daemon.js';
|
|
12
|
+
import { createDaemonObserver } from '../moltbook/observer.js';
|
|
13
|
+
import { createSummaryScheduler } from './summaryScheduler.js';
|
|
14
|
+
import { createCommandRouter } from './commandRouter.js';
|
|
15
|
+
import { OperationalVault } from '../identity/operationalVault.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// RUNTIME
|
|
18
|
+
// ============================================================================
|
|
19
|
+
export class AgencyRuntime {
|
|
20
|
+
config;
|
|
21
|
+
whatsApp;
|
|
22
|
+
sms;
|
|
23
|
+
moltbookDaemon;
|
|
24
|
+
summaryScheduler;
|
|
25
|
+
commandRouter;
|
|
26
|
+
observer;
|
|
27
|
+
operationalVault;
|
|
28
|
+
startTime = 0;
|
|
29
|
+
running = false;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
this.config = config;
|
|
32
|
+
this.observer = createDaemonObserver();
|
|
33
|
+
}
|
|
34
|
+
async start() {
|
|
35
|
+
if (this.running)
|
|
36
|
+
return;
|
|
37
|
+
this.startTime = Date.now();
|
|
38
|
+
this.running = true;
|
|
39
|
+
const vault = this.config.vault;
|
|
40
|
+
console.log(chalk.cyan(' Starting Agent Zero Agency Runtime\n'));
|
|
41
|
+
// Start observer
|
|
42
|
+
await this.observer.start();
|
|
43
|
+
// Load credentials from vault, with env var fallback (vault fingerprint drift workaround)
|
|
44
|
+
const openrouterKey = await vault.retrieve('openrouter:api_key') ?? process.env['OPENROUTER_API_KEY'] ?? null;
|
|
45
|
+
const moltbookToken = await vault.retrieve('moltbook:api_token') ?? process.env['MOLTBOOK_API_TOKEN'] ?? null;
|
|
46
|
+
const twilioSid = await vault.retrieve('twilio:account_sid') ?? process.env['TWILIO_ACCOUNT_SID'] ?? null;
|
|
47
|
+
const twilioToken = await vault.retrieve('twilio:auth_token') ?? process.env['TWILIO_AUTH_TOKEN'] ?? null;
|
|
48
|
+
const twilioPhone = await vault.retrieve('twilio:phone_number') ?? process.env['TWILIO_PHONE_NUMBER'] ?? null;
|
|
49
|
+
const userJid = await vault.retrieve('user:whatsapp_jid') ?? process.env['WHATSAPP_USER_JID'] ?? null;
|
|
50
|
+
const railEndpoint = this.config.railEndpoint ?? await vault.retrieve('rail:endpoint') ?? process.env['RAIL_ENDPOINT'] ?? undefined;
|
|
51
|
+
// Start operational vault for metrics (reuse agency vault for passphrase consistency)
|
|
52
|
+
try {
|
|
53
|
+
this.operationalVault = await OperationalVault.fromVault(vault);
|
|
54
|
+
if (railEndpoint) {
|
|
55
|
+
await this.operationalVault.initSelfIdentity(railEndpoint);
|
|
56
|
+
}
|
|
57
|
+
console.log(chalk.green(' ✓ Operational vault'));
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
console.log(chalk.yellow(' ○ Operational vault unavailable'));
|
|
61
|
+
}
|
|
62
|
+
// Start WhatsApp
|
|
63
|
+
if (this.config.enableWhatsApp && twilioSid && twilioToken && userJid) {
|
|
64
|
+
try {
|
|
65
|
+
this.whatsApp = createWhatsAppAdapter({
|
|
66
|
+
identityId: 'agency-primary',
|
|
67
|
+
twilioAccountSid: twilioSid,
|
|
68
|
+
twilioAuthToken: twilioToken,
|
|
69
|
+
phoneNumber: twilioPhone ?? undefined,
|
|
70
|
+
}, vault);
|
|
71
|
+
// Listen for connection events to display clean status
|
|
72
|
+
this.whatsApp.on('auth:failed', () => {
|
|
73
|
+
console.log(chalk.red(' ✗ WhatsApp: authentication failed after max retries'));
|
|
74
|
+
});
|
|
75
|
+
await this.whatsApp.connect();
|
|
76
|
+
console.log(chalk.green(' ✓ WhatsApp connected'));
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
const msg = err.message;
|
|
80
|
+
if (msg === 'Connection timeout') {
|
|
81
|
+
// Timeout likely means QR was shown but not scanned — adapter stays alive for retry
|
|
82
|
+
console.log(chalk.yellow(' ○ WhatsApp: waiting for QR scan (will retry in background)'));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.log(chalk.red(` ✗ WhatsApp: ${msg}`));
|
|
86
|
+
this.whatsApp = undefined;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (this.config.enableWhatsApp) {
|
|
91
|
+
console.log(chalk.yellow(' ○ WhatsApp: missing credentials (run `agent-zero setup`)'));
|
|
92
|
+
}
|
|
93
|
+
// Start SMS adapter
|
|
94
|
+
if (this.config.enableSms && twilioSid && twilioToken && twilioPhone) {
|
|
95
|
+
try {
|
|
96
|
+
const userPhone = await vault.retrieve('user:phone_number') ?? undefined;
|
|
97
|
+
this.sms = createSmsAdapter({
|
|
98
|
+
twilioAccountSid: twilioSid,
|
|
99
|
+
twilioAuthToken: twilioToken,
|
|
100
|
+
phoneNumber: twilioPhone,
|
|
101
|
+
webhookUrl: process.env['SMS_WEBHOOK_URL'] ?? 'https://agent-zero-agency.fly.dev/sms/inbound',
|
|
102
|
+
});
|
|
103
|
+
await this.sms.connect();
|
|
104
|
+
console.log(chalk.green(` ✓ SMS webhook (port ${process.env['SMS_WEBHOOK_PORT'] || 8080})`));
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.log(chalk.red(` ✗ SMS: ${err.message}`));
|
|
108
|
+
this.sms = undefined;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (this.config.enableSms) {
|
|
112
|
+
console.log(chalk.yellow(' ○ SMS: missing Twilio credentials'));
|
|
113
|
+
}
|
|
114
|
+
// Start Moltbook daemon
|
|
115
|
+
if (this.config.enableMoltbook && openrouterKey && moltbookToken) {
|
|
116
|
+
try {
|
|
117
|
+
this.moltbookDaemon = createMoltbookDaemon({
|
|
118
|
+
pollIntervalMs: 1_800_000,
|
|
119
|
+
maxEngagementsPerCycle: 3,
|
|
120
|
+
engagementIntervalMs: 7_200_000,
|
|
121
|
+
activePostIds: this.config.activePostIds ?? [],
|
|
122
|
+
enableOriginalPosts: true,
|
|
123
|
+
apiKey: openrouterKey,
|
|
124
|
+
moltbookToken,
|
|
125
|
+
vault,
|
|
126
|
+
identityId: 'agency-moltbook',
|
|
127
|
+
railEndpoint,
|
|
128
|
+
});
|
|
129
|
+
await this.moltbookDaemon.start();
|
|
130
|
+
console.log(chalk.green(` ✓ Moltbook daemon (${this.moltbookDaemon.getMode()})`));
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
console.log(chalk.red(` ✗ Moltbook: ${err.message}`));
|
|
134
|
+
this.moltbookDaemon = undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else if (this.config.enableMoltbook) {
|
|
138
|
+
console.log(chalk.yellow(' ○ Moltbook: missing credentials'));
|
|
139
|
+
}
|
|
140
|
+
// Start summary scheduler
|
|
141
|
+
if (this.whatsApp && userJid) {
|
|
142
|
+
const sources = {
|
|
143
|
+
moltbookDaemon: this.moltbookDaemon,
|
|
144
|
+
operationalVault: this.operationalVault,
|
|
145
|
+
startTime: this.startTime,
|
|
146
|
+
};
|
|
147
|
+
this.summaryScheduler = createSummaryScheduler({
|
|
148
|
+
schedule: this.config.summarySchedule,
|
|
149
|
+
userJid,
|
|
150
|
+
whatsApp: this.whatsApp,
|
|
151
|
+
sources,
|
|
152
|
+
});
|
|
153
|
+
this.summaryScheduler.start();
|
|
154
|
+
console.log(chalk.green(` ✓ Summary scheduler (${this.config.summarySchedule})`));
|
|
155
|
+
}
|
|
156
|
+
// Start command router
|
|
157
|
+
// Derive E.164 phone from WhatsApp JID (15551234567@s.whatsapp.net -> +15551234567)
|
|
158
|
+
const userPhone = userJid ? '+' + userJid.split('@')[0] : undefined;
|
|
159
|
+
if (this.whatsApp && userJid) {
|
|
160
|
+
this.commandRouter = createCommandRouter({
|
|
161
|
+
userJid,
|
|
162
|
+
whatsApp: this.whatsApp,
|
|
163
|
+
sms: this.sms,
|
|
164
|
+
userPhone,
|
|
165
|
+
moltbookDaemon: this.moltbookDaemon,
|
|
166
|
+
summaryScheduler: this.summaryScheduler,
|
|
167
|
+
llmApiKey: openrouterKey ?? undefined,
|
|
168
|
+
startTime: this.startTime,
|
|
169
|
+
observer: this.observer,
|
|
170
|
+
});
|
|
171
|
+
this.commandRouter.attach();
|
|
172
|
+
console.log(chalk.green(' ✓ Command router'));
|
|
173
|
+
}
|
|
174
|
+
console.log(chalk.cyan('\n Agency runtime active. Press Ctrl+C to stop.\n'));
|
|
175
|
+
// Graceful shutdown
|
|
176
|
+
const shutdown = async () => {
|
|
177
|
+
console.log(chalk.yellow('\n Shutting down...'));
|
|
178
|
+
await this.stop();
|
|
179
|
+
process.exit(0);
|
|
180
|
+
};
|
|
181
|
+
process.on('SIGINT', () => void shutdown());
|
|
182
|
+
process.on('SIGTERM', () => void shutdown());
|
|
183
|
+
}
|
|
184
|
+
async stop() {
|
|
185
|
+
if (!this.running)
|
|
186
|
+
return;
|
|
187
|
+
this.running = false;
|
|
188
|
+
if (this.summaryScheduler) {
|
|
189
|
+
this.summaryScheduler.stop();
|
|
190
|
+
}
|
|
191
|
+
if (this.moltbookDaemon) {
|
|
192
|
+
await this.moltbookDaemon.stop();
|
|
193
|
+
}
|
|
194
|
+
if (this.sms) {
|
|
195
|
+
await this.sms.disconnect();
|
|
196
|
+
}
|
|
197
|
+
if (this.whatsApp) {
|
|
198
|
+
await this.whatsApp.disconnect();
|
|
199
|
+
}
|
|
200
|
+
if (this.operationalVault) {
|
|
201
|
+
await this.operationalVault.close();
|
|
202
|
+
}
|
|
203
|
+
await this.observer.stop();
|
|
204
|
+
console.log(chalk.green(' Agency runtime stopped.'));
|
|
205
|
+
}
|
|
206
|
+
getStatus() {
|
|
207
|
+
return {
|
|
208
|
+
running: this.running,
|
|
209
|
+
uptime: this.running ? Date.now() - this.startTime : 0,
|
|
210
|
+
whatsApp: this.whatsApp?.getStatus() ?? 'disabled',
|
|
211
|
+
sms: this.sms?.getStatus() ?? 'disabled',
|
|
212
|
+
moltbook: this.moltbookDaemon?.getStatus() ?? null,
|
|
213
|
+
summarySchedule: this.config.summarySchedule,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// ============================================================================
|
|
218
|
+
// FACTORY
|
|
219
|
+
// ============================================================================
|
|
220
|
+
export async function startAgency(passphrase) {
|
|
221
|
+
const vault = await createVault(passphrase);
|
|
222
|
+
const scheduleRaw = await vault.retrieve('agency:summary_schedule');
|
|
223
|
+
const schedule = (['daily', 'twice-daily', 'on-demand'].includes(scheduleRaw ?? '') ? scheduleRaw : 'daily');
|
|
224
|
+
const railEndpoint = await vault.retrieve('rail:endpoint') ?? undefined;
|
|
225
|
+
// Load active post IDs for engagement scanning (vault with env var fallback)
|
|
226
|
+
let activePostIds = [];
|
|
227
|
+
const activePostIdsRaw = await vault.retrieve('moltbook:active_posts') ?? process.env['MOLTBOOK_ACTIVE_POSTS'] ?? null;
|
|
228
|
+
if (activePostIdsRaw) {
|
|
229
|
+
try {
|
|
230
|
+
activePostIds = JSON.parse(activePostIdsRaw);
|
|
231
|
+
}
|
|
232
|
+
catch { /* ignore */ }
|
|
233
|
+
}
|
|
234
|
+
console.log(chalk.gray(` Active post IDs: ${activePostIds.length} loaded${activePostIds.length ? '' : ' (vault key missing?)'}`));
|
|
235
|
+
const runtime = new AgencyRuntime({
|
|
236
|
+
vault,
|
|
237
|
+
summarySchedule: schedule,
|
|
238
|
+
enableMoltbook: true,
|
|
239
|
+
enableWhatsApp: true,
|
|
240
|
+
enableSms: true,
|
|
241
|
+
railEndpoint,
|
|
242
|
+
activePostIds,
|
|
243
|
+
});
|
|
244
|
+
await runtime.start();
|
|
245
|
+
return runtime;
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=runtime.js.map
|