@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.
Files changed (263) hide show
  1. package/README.md +209 -0
  2. package/bin/agent-zero.js +332 -0
  3. package/dist/agency/commandRouter.d.ts +48 -0
  4. package/dist/agency/commandRouter.d.ts.map +1 -0
  5. package/dist/agency/commandRouter.js +343 -0
  6. package/dist/agency/commandRouter.js.map +1 -0
  7. package/dist/agency/runtime.d.ts +66 -0
  8. package/dist/agency/runtime.d.ts.map +1 -0
  9. package/dist/agency/runtime.js +247 -0
  10. package/dist/agency/runtime.js.map +1 -0
  11. package/dist/agency/summaryGenerator.d.ts +39 -0
  12. package/dist/agency/summaryGenerator.d.ts.map +1 -0
  13. package/dist/agency/summaryGenerator.js +110 -0
  14. package/dist/agency/summaryGenerator.js.map +1 -0
  15. package/dist/agency/summaryScheduler.d.ts +33 -0
  16. package/dist/agency/summaryScheduler.d.ts.map +1 -0
  17. package/dist/agency/summaryScheduler.js +68 -0
  18. package/dist/agency/summaryScheduler.js.map +1 -0
  19. package/dist/browser/agent-runtime/RuntimePanel.d.ts +20 -0
  20. package/dist/browser/agent-runtime/RuntimePanel.d.ts.map +1 -0
  21. package/dist/browser/agent-runtime/RuntimePanel.js +203 -0
  22. package/dist/browser/agent-runtime/RuntimePanel.js.map +1 -0
  23. package/dist/browser/agent-runtime/config.d.ts +28 -0
  24. package/dist/browser/agent-runtime/config.d.ts.map +1 -0
  25. package/dist/browser/agent-runtime/config.js +50 -0
  26. package/dist/browser/agent-runtime/config.js.map +1 -0
  27. package/dist/browser/agent-runtime/launcher.d.ts +71 -0
  28. package/dist/browser/agent-runtime/launcher.d.ts.map +1 -0
  29. package/dist/browser/agent-runtime/launcher.js +167 -0
  30. package/dist/browser/agent-runtime/launcher.js.map +1 -0
  31. package/dist/browser/rail-auth-bridge.d.ts +85 -0
  32. package/dist/browser/rail-auth-bridge.d.ts.map +1 -0
  33. package/dist/browser/rail-auth-bridge.js +209 -0
  34. package/dist/browser/rail-auth-bridge.js.map +1 -0
  35. package/dist/channels/index.d.ts +13 -0
  36. package/dist/channels/index.d.ts.map +1 -0
  37. package/dist/channels/index.js +12 -0
  38. package/dist/channels/index.js.map +1 -0
  39. package/dist/channels/moltbook.d.ts +114 -0
  40. package/dist/channels/moltbook.d.ts.map +1 -0
  41. package/dist/channels/moltbook.js +348 -0
  42. package/dist/channels/moltbook.js.map +1 -0
  43. package/dist/channels/sms.d.ts +33 -0
  44. package/dist/channels/sms.d.ts.map +1 -0
  45. package/dist/channels/sms.js +160 -0
  46. package/dist/channels/sms.js.map +1 -0
  47. package/dist/channels/telegram.d.ts +47 -0
  48. package/dist/channels/telegram.d.ts.map +1 -0
  49. package/dist/channels/telegram.js +276 -0
  50. package/dist/channels/telegram.js.map +1 -0
  51. package/dist/channels/twitter.d.ts +93 -0
  52. package/dist/channels/twitter.d.ts.map +1 -0
  53. package/dist/channels/twitter.js +411 -0
  54. package/dist/channels/twitter.js.map +1 -0
  55. package/dist/channels/whatsapp.d.ts +77 -0
  56. package/dist/channels/whatsapp.d.ts.map +1 -0
  57. package/dist/channels/whatsapp.js +514 -0
  58. package/dist/channels/whatsapp.js.map +1 -0
  59. package/dist/checkout/index.d.ts +92 -0
  60. package/dist/checkout/index.d.ts.map +1 -0
  61. package/dist/checkout/index.js +125 -0
  62. package/dist/checkout/index.js.map +1 -0
  63. package/dist/cli/moltbook.d.ts +11 -0
  64. package/dist/cli/moltbook.d.ts.map +1 -0
  65. package/dist/cli/moltbook.js +259 -0
  66. package/dist/cli/moltbook.js.map +1 -0
  67. package/dist/cli/setup.d.ts +10 -0
  68. package/dist/cli/setup.d.ts.map +1 -0
  69. package/dist/cli/setup.js +232 -0
  70. package/dist/cli/setup.js.map +1 -0
  71. package/dist/coherence/absorption.d.ts +141 -0
  72. package/dist/coherence/absorption.d.ts.map +1 -0
  73. package/dist/coherence/absorption.js +343 -0
  74. package/dist/coherence/absorption.js.map +1 -0
  75. package/dist/coherence/crossPlatform.d.ts +55 -0
  76. package/dist/coherence/crossPlatform.d.ts.map +1 -0
  77. package/dist/coherence/crossPlatform.js +219 -0
  78. package/dist/coherence/crossPlatform.js.map +1 -0
  79. package/dist/coherence/identityResolver.d.ts +27 -0
  80. package/dist/coherence/identityResolver.d.ts.map +1 -0
  81. package/dist/coherence/identityResolver.js +102 -0
  82. package/dist/coherence/identityResolver.js.map +1 -0
  83. package/dist/identity/burner.d.ts +100 -0
  84. package/dist/identity/burner.d.ts.map +1 -0
  85. package/dist/identity/burner.js +256 -0
  86. package/dist/identity/burner.js.map +1 -0
  87. package/dist/identity/burnerScheduler.d.ts +18 -0
  88. package/dist/identity/burnerScheduler.d.ts.map +1 -0
  89. package/dist/identity/burnerScheduler.js +82 -0
  90. package/dist/identity/burnerScheduler.js.map +1 -0
  91. package/dist/identity/moltbookBurnerAdapter.d.ts +14 -0
  92. package/dist/identity/moltbookBurnerAdapter.d.ts.map +1 -0
  93. package/dist/identity/moltbookBurnerAdapter.js +82 -0
  94. package/dist/identity/moltbookBurnerAdapter.js.map +1 -0
  95. package/dist/identity/operationalVault.d.ts +108 -0
  96. package/dist/identity/operationalVault.d.ts.map +1 -0
  97. package/dist/identity/operationalVault.js +259 -0
  98. package/dist/identity/operationalVault.js.map +1 -0
  99. package/dist/index.d.ts +43 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +57 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/moltbook/apiErrorHandler.d.ts +48 -0
  104. package/dist/moltbook/apiErrorHandler.d.ts.map +1 -0
  105. package/dist/moltbook/apiErrorHandler.js +125 -0
  106. package/dist/moltbook/apiErrorHandler.js.map +1 -0
  107. package/dist/moltbook/approvalGate.d.ts +81 -0
  108. package/dist/moltbook/approvalGate.d.ts.map +1 -0
  109. package/dist/moltbook/approvalGate.js +211 -0
  110. package/dist/moltbook/approvalGate.js.map +1 -0
  111. package/dist/moltbook/attentionField.d.ts +55 -0
  112. package/dist/moltbook/attentionField.d.ts.map +1 -0
  113. package/dist/moltbook/attentionField.js +163 -0
  114. package/dist/moltbook/attentionField.js.map +1 -0
  115. package/dist/moltbook/contentEnhancer.d.ts +28 -0
  116. package/dist/moltbook/contentEnhancer.d.ts.map +1 -0
  117. package/dist/moltbook/contentEnhancer.js +129 -0
  118. package/dist/moltbook/contentEnhancer.js.map +1 -0
  119. package/dist/moltbook/daemon.d.ts +111 -0
  120. package/dist/moltbook/daemon.d.ts.map +1 -0
  121. package/dist/moltbook/daemon.js +497 -0
  122. package/dist/moltbook/daemon.js.map +1 -0
  123. package/dist/moltbook/observer.d.ts +44 -0
  124. package/dist/moltbook/observer.d.ts.map +1 -0
  125. package/dist/moltbook/observer.js +71 -0
  126. package/dist/moltbook/observer.js.map +1 -0
  127. package/dist/moltbook/responseComposer.d.ts +54 -0
  128. package/dist/moltbook/responseComposer.d.ts.map +1 -0
  129. package/dist/moltbook/responseComposer.js +233 -0
  130. package/dist/moltbook/responseComposer.js.map +1 -0
  131. package/dist/openclaw/gateway.d.ts +45 -0
  132. package/dist/openclaw/gateway.d.ts.map +1 -0
  133. package/dist/openclaw/gateway.js +139 -0
  134. package/dist/openclaw/gateway.js.map +1 -0
  135. package/dist/openclaw/skill.d.ts +185 -0
  136. package/dist/openclaw/skill.d.ts.map +1 -0
  137. package/dist/openclaw/skill.js +297 -0
  138. package/dist/openclaw/skill.js.map +1 -0
  139. package/dist/primitives/index.d.ts +23 -0
  140. package/dist/primitives/index.d.ts.map +1 -0
  141. package/dist/primitives/index.js +27 -0
  142. package/dist/primitives/index.js.map +1 -0
  143. package/dist/primitives/types.d.ts +673 -0
  144. package/dist/primitives/types.d.ts.map +1 -0
  145. package/dist/primitives/types.js +205 -0
  146. package/dist/primitives/types.js.map +1 -0
  147. package/dist/rail/absorptionBridge.d.ts +47 -0
  148. package/dist/rail/absorptionBridge.d.ts.map +1 -0
  149. package/dist/rail/absorptionBridge.js +78 -0
  150. package/dist/rail/absorptionBridge.js.map +1 -0
  151. package/dist/rail/authProtocol.d.ts +32 -0
  152. package/dist/rail/authProtocol.d.ts.map +1 -0
  153. package/dist/rail/authProtocol.js +83 -0
  154. package/dist/rail/authProtocol.js.map +1 -0
  155. package/dist/rail/clientRateLimiter.d.ts +17 -0
  156. package/dist/rail/clientRateLimiter.d.ts.map +1 -0
  157. package/dist/rail/clientRateLimiter.js +64 -0
  158. package/dist/rail/clientRateLimiter.js.map +1 -0
  159. package/dist/rail/index.d.ts +8 -0
  160. package/dist/rail/index.d.ts.map +1 -0
  161. package/dist/rail/index.js +38 -0
  162. package/dist/rail/index.js.map +1 -0
  163. package/dist/rail/jwtVerifier.d.ts +11 -0
  164. package/dist/rail/jwtVerifier.d.ts.map +1 -0
  165. package/dist/rail/jwtVerifier.js +55 -0
  166. package/dist/rail/jwtVerifier.js.map +1 -0
  167. package/dist/rail/logger.d.ts +13 -0
  168. package/dist/rail/logger.d.ts.map +1 -0
  169. package/dist/rail/logger.js +29 -0
  170. package/dist/rail/logger.js.map +1 -0
  171. package/dist/rail/metadataBroadcaster.d.ts +53 -0
  172. package/dist/rail/metadataBroadcaster.d.ts.map +1 -0
  173. package/dist/rail/metadataBroadcaster.js +126 -0
  174. package/dist/rail/metadataBroadcaster.js.map +1 -0
  175. package/dist/rail/persistence.d.ts +57 -0
  176. package/dist/rail/persistence.d.ts.map +1 -0
  177. package/dist/rail/persistence.js +103 -0
  178. package/dist/rail/persistence.js.map +1 -0
  179. package/dist/rail/securityMonitor.d.ts +23 -0
  180. package/dist/rail/securityMonitor.d.ts.map +1 -0
  181. package/dist/rail/securityMonitor.js +52 -0
  182. package/dist/rail/securityMonitor.js.map +1 -0
  183. package/dist/rail/server.d.ts +186 -0
  184. package/dist/rail/server.d.ts.map +1 -0
  185. package/dist/rail/server.js +568 -0
  186. package/dist/rail/server.js.map +1 -0
  187. package/dist/rail/userSessionManager.d.ts +29 -0
  188. package/dist/rail/userSessionManager.d.ts.map +1 -0
  189. package/dist/rail/userSessionManager.js +87 -0
  190. package/dist/rail/userSessionManager.js.map +1 -0
  191. package/dist/rail/wsServer.d.ts +39 -0
  192. package/dist/rail/wsServer.d.ts.map +1 -0
  193. package/dist/rail/wsServer.js +544 -0
  194. package/dist/rail/wsServer.js.map +1 -0
  195. package/dist/resonance/globalKuramoto.d.ts +67 -0
  196. package/dist/resonance/globalKuramoto.d.ts.map +1 -0
  197. package/dist/resonance/globalKuramoto.js +161 -0
  198. package/dist/resonance/globalKuramoto.js.map +1 -0
  199. package/dist/resonance/index.d.ts +12 -0
  200. package/dist/resonance/index.d.ts.map +1 -0
  201. package/dist/resonance/index.js +9 -0
  202. package/dist/resonance/index.js.map +1 -0
  203. package/dist/resonance/kuramoto.d.ts +118 -0
  204. package/dist/resonance/kuramoto.d.ts.map +1 -0
  205. package/dist/resonance/kuramoto.js +212 -0
  206. package/dist/resonance/kuramoto.js.map +1 -0
  207. package/dist/routing/distributedRouter.d.ts +84 -0
  208. package/dist/routing/distributedRouter.d.ts.map +1 -0
  209. package/dist/routing/distributedRouter.js +209 -0
  210. package/dist/routing/distributedRouter.js.map +1 -0
  211. package/dist/routing/index.d.ts +8 -0
  212. package/dist/routing/index.d.ts.map +1 -0
  213. package/dist/routing/index.js +7 -0
  214. package/dist/routing/index.js.map +1 -0
  215. package/dist/routing/thermodynamic.d.ts +91 -0
  216. package/dist/routing/thermodynamic.d.ts.map +1 -0
  217. package/dist/routing/thermodynamic.js +184 -0
  218. package/dist/routing/thermodynamic.js.map +1 -0
  219. package/dist/runtime/agent-zero.d.ts +138 -0
  220. package/dist/runtime/agent-zero.d.ts.map +1 -0
  221. package/dist/runtime/agent-zero.js +435 -0
  222. package/dist/runtime/agent-zero.js.map +1 -0
  223. package/dist/runtime/index.d.ts +13 -0
  224. package/dist/runtime/index.d.ts.map +1 -0
  225. package/dist/runtime/index.js +15 -0
  226. package/dist/runtime/index.js.map +1 -0
  227. package/dist/security/capabilities.d.ts +178 -0
  228. package/dist/security/capabilities.d.ts.map +1 -0
  229. package/dist/security/capabilities.js +270 -0
  230. package/dist/security/capabilities.js.map +1 -0
  231. package/dist/security/channelFirewallMiddleware.d.ts +22 -0
  232. package/dist/security/channelFirewallMiddleware.d.ts.map +1 -0
  233. package/dist/security/channelFirewallMiddleware.js +52 -0
  234. package/dist/security/channelFirewallMiddleware.js.map +1 -0
  235. package/dist/security/index.d.ts +11 -0
  236. package/dist/security/index.d.ts.map +1 -0
  237. package/dist/security/index.js +11 -0
  238. package/dist/security/index.js.map +1 -0
  239. package/dist/security/injectionFirewall.d.ts +47 -0
  240. package/dist/security/injectionFirewall.d.ts.map +1 -0
  241. package/dist/security/injectionFirewall.js +262 -0
  242. package/dist/security/injectionFirewall.js.map +1 -0
  243. package/dist/security/outputSanitizer.d.ts +28 -0
  244. package/dist/security/outputSanitizer.d.ts.map +1 -0
  245. package/dist/security/outputSanitizer.js +66 -0
  246. package/dist/security/outputSanitizer.js.map +1 -0
  247. package/dist/security/sandbox.d.ts +192 -0
  248. package/dist/security/sandbox.d.ts.map +1 -0
  249. package/dist/security/sandbox.js +359 -0
  250. package/dist/security/sandbox.js.map +1 -0
  251. package/dist/security/skillVerify.d.ts +128 -0
  252. package/dist/security/skillVerify.d.ts.map +1 -0
  253. package/dist/security/skillVerify.js +220 -0
  254. package/dist/security/skillVerify.js.map +1 -0
  255. package/dist/security/vault.d.ts +60 -0
  256. package/dist/security/vault.d.ts.map +1 -0
  257. package/dist/security/vault.js +522 -0
  258. package/dist/security/vault.js.map +1 -0
  259. package/dist/utils/persistentRateLimiter.d.ts +69 -0
  260. package/dist/utils/persistentRateLimiter.d.ts.map +1 -0
  261. package/dist/utils/persistentRateLimiter.js +128 -0
  262. package/dist/utils/persistentRateLimiter.js.map +1 -0
  263. package/package.json +95 -0
@@ -0,0 +1,411 @@
1
+ /**
2
+ * Twitter/X Channel Adapter
3
+ *
4
+ * Thin adapter using agent-twitter-client (Scraper) to AXON messages.
5
+ * Rate limits: 50 tweets/day, 1 tweet/2min cooldown, mention polling every 60s.
6
+ */
7
+ import { EventEmitter } from 'eventemitter3';
8
+ import { randomUUID } from 'crypto';
9
+ import { Scraper, SearchMode } from 'agent-twitter-client';
10
+ import { createFirewallMiddleware } from '../security/channelFirewallMiddleware.js';
11
+ // ============================================================================
12
+ // RATE LIMITER (from moltbook.ts pattern)
13
+ // ============================================================================
14
+ class SlidingWindowLimiter {
15
+ timestamps = [];
16
+ maxRequests;
17
+ windowMs;
18
+ constructor(maxRequests, windowMs) {
19
+ this.maxRequests = maxRequests;
20
+ this.windowMs = windowMs;
21
+ }
22
+ check() {
23
+ this.prune();
24
+ return this.timestamps.length < this.maxRequests;
25
+ }
26
+ record() {
27
+ this.timestamps.push(Date.now());
28
+ }
29
+ remaining() {
30
+ this.prune();
31
+ return Math.max(0, this.maxRequests - this.timestamps.length);
32
+ }
33
+ prune() {
34
+ const cutoff = Date.now() - this.windowMs;
35
+ this.timestamps = this.timestamps.filter(t => t > cutoff);
36
+ }
37
+ }
38
+ class CooldownLimiter {
39
+ lastAction = 0;
40
+ cooldownMs;
41
+ constructor(cooldownMs) {
42
+ this.cooldownMs = cooldownMs;
43
+ }
44
+ check() {
45
+ return Date.now() - this.lastAction >= this.cooldownMs;
46
+ }
47
+ record() {
48
+ this.lastAction = Date.now();
49
+ }
50
+ remainingMs() {
51
+ const elapsed = Date.now() - this.lastAction;
52
+ return Math.max(0, this.cooldownMs - elapsed);
53
+ }
54
+ }
55
+ // ============================================================================
56
+ // TWITTER ADAPTER
57
+ // ============================================================================
58
+ export class TwitterAdapter extends EventEmitter {
59
+ config;
60
+ status = 'disconnected';
61
+ handlers = [];
62
+ scraper;
63
+ pollTimer;
64
+ lastSeenMentionId;
65
+ dailyTweetLimiter;
66
+ tweetCooldown;
67
+ firewall = createFirewallMiddleware('standard');
68
+ constructor(config) {
69
+ super();
70
+ this.config = config;
71
+ this.scraper = new Scraper();
72
+ this.dailyTweetLimiter = new SlidingWindowLimiter(config.dailyTweetLimit, 86_400_000); // 24 hours
73
+ this.tweetCooldown = new CooldownLimiter(config.tweetCooldownMs);
74
+ }
75
+ // ==========================================================================
76
+ // CHANNEL ADAPTER INTERFACE
77
+ // ==========================================================================
78
+ async connect() {
79
+ this.status = 'connecting';
80
+ try {
81
+ if (this.config.cookies) {
82
+ await this.scraper.setCookies(JSON.parse(this.config.cookies));
83
+ }
84
+ const isLoggedIn = await this.scraper.isLoggedIn();
85
+ if (!isLoggedIn) {
86
+ await this.scraper.login(this.config.username, this.config.password, this.config.email);
87
+ }
88
+ const loggedInCheck = await this.scraper.isLoggedIn();
89
+ if (!loggedInCheck) {
90
+ throw new Error('Twitter login verification failed');
91
+ }
92
+ this.pollTimer = setInterval(() => void this.pollMentions(), this.config.pollIntervalMs);
93
+ this.status = 'connected';
94
+ }
95
+ catch (error) {
96
+ this.status = 'disconnected';
97
+ throw new Error(`Twitter connection failed: ${error instanceof Error ? error.message : String(error)}`);
98
+ }
99
+ }
100
+ async disconnect() {
101
+ if (this.pollTimer) {
102
+ clearInterval(this.pollTimer);
103
+ this.pollTimer = undefined;
104
+ }
105
+ try {
106
+ await this.scraper.logout();
107
+ }
108
+ catch (error) {
109
+ // Swallow logout errors; session may already be invalid
110
+ void error;
111
+ }
112
+ this.status = 'disconnected';
113
+ }
114
+ async send(content, to) {
115
+ if (this.status !== 'connected')
116
+ throw new Error('Not connected to Twitter');
117
+ this.enforceRateLimits();
118
+ try {
119
+ let tweetId;
120
+ const response = to
121
+ ? await this.scraper.sendTweet(content, to)
122
+ : await this.scraper.sendTweet(content);
123
+ if (!response.ok)
124
+ throw new Error(`Tweet failed: HTTP ${response.status}`);
125
+ try {
126
+ const json = await response.json();
127
+ const result = json?.data?.create_tweet;
128
+ const tweetResult = result?.tweet_results;
129
+ tweetId = tweetResult?.result?.rest_id;
130
+ }
131
+ catch {
132
+ // Tweet was sent but ID extraction failed — non-fatal
133
+ }
134
+ const msg = {
135
+ id: randomUUID(),
136
+ kind: 'act',
137
+ from: randomUUID(), // Agent ID
138
+ payload: {
139
+ content,
140
+ platform: 'twitter',
141
+ tweetId,
142
+ replyTo: to,
143
+ },
144
+ timestamp: Date.now(),
145
+ };
146
+ this.dailyTweetLimiter.record();
147
+ this.tweetCooldown.record();
148
+ this.emit('send', msg);
149
+ }
150
+ catch (error) {
151
+ throw new Error(`Twitter send failed: ${error instanceof Error ? error.message : String(error)}`);
152
+ }
153
+ }
154
+ onMessage(handler) {
155
+ this.handlers.push(handler);
156
+ }
157
+ getStatus() {
158
+ return this.status;
159
+ }
160
+ // ==========================================================================
161
+ // TWITTER-SPECIFIC METHODS
162
+ // ==========================================================================
163
+ /**
164
+ * Post a thread (chain of tweets replying to each other).
165
+ */
166
+ async createThread(tweets) {
167
+ if (this.status !== 'connected')
168
+ throw new Error('Not connected to Twitter');
169
+ if (tweets.length === 0)
170
+ throw new Error('Thread must contain at least one tweet');
171
+ const tweetIds = [];
172
+ let replyToId;
173
+ for (const content of tweets) {
174
+ this.enforceRateLimits();
175
+ const response = await this.scraper.sendTweet(content, replyToId);
176
+ if (!response.ok)
177
+ throw new Error(`Thread tweet failed: HTTP ${response.status}`);
178
+ let extractedId;
179
+ try {
180
+ const json = await response.json();
181
+ const result = json?.data?.create_tweet;
182
+ const tweetResult = result?.tweet_results;
183
+ extractedId = tweetResult?.result?.rest_id;
184
+ }
185
+ catch {
186
+ // non-fatal
187
+ }
188
+ const id = extractedId ?? randomUUID();
189
+ tweetIds.push(id);
190
+ replyToId = extractedId;
191
+ this.dailyTweetLimiter.record();
192
+ this.tweetCooldown.record();
193
+ // Wait for cooldown before next tweet
194
+ if (tweets.indexOf(content) < tweets.length - 1) {
195
+ await new Promise(resolve => setTimeout(resolve, this.tweetCooldown.remainingMs()));
196
+ }
197
+ }
198
+ return tweetIds;
199
+ }
200
+ /**
201
+ * Like a tweet.
202
+ */
203
+ async like(tweetId) {
204
+ if (this.status !== 'connected')
205
+ throw new Error('Not connected to Twitter');
206
+ try {
207
+ await this.scraper.likeTweet(tweetId);
208
+ }
209
+ catch (error) {
210
+ throw new Error(`Twitter like failed: ${error instanceof Error ? error.message : String(error)}`);
211
+ }
212
+ }
213
+ /**
214
+ * Retweet a tweet.
215
+ */
216
+ async retweet(tweetId) {
217
+ if (this.status !== 'connected')
218
+ throw new Error('Not connected to Twitter');
219
+ try {
220
+ await this.scraper.retweet(tweetId);
221
+ }
222
+ catch (error) {
223
+ throw new Error(`Twitter retweet failed: ${error instanceof Error ? error.message : String(error)}`);
224
+ }
225
+ }
226
+ /**
227
+ * Follow a user.
228
+ */
229
+ async follow(username) {
230
+ if (this.status !== 'connected')
231
+ throw new Error('Not connected to Twitter');
232
+ try {
233
+ await this.scraper.followUser(username);
234
+ }
235
+ catch (error) {
236
+ throw new Error(`Twitter follow failed: ${error instanceof Error ? error.message : String(error)}`);
237
+ }
238
+ }
239
+ /**
240
+ * Get timeline tweets.
241
+ */
242
+ async getTimeline(count = 20) {
243
+ if (this.status !== 'connected')
244
+ throw new Error('Not connected to Twitter');
245
+ try {
246
+ const tweets = [];
247
+ const iterator = this.scraper.getTweets(this.config.username, count);
248
+ for await (const tweet of iterator) {
249
+ tweets.push(tweet);
250
+ if (tweets.length >= count)
251
+ break;
252
+ }
253
+ return tweets;
254
+ }
255
+ catch (error) {
256
+ throw new Error(`Twitter timeline fetch failed: ${error instanceof Error ? error.message : String(error)}`);
257
+ }
258
+ }
259
+ /**
260
+ * Search for tweets matching a query.
261
+ */
262
+ async search(query, count = 20, mode = SearchMode.Latest) {
263
+ if (this.status !== 'connected')
264
+ throw new Error('Not connected to Twitter');
265
+ try {
266
+ const tweets = [];
267
+ const iterator = this.scraper.searchTweets(query, count, mode);
268
+ for await (const tweet of iterator) {
269
+ tweets.push(tweet);
270
+ if (tweets.length >= count)
271
+ break;
272
+ }
273
+ return tweets;
274
+ }
275
+ catch (error) {
276
+ throw new Error(`Twitter search failed: ${error instanceof Error ? error.message : String(error)}`);
277
+ }
278
+ }
279
+ /**
280
+ * Get current session cookies (for persistence).
281
+ */
282
+ async getCookies() {
283
+ const cookies = await this.scraper.getCookies();
284
+ return JSON.stringify(cookies);
285
+ }
286
+ // ==========================================================================
287
+ // MENTION POLLING & TRANSLATION
288
+ // ==========================================================================
289
+ /**
290
+ * Poll for new mentions and translate to AXON percept messages.
291
+ */
292
+ async pollMentions() {
293
+ if (this.status !== 'connected')
294
+ return;
295
+ try {
296
+ const searchQuery = `@${this.config.username}`;
297
+ const mentions = await this.search(searchQuery, 50, SearchMode.Latest);
298
+ // Filter to only new mentions
299
+ const newMentions = this.lastSeenMentionId
300
+ ? mentions.filter(tweet => tweet.id !== this.lastSeenMentionId)
301
+ : mentions;
302
+ if (newMentions.length === 0)
303
+ return;
304
+ // Update last seen
305
+ if (mentions.length > 0 && mentions[0].id) {
306
+ this.lastSeenMentionId = mentions[0].id;
307
+ }
308
+ // Translate and dispatch
309
+ for (const tweet of newMentions.reverse()) {
310
+ if (!tweet.text)
311
+ continue;
312
+ const firewallResult = this.firewall.process(tweet.text, 'channel-bridged');
313
+ if (!firewallResult.safe) {
314
+ this.emit('message:blocked', {
315
+ reason: firewallResult.threats,
316
+ tweetId: tweet.id,
317
+ fromUsername: tweet.username,
318
+ timestamp: Date.now(),
319
+ });
320
+ console.log(`Twitter: Blocked tweet ${tweet.id} from @${tweet.username} due to firewall threats:`, firewallResult.threats);
321
+ continue;
322
+ }
323
+ const msg = this.translateTweet({ ...tweet, text: firewallResult.sanitized });
324
+ if (msg) {
325
+ for (const handler of this.handlers)
326
+ handler(msg);
327
+ }
328
+ }
329
+ }
330
+ catch (error) {
331
+ // Swallow poll errors; next cycle retries
332
+ void error;
333
+ }
334
+ }
335
+ /**
336
+ * Translate a Tweet object to AXON percept message.
337
+ */
338
+ translateTweet(tweet) {
339
+ if (!tweet.text || !tweet.id)
340
+ return null;
341
+ return {
342
+ id: randomUUID(),
343
+ kind: 'percept',
344
+ from: randomUUID(), // mapped from tweet.userId
345
+ payload: {
346
+ content: tweet.text,
347
+ platform: 'twitter',
348
+ tweetId: tweet.id,
349
+ fromUsername: tweet.username ?? 'unknown',
350
+ fromUserId: tweet.userId ?? 'unknown',
351
+ isRetweet: tweet.isRetweet ?? false,
352
+ isReply: tweet.isReply ?? false,
353
+ replyToTweetId: tweet.inReplyToStatusId,
354
+ likes: tweet.likes ?? 0,
355
+ retweets: tweet.retweets ?? 0,
356
+ replies: tweet.replies ?? 0,
357
+ hashtags: tweet.hashtags ?? [],
358
+ mentions: tweet.mentions ?? [],
359
+ urls: tweet.urls ?? [],
360
+ },
361
+ timestamp: tweet.timestamp ? new Date(tweet.timestamp).getTime() : Date.now(),
362
+ };
363
+ }
364
+ /**
365
+ * Handle an incoming tweet (for webhook/push integration).
366
+ */
367
+ handleIncoming(tweet) {
368
+ if (!tweet.text)
369
+ return;
370
+ const firewallResult = this.firewall.process(tweet.text, 'channel-bridged');
371
+ if (!firewallResult.safe) {
372
+ this.emit('message:blocked', {
373
+ reason: firewallResult.threats,
374
+ tweetId: tweet.id,
375
+ fromUsername: tweet.username,
376
+ timestamp: Date.now(),
377
+ });
378
+ console.log(`Twitter: Blocked incoming tweet ${tweet.id} from @${tweet.username} due to firewall threats:`, firewallResult.threats);
379
+ return;
380
+ }
381
+ const msg = this.translateTweet({ ...tweet, text: firewallResult.sanitized });
382
+ if (msg) {
383
+ for (const handler of this.handlers)
384
+ handler(msg);
385
+ }
386
+ }
387
+ // ==========================================================================
388
+ // INTERNAL
389
+ // ==========================================================================
390
+ enforceRateLimits() {
391
+ if (!this.dailyTweetLimiter.check()) {
392
+ throw new Error(`Twitter daily tweet limit (${this.config.dailyTweetLimit}/day) exceeded. Remaining: ${this.dailyTweetLimiter.remaining()}`);
393
+ }
394
+ if (!this.tweetCooldown.check()) {
395
+ const remaining = Math.ceil(this.tweetCooldown.remainingMs() / 1000);
396
+ throw new Error(`Twitter tweet cooldown: ${remaining}s remaining`);
397
+ }
398
+ }
399
+ }
400
+ // ============================================================================
401
+ // FACTORY
402
+ // ============================================================================
403
+ const DEFAULT_CONFIG = {
404
+ pollIntervalMs: 60_000, // 1 minute
405
+ dailyTweetLimit: 50,
406
+ tweetCooldownMs: 120_000, // 2 minutes
407
+ };
408
+ export function createTwitterAdapter(config) {
409
+ return new TwitterAdapter({ ...DEFAULT_CONFIG, ...config });
410
+ }
411
+ //# sourceMappingURL=twitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twitter.js","sourceRoot":"","sources":["../../src/channels/twitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * WhatsApp Channel Adapter
3
+ *
4
+ * Production-ready adapter using Baileys for WhatsApp Web multi-device
5
+ * and Twilio for burner phone number provisioning.
6
+ */
7
+ import { EventEmitter } from 'eventemitter3';
8
+ import type { Message } from '../primitives/types.js';
9
+ import type { Vault } from '../security/vault.js';
10
+ export interface ChannelAdapter {
11
+ connect(): Promise<void>;
12
+ disconnect(): Promise<void>;
13
+ send(content: string, to: string): Promise<void>;
14
+ onMessage(handler: (msg: Message) => void): void;
15
+ getStatus(): 'connected' | 'disconnected' | 'connecting';
16
+ }
17
+ export interface WhatsAppConfig {
18
+ identityId: string;
19
+ dailyMessageLimit?: number;
20
+ authDir?: string;
21
+ phoneNumber?: string;
22
+ twilioAccountSid?: string;
23
+ twilioAuthToken?: string;
24
+ autoRotate?: boolean;
25
+ rotateIntervalMs?: number;
26
+ }
27
+ interface TwilioPhoneNumber {
28
+ phoneNumber: string;
29
+ sid: string;
30
+ }
31
+ export declare class TwilioBurnerProvisioner {
32
+ private accountSid;
33
+ private authToken;
34
+ constructor(accountSid: string, authToken: string);
35
+ provision(country?: string): Promise<TwilioPhoneNumber>;
36
+ deprovision(sid: string): Promise<void>;
37
+ listNumbers(): Promise<TwilioPhoneNumber[]>;
38
+ }
39
+ export declare class WhatsAppAdapter extends EventEmitter implements ChannelAdapter {
40
+ private config;
41
+ private status;
42
+ private handlers;
43
+ private socket;
44
+ private dailyLimiter;
45
+ private burstLimiter;
46
+ private jidToAgentId;
47
+ private authDir;
48
+ private reconnectAttempts;
49
+ private maxReconnectAttempts;
50
+ private baseReconnectDelay;
51
+ private rotationTimer?;
52
+ private vault?;
53
+ private provisioner?;
54
+ private firewall;
55
+ constructor(config: WhatsAppConfig, vault?: Vault);
56
+ connect(): Promise<void>;
57
+ /**
58
+ * Create the Baileys socket and wire up event handlers.
59
+ * Separated from connect() so reconnect can call this without waitForConnection.
60
+ */
61
+ private createSocket;
62
+ disconnect(): Promise<void>;
63
+ send(content: string, to: string): Promise<void>;
64
+ sendMedia(to: string, url: string, caption?: string, type?: 'image' | 'video' | 'document'): Promise<void>;
65
+ onMessage(handler: (msg: Message) => void): void;
66
+ getStatus(): 'connected' | 'disconnected' | 'connecting';
67
+ private handleConnectionUpdate;
68
+ private handleIncomingMessage;
69
+ private extractMessageText;
70
+ private getOrCreateAgentId;
71
+ private waitForConnection;
72
+ private startAutoRotation;
73
+ private rotateIdentity;
74
+ }
75
+ export declare function createWhatsAppAdapter(config: WhatsAppConfig, vault?: Vault): WhatsAppAdapter;
76
+ export {};
77
+ //# sourceMappingURL=whatsapp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp.d.ts","sourceRoot":"","sources":["../../src/channels/whatsapp.ts"],"names":[],"mappings":"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"}