agent-life-bridge 0.1.1

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 (195) hide show
  1. package/.env.example +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +350 -0
  4. package/bin/agent-life-bridge.mjs +13 -0
  5. package/config.example.json +130 -0
  6. package/config.multi-agent.example.json +88 -0
  7. package/dist/agents/agent-life-session-map-store.d.ts +21 -0
  8. package/dist/agents/agent-life-session-map-store.d.ts.map +1 -0
  9. package/dist/agents/agent-life-session-map-store.js +78 -0
  10. package/dist/agents/agent-life-session-map-store.js.map +1 -0
  11. package/dist/agents/agent-resolver.d.ts +12 -0
  12. package/dist/agents/agent-resolver.d.ts.map +1 -0
  13. package/dist/agents/agent-resolver.js +114 -0
  14. package/dist/agents/agent-resolver.js.map +1 -0
  15. package/dist/agents/agent-router.d.ts +8 -0
  16. package/dist/agents/agent-router.d.ts.map +1 -0
  17. package/dist/agents/agent-router.js +72 -0
  18. package/dist/agents/agent-router.js.map +1 -0
  19. package/dist/agents/cli-backends.d.ts +25 -0
  20. package/dist/agents/cli-backends.d.ts.map +1 -0
  21. package/dist/agents/cli-backends.js +252 -0
  22. package/dist/agents/cli-backends.js.map +1 -0
  23. package/dist/agents/cli-output.d.ts +43 -0
  24. package/dist/agents/cli-output.d.ts.map +1 -0
  25. package/dist/agents/cli-output.js +352 -0
  26. package/dist/agents/cli-output.js.map +1 -0
  27. package/dist/agents/cli-runner.d.ts +32 -0
  28. package/dist/agents/cli-runner.d.ts.map +1 -0
  29. package/dist/agents/cli-runner.js +861 -0
  30. package/dist/agents/cli-runner.js.map +1 -0
  31. package/dist/agents/cli-session-store.d.ts +53 -0
  32. package/dist/agents/cli-session-store.d.ts.map +1 -0
  33. package/dist/agents/cli-session-store.js +263 -0
  34. package/dist/agents/cli-session-store.js.map +1 -0
  35. package/dist/agents/codex-app-server-runtime.d.ts +80 -0
  36. package/dist/agents/codex-app-server-runtime.d.ts.map +1 -0
  37. package/dist/agents/codex-app-server-runtime.js +1049 -0
  38. package/dist/agents/codex-app-server-runtime.js.map +1 -0
  39. package/dist/agents/fch-runtime-context.d.ts +28 -0
  40. package/dist/agents/fch-runtime-context.d.ts.map +1 -0
  41. package/dist/agents/fch-runtime-context.js +65 -0
  42. package/dist/agents/fch-runtime-context.js.map +1 -0
  43. package/dist/agents/model-selection.d.ts +28 -0
  44. package/dist/agents/model-selection.d.ts.map +1 -0
  45. package/dist/agents/model-selection.js +40 -0
  46. package/dist/agents/model-selection.js.map +1 -0
  47. package/dist/agents/models-config.d.ts +28 -0
  48. package/dist/agents/models-config.d.ts.map +1 -0
  49. package/dist/agents/models-config.js +43 -0
  50. package/dist/agents/models-config.js.map +1 -0
  51. package/dist/channels/agent-life.d.ts +9 -0
  52. package/dist/channels/agent-life.d.ts.map +1 -0
  53. package/dist/channels/agent-life.js +407 -0
  54. package/dist/channels/agent-life.js.map +1 -0
  55. package/dist/channels/command-gating.d.ts +20 -0
  56. package/dist/channels/command-gating.d.ts.map +1 -0
  57. package/dist/channels/command-gating.js +43 -0
  58. package/dist/channels/command-gating.js.map +1 -0
  59. package/dist/channels/draft-stream-controls.d.ts +21 -0
  60. package/dist/channels/draft-stream-controls.d.ts.map +1 -0
  61. package/dist/channels/draft-stream-controls.js +43 -0
  62. package/dist/channels/draft-stream-controls.js.map +1 -0
  63. package/dist/channels/draft-stream-loop.d.ts +31 -0
  64. package/dist/channels/draft-stream-loop.d.ts.map +1 -0
  65. package/dist/channels/draft-stream-loop.js +60 -0
  66. package/dist/channels/draft-stream-loop.js.map +1 -0
  67. package/dist/channels/mention-gating.d.ts +18 -0
  68. package/dist/channels/mention-gating.d.ts.map +1 -0
  69. package/dist/channels/mention-gating.js +20 -0
  70. package/dist/channels/mention-gating.js.map +1 -0
  71. package/dist/channels/registry.d.ts +5 -0
  72. package/dist/channels/registry.d.ts.map +1 -0
  73. package/dist/channels/registry.js +14 -0
  74. package/dist/channels/registry.js.map +1 -0
  75. package/dist/channels/run-state-machine.d.ts +21 -0
  76. package/dist/channels/run-state-machine.d.ts.map +1 -0
  77. package/dist/channels/run-state-machine.js +41 -0
  78. package/dist/channels/run-state-machine.js.map +1 -0
  79. package/dist/channels/session-envelope.d.ts +5 -0
  80. package/dist/channels/session-envelope.d.ts.map +1 -0
  81. package/dist/channels/session-envelope.js +16 -0
  82. package/dist/channels/session-envelope.js.map +1 -0
  83. package/dist/channels/session-id.d.ts +3 -0
  84. package/dist/channels/session-id.d.ts.map +1 -0
  85. package/dist/channels/session-id.js +11 -0
  86. package/dist/channels/session-id.js.map +1 -0
  87. package/dist/channels/session.d.ts +18 -0
  88. package/dist/channels/session.d.ts.map +1 -0
  89. package/dist/channels/session.js +35 -0
  90. package/dist/channels/session.js.map +1 -0
  91. package/dist/channels/typing-lifecycle.d.ts +16 -0
  92. package/dist/channels/typing-lifecycle.d.ts.map +1 -0
  93. package/dist/channels/typing-lifecycle.js +31 -0
  94. package/dist/channels/typing-lifecycle.js.map +1 -0
  95. package/dist/cli/cmd-add-agent.d.ts +19 -0
  96. package/dist/cli/cmd-add-agent.d.ts.map +1 -0
  97. package/dist/cli/cmd-add-agent.js +362 -0
  98. package/dist/cli/cmd-add-agent.js.map +1 -0
  99. package/dist/cli/cmd-config.d.ts +3 -0
  100. package/dist/cli/cmd-config.d.ts.map +1 -0
  101. package/dist/cli/cmd-config.js +16 -0
  102. package/dist/cli/cmd-config.js.map +1 -0
  103. package/dist/cli/cmd-doctor.d.ts +3 -0
  104. package/dist/cli/cmd-doctor.d.ts.map +1 -0
  105. package/dist/cli/cmd-doctor.js +127 -0
  106. package/dist/cli/cmd-doctor.js.map +1 -0
  107. package/dist/cli/cmd-logs.d.ts +3 -0
  108. package/dist/cli/cmd-logs.d.ts.map +1 -0
  109. package/dist/cli/cmd-logs.js +26 -0
  110. package/dist/cli/cmd-logs.js.map +1 -0
  111. package/dist/cli/cmd-onboard.d.ts +5 -0
  112. package/dist/cli/cmd-onboard.d.ts.map +1 -0
  113. package/dist/cli/cmd-onboard.js +53 -0
  114. package/dist/cli/cmd-onboard.js.map +1 -0
  115. package/dist/cli/cmd-restart.d.ts +3 -0
  116. package/dist/cli/cmd-restart.d.ts.map +1 -0
  117. package/dist/cli/cmd-restart.js +22 -0
  118. package/dist/cli/cmd-restart.js.map +1 -0
  119. package/dist/cli/cmd-start.d.ts +19 -0
  120. package/dist/cli/cmd-start.d.ts.map +1 -0
  121. package/dist/cli/cmd-start.js +783 -0
  122. package/dist/cli/cmd-start.js.map +1 -0
  123. package/dist/cli/cmd-status.d.ts +3 -0
  124. package/dist/cli/cmd-status.d.ts.map +1 -0
  125. package/dist/cli/cmd-status.js +16 -0
  126. package/dist/cli/cmd-status.js.map +1 -0
  127. package/dist/cli/cmd-stop.d.ts +9 -0
  128. package/dist/cli/cmd-stop.d.ts.map +1 -0
  129. package/dist/cli/cmd-stop.js +59 -0
  130. package/dist/cli/cmd-stop.js.map +1 -0
  131. package/dist/cli/cmd-update.d.ts +3 -0
  132. package/dist/cli/cmd-update.d.ts.map +1 -0
  133. package/dist/cli/cmd-update.js +127 -0
  134. package/dist/cli/cmd-update.js.map +1 -0
  135. package/dist/cli/cmd-version.d.ts +4 -0
  136. package/dist/cli/cmd-version.d.ts.map +1 -0
  137. package/dist/cli/cmd-version.js +12 -0
  138. package/dist/cli/cmd-version.js.map +1 -0
  139. package/dist/cli/pid-file.d.ts +23 -0
  140. package/dist/cli/pid-file.d.ts.map +1 -0
  141. package/dist/cli/pid-file.js +136 -0
  142. package/dist/cli/pid-file.js.map +1 -0
  143. package/dist/cli/run-main.d.ts +16 -0
  144. package/dist/cli/run-main.d.ts.map +1 -0
  145. package/dist/cli/run-main.js +114 -0
  146. package/dist/cli/run-main.js.map +1 -0
  147. package/dist/cli/update-check.d.ts +15 -0
  148. package/dist/cli/update-check.d.ts.map +1 -0
  149. package/dist/cli/update-check.js +187 -0
  150. package/dist/cli/update-check.js.map +1 -0
  151. package/dist/commands/prefix-router.d.ts +17 -0
  152. package/dist/commands/prefix-router.d.ts.map +1 -0
  153. package/dist/commands/prefix-router.js +79 -0
  154. package/dist/commands/prefix-router.js.map +1 -0
  155. package/dist/config/agent-dirs.d.ts +24 -0
  156. package/dist/config/agent-dirs.d.ts.map +1 -0
  157. package/dist/config/agent-dirs.js +71 -0
  158. package/dist/config/agent-dirs.js.map +1 -0
  159. package/dist/config/config.d.ts +4 -0
  160. package/dist/config/config.d.ts.map +1 -0
  161. package/dist/config/config.js +42 -0
  162. package/dist/config/config.js.map +1 -0
  163. package/dist/config/default-config.d.ts +9 -0
  164. package/dist/config/default-config.d.ts.map +1 -0
  165. package/dist/config/default-config.js +94 -0
  166. package/dist/config/default-config.js.map +1 -0
  167. package/dist/config/env-vars.d.ts +15 -0
  168. package/dist/config/env-vars.d.ts.map +1 -0
  169. package/dist/config/env-vars.js +16 -0
  170. package/dist/config/env-vars.js.map +1 -0
  171. package/dist/config/merge-config.d.ts +7 -0
  172. package/dist/config/merge-config.d.ts.map +1 -0
  173. package/dist/config/merge-config.js +45 -0
  174. package/dist/config/merge-config.js.map +1 -0
  175. package/dist/config/paths.d.ts +25 -0
  176. package/dist/config/paths.d.ts.map +1 -0
  177. package/dist/config/paths.js +31 -0
  178. package/dist/config/paths.js.map +1 -0
  179. package/dist/config/zod-schema.d.ts +3114 -0
  180. package/dist/config/zod-schema.d.ts.map +1 -0
  181. package/dist/config/zod-schema.js +217 -0
  182. package/dist/config/zod-schema.js.map +1 -0
  183. package/dist/entry.d.ts +3 -0
  184. package/dist/entry.d.ts.map +1 -0
  185. package/dist/entry.js +70 -0
  186. package/dist/entry.js.map +1 -0
  187. package/dist/logger.d.ts +5 -0
  188. package/dist/logger.d.ts.map +1 -0
  189. package/dist/logger.js +42 -0
  190. package/dist/logger.js.map +1 -0
  191. package/dist/types/index.d.ts +215 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +2 -0
  194. package/dist/types/index.js.map +1 -0
  195. package/package.json +62 -0
@@ -0,0 +1,407 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { basename, join } from 'node:path';
3
+ import { createWriteStream } from 'node:fs';
4
+ import { pipeline } from 'node:stream/promises';
5
+ import { registerChannel } from './registry.js';
6
+ import { makeSessionId } from './session-envelope.js';
7
+ import { generateRuntimeSessionId } from './session-id.js';
8
+ import { AgentLifeChannelSchema, normalizeAgentLifeChannelConfigs, } from '../config/zod-schema.js';
9
+ import { DATA_FILES_DIR } from '../config/paths.js';
10
+ class AgentLifeChannel {
11
+ id = 'agent-life';
12
+ accounts = new Map();
13
+ ctx = null;
14
+ async setup(rawConfig, ctx) {
15
+ const config = AgentLifeChannelSchema.parse(rawConfig);
16
+ this.ctx = ctx;
17
+ this.accounts.clear();
18
+ for (const normalized of normalizeAgentLifeChannelConfigs(config)) {
19
+ assertNonPlaceholderConfig(normalized.config);
20
+ const account = {
21
+ accountId: normalized.accountId,
22
+ config: normalized.config,
23
+ abortController: new AbortController(),
24
+ pollingTask: null,
25
+ offset: undefined,
26
+ recentDeliveryKeys: new Map(),
27
+ conflictStreak: 0,
28
+ };
29
+ this.accounts.set(account.accountId, account);
30
+ try {
31
+ const me = await this.request(account, 'getMe', undefined, account.abortController.signal);
32
+ ctx.logger.info({
33
+ channelId: this.id,
34
+ accountId: account.accountId,
35
+ botId: me.id,
36
+ botUsername: me.username,
37
+ }, 'agent-life channel connected');
38
+ account.pollingTask = this.pollLoop(account);
39
+ }
40
+ catch (error) {
41
+ account.abortController.abort();
42
+ this.accounts.delete(account.accountId);
43
+ ctx.logger.error({
44
+ channelId: this.id,
45
+ accountId: account.accountId,
46
+ err: error instanceof Error ? error.message : String(error),
47
+ }, 'agent-life channel setup failed; skipping account');
48
+ }
49
+ }
50
+ if (this.accounts.size === 0) {
51
+ throw new Error('agent-life setup failed: no accounts connected successfully');
52
+ }
53
+ }
54
+ async teardown() {
55
+ for (const account of this.accounts.values()) {
56
+ account.abortController.abort();
57
+ }
58
+ for (const account of this.accounts.values()) {
59
+ if (account.pollingTask) {
60
+ await account.pollingTask.catch(() => undefined);
61
+ }
62
+ }
63
+ this.accounts.clear();
64
+ }
65
+ async pollLoop(account) {
66
+ if (!this.ctx) {
67
+ throw new Error('agent-life channel not initialized');
68
+ }
69
+ let retryDelayMs = account.config.retry_interval * 1000;
70
+ while (!account.abortController.signal.aborted) {
71
+ try {
72
+ const updates = await this.request(account, 'getUpdates', {
73
+ offset: account.offset,
74
+ timeout: account.config.poll_timeout,
75
+ limit: 100,
76
+ }, account.abortController.signal);
77
+ retryDelayMs = account.config.retry_interval * 1000;
78
+ account.conflictStreak = 0;
79
+ if (updates.length > 0) {
80
+ this.ctx.logger.info({
81
+ channelId: this.id,
82
+ accountId: account.accountId,
83
+ updateCount: updates.length,
84
+ updateIds: updates.map(update => update.update_id),
85
+ updates: updates.map(update => summarizeUpdate(update)),
86
+ }, 'agent-life getUpdates received updates');
87
+ }
88
+ for (const update of updates) {
89
+ const deliveryKey = getDeliveryKey(update);
90
+ if (deliveryKey && this.isDuplicateDelivery(account, deliveryKey)) {
91
+ this.ctx.logger.warn({
92
+ channelId: this.id,
93
+ accountId: account.accountId,
94
+ deliveryKey,
95
+ update: summarizeUpdate(update),
96
+ }, 'Skipping duplicate agent-life update');
97
+ continue;
98
+ }
99
+ const nextOffset = getNextOffset(update);
100
+ if (nextOffset !== undefined) {
101
+ account.offset = nextOffset;
102
+ }
103
+ else {
104
+ this.ctx.logger.warn({
105
+ channelId: this.id,
106
+ accountId: account.accountId,
107
+ update: summarizeUpdate(update),
108
+ }, 'agent-life update missing update_id; falling back to in-memory dedupe');
109
+ }
110
+ const envelope = await this.toSessionEnvelope(update, account, account.abortController.signal);
111
+ if (!envelope) {
112
+ continue;
113
+ }
114
+ await this.ctx.dispatch(envelope);
115
+ }
116
+ }
117
+ catch (error) {
118
+ if (account.abortController.signal.aborted) {
119
+ break;
120
+ }
121
+ const message = error instanceof Error ? error.message : String(error);
122
+ if (isGetUpdatesConflictError(error)) {
123
+ account.conflictStreak += 1;
124
+ retryDelayMs = Math.max(account.config.retry_interval * 1000, (account.config.poll_timeout + AGENT_LIFE_CONFLICT_RELEASE_GRACE_SECONDS) * 1000);
125
+ const logLevel = account.conflictStreak === 1 ? 'warn' : 'info';
126
+ this.ctx.logger[logLevel]({
127
+ err: message,
128
+ retryDelayMs,
129
+ conflictStreak: account.conflictStreak,
130
+ channelId: this.id,
131
+ accountId: account.accountId,
132
+ }, 'agent-life poll conflict detected; waiting for previous long poll to release');
133
+ }
134
+ else {
135
+ account.conflictStreak = 0;
136
+ this.ctx.logger.warn({ err: message, retryDelayMs, channelId: this.id, accountId: account.accountId }, 'agent-life poll failed, retrying');
137
+ }
138
+ await sleep(retryDelayMs, account.abortController.signal);
139
+ retryDelayMs = isGetUpdatesConflictError(error)
140
+ ? Math.max(account.config.retry_interval * 1000, (account.config.poll_timeout + AGENT_LIFE_CONFLICT_RELEASE_GRACE_SECONDS) * 1000)
141
+ : Math.min(retryDelayMs * 2, account.config.max_retry_interval * 1000);
142
+ }
143
+ }
144
+ }
145
+ async request(account, method, payload, signal) {
146
+ const baseUrl = account.config.gateway_url.replace(/\/+$/, '');
147
+ const url = `${baseUrl}/bot${account.config.bot_token}/${method}`;
148
+ this.ctx?.logger.debug({ accountId: account.accountId, method, url: url.replace(account.config.bot_token, '***') }, 'agent-life request');
149
+ const response = await fetch(url, {
150
+ method: 'POST',
151
+ headers: { 'content-type': 'application/json' },
152
+ body: payload ? JSON.stringify(payload) : '{}',
153
+ signal,
154
+ });
155
+ const result = await response.json();
156
+ this.ctx?.logger.debug({ accountId: account.accountId, method, status: response.status, ok: result.ok, description: result.description }, 'agent-life response');
157
+ if (!response.ok) {
158
+ const detail = result.description ?? `HTTP ${response.status}`;
159
+ throw new Error(`agent-life ${method} failed: ${detail}`);
160
+ }
161
+ if (!result.ok) {
162
+ const detail = result.description ?? `error_code=${result.error_code ?? 'unknown'}`;
163
+ throw new Error(`agent-life ${method} failed: ${detail}`);
164
+ }
165
+ return result.result;
166
+ }
167
+ async toSessionEnvelope(update, account, signal) {
168
+ const message = update.message;
169
+ if (!message) {
170
+ this.ctx?.logger.debug({ updateId: update.update_id }, 'Skipping unsupported update');
171
+ return null;
172
+ }
173
+ const contentText = message.text ?? message.caption ?? '';
174
+ const mentionEntities = message.entities ?? message.caption_entities ?? [];
175
+ this.ctx?.logger.info({
176
+ channelId: this.id,
177
+ accountId: account.accountId,
178
+ updateId: update.update_id,
179
+ chatId: message.chat.id,
180
+ messageId: message.message_id,
181
+ messageThreadId: message.message_thread_id,
182
+ text: message.text,
183
+ caption: message.caption,
184
+ entities: message.entities,
185
+ captionEntities: message.caption_entities,
186
+ senderId: message.from?.id,
187
+ senderUsername: message.from?.username,
188
+ senderName: resolveTelegramSenderName(message.from),
189
+ }, 'agent-life inbound message payload');
190
+ const mentions = extractMentions(contentText, mentionEntities);
191
+ const attachments = await this.downloadAttachments(message, account, signal);
192
+ const agentLifeSessionKey = makeSessionId(account.config.bot_token, message.chat.id, message.message_thread_id);
193
+ return {
194
+ sessionId: generateRuntimeSessionId(),
195
+ source: {
196
+ channel: this.id,
197
+ accountId: account.accountId,
198
+ chatId: message.chat.id,
199
+ messageThreadId: message.message_thread_id,
200
+ chatType: normalizeChatType(message.chat.type),
201
+ userId: message.from?.id ?? 'unknown',
202
+ senderName: resolveTelegramSenderName(message.from),
203
+ username: message.from?.username,
204
+ messageId: message.message_id,
205
+ replyToMessageId: message.reply_to_message?.message_id,
206
+ agentLifeSessionKey,
207
+ },
208
+ content: {
209
+ text: contentText,
210
+ mentions,
211
+ attachments,
212
+ },
213
+ meta: {
214
+ timestamp: message.date * 1000,
215
+ raw: update,
216
+ },
217
+ };
218
+ }
219
+ async downloadAttachments(message, account, signal) {
220
+ const attachments = [];
221
+ if (message.document) {
222
+ const localPath = await this.downloadFile(account, message.document.file_id, message.document.file_name, signal);
223
+ attachments.push({
224
+ type: 'document',
225
+ localPath,
226
+ mimeType: message.document.mime_type,
227
+ fileName: message.document.file_name,
228
+ });
229
+ }
230
+ const photo = message.photo?.at(-1);
231
+ if (photo) {
232
+ const localPath = await this.downloadFile(account, photo.file_id, `${photo.file_id}.jpg`, signal);
233
+ attachments.push({
234
+ type: 'photo',
235
+ localPath,
236
+ mimeType: 'image/jpeg',
237
+ fileName: `${photo.file_id}.jpg`,
238
+ });
239
+ }
240
+ return attachments;
241
+ }
242
+ async downloadFile(account, fileId, fileName, signal) {
243
+ const fileInfo = await this.request(account, 'getFile', { file_id: fileId }, signal);
244
+ const baseUrl = account.config.gateway_url.replace(/\/+$/, '');
245
+ const fileUrl = `${baseUrl}/file/bot${account.config.bot_token}/${fileInfo.file_path.replace(/^\/+/, '')}`;
246
+ const safeName = sanitizeFileName(fileName ?? basename(fileInfo.file_path));
247
+ const targetDir = join(DATA_FILES_DIR, String(fileId));
248
+ const targetPath = join(targetDir, safeName);
249
+ mkdirSync(targetDir, { recursive: true });
250
+ const response = await fetch(fileUrl, { signal });
251
+ if (!response.ok || !response.body) {
252
+ throw new Error(`agent-life file download failed with HTTP ${response.status}`);
253
+ }
254
+ await pipeline(response.body, createWriteStream(targetPath));
255
+ return targetPath;
256
+ }
257
+ isDuplicateDelivery(account, deliveryKey) {
258
+ pruneRecentDeliveryKeys(account.recentDeliveryKeys);
259
+ const now = Date.now();
260
+ if (account.recentDeliveryKeys.has(deliveryKey)) {
261
+ account.recentDeliveryKeys.set(deliveryKey, now);
262
+ return true;
263
+ }
264
+ account.recentDeliveryKeys.set(deliveryKey, now);
265
+ return false;
266
+ }
267
+ }
268
+ function assertNonPlaceholderConfig(config) {
269
+ const isPlaceholderUrl = config.gateway_url.includes('your-agent-life-instance.com');
270
+ const isPlaceholderToken = config.bot_token.includes('xxxxxxxx') ||
271
+ config.bot_token === 'bot_xxxxxxxxxxxxxxxxxx';
272
+ if (isPlaceholderUrl || isPlaceholderToken) {
273
+ throw new Error('agent-life config is still using placeholder values; update channels["agent-life"].accounts.<accountId> or top-level gateway_url/bot_token first');
274
+ }
275
+ }
276
+ function normalizeChatType(chatType) {
277
+ if (chatType === 'private' || chatType === 'group' || chatType === 'multi_bot') {
278
+ return chatType;
279
+ }
280
+ return chatType === 'supergroup' ? 'group' : 'private';
281
+ }
282
+ function extractMentions(text, entities) {
283
+ return entities
284
+ .filter(entity => entity.type === 'mention')
285
+ .map(entity => text.slice(entity.offset, entity.offset + entity.length).replace(/^@/, ''))
286
+ .filter(Boolean);
287
+ }
288
+ export function resolveTelegramSenderName(user) {
289
+ if (!user) {
290
+ return undefined;
291
+ }
292
+ const fullName = [user.first_name?.trim(), user.last_name?.trim()].filter(Boolean).join(' ').trim();
293
+ if (fullName) {
294
+ return fullName;
295
+ }
296
+ const username = user.username?.trim();
297
+ return username || undefined;
298
+ }
299
+ function sanitizeFileName(fileName) {
300
+ return fileName.replace(/[^a-zA-Z0-9._-]/g, '_');
301
+ }
302
+ function getNextOffset(update) {
303
+ return Number.isInteger(update.update_id) ? Number(update.update_id) + 1 : undefined;
304
+ }
305
+ function getDeliveryKey(update) {
306
+ if (Number.isInteger(update.update_id)) {
307
+ return `update:${update.update_id}`;
308
+ }
309
+ const message = update.message;
310
+ if (!message) {
311
+ return null;
312
+ }
313
+ return [
314
+ 'message',
315
+ message.chat.id,
316
+ message.from?.id ?? 'unknown',
317
+ message.date,
318
+ message.reply_to_message?.message_id ?? '',
319
+ normalizeText(message.text ?? message.caption ?? ''),
320
+ message.document?.file_id ?? '',
321
+ (message.photo ?? []).map(photo => photo.file_id).join(','),
322
+ ].join('|');
323
+ }
324
+ function normalizeText(text) {
325
+ return text.replace(/\s+/g, ' ').trim();
326
+ }
327
+ function pruneRecentDeliveryKeys(recentDeliveryKeys) {
328
+ const expiresAt = Date.now() - RECENT_DELIVERY_TTL_MS;
329
+ for (const [key, seenAt] of recentDeliveryKeys) {
330
+ if (seenAt < expiresAt) {
331
+ recentDeliveryKeys.delete(key);
332
+ }
333
+ }
334
+ while (recentDeliveryKeys.size > MAX_RECENT_DELIVERY_KEYS) {
335
+ const oldestKey = recentDeliveryKeys.keys().next().value;
336
+ if (!oldestKey) {
337
+ break;
338
+ }
339
+ recentDeliveryKeys.delete(oldestKey);
340
+ }
341
+ }
342
+ function summarizeUpdate(update) {
343
+ const message = update.message;
344
+ if (!message) {
345
+ return {
346
+ updateId: update.update_id,
347
+ kind: 'unsupported',
348
+ };
349
+ }
350
+ return {
351
+ updateId: update.update_id,
352
+ kind: 'message',
353
+ messageId: message.message_id,
354
+ messageThreadId: message.message_thread_id,
355
+ chatId: message.chat.id,
356
+ chatType: message.chat.type,
357
+ userId: message.from?.id ?? 'unknown',
358
+ username: message.from?.username,
359
+ replyToMessageId: message.reply_to_message?.message_id,
360
+ textPreview: previewText(message.text ?? message.caption ?? ''),
361
+ mentionCount: (message.entities ?? message.caption_entities ?? []).filter(entity => entity.type === 'mention').length,
362
+ document: message.document
363
+ ? {
364
+ fileId: message.document.file_id,
365
+ fileName: message.document.file_name,
366
+ mimeType: message.document.mime_type,
367
+ }
368
+ : undefined,
369
+ photoCount: message.photo?.length ?? 0,
370
+ };
371
+ }
372
+ function previewText(text, maxLength = 160) {
373
+ const normalized = text.replace(/\s+/g, ' ').trim();
374
+ if (normalized.length <= maxLength) {
375
+ return normalized;
376
+ }
377
+ return `${normalized.slice(0, maxLength)}...`;
378
+ }
379
+ function isGetUpdatesConflictError(error) {
380
+ if (!(error instanceof Error)) {
381
+ return false;
382
+ }
383
+ return /agent-life getUpdates failed: Conflict:/i.test(error.message)
384
+ || /terminated by other getUpdates request/i.test(error.message);
385
+ }
386
+ async function sleep(ms, signal) {
387
+ if (ms <= 0) {
388
+ return;
389
+ }
390
+ await new Promise((resolve, reject) => {
391
+ const timer = setTimeout(resolve, ms);
392
+ const onAbort = () => {
393
+ clearTimeout(timer);
394
+ reject(new Error('aborted'));
395
+ };
396
+ signal.addEventListener('abort', onAbort, { once: true });
397
+ }).catch(error => {
398
+ if (!signal.aborted) {
399
+ throw error;
400
+ }
401
+ });
402
+ }
403
+ const RECENT_DELIVERY_TTL_MS = 2 * 60 * 1000;
404
+ const MAX_RECENT_DELIVERY_KEYS = 2048;
405
+ const AGENT_LIFE_CONFLICT_RELEASE_GRACE_SECONDS = 2;
406
+ registerChannel(new AgentLifeChannel());
407
+ //# sourceMappingURL=agent-life.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-life.js","sourceRoot":"","sources":["../../src/channels/agent-life.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Command gating - intercepts slash commands (e.g. /help, /status, /stop)
3
+ * before they reach the agent, handling them locally.
4
+ *
5
+ * Returns null if the message is not a command and should be forwarded to the agent.
6
+ */
7
+ export interface CommandResult {
8
+ /** The command name (without the leading /) */
9
+ command: string;
10
+ /** Arguments after the command name */
11
+ args: string;
12
+ /** Response text to send back to the user */
13
+ response: string;
14
+ }
15
+ export declare function parseCommand(text: string): {
16
+ command: string;
17
+ args: string;
18
+ } | null;
19
+ export declare function handleCommand(text: string): CommandResult | null;
20
+ //# sourceMappingURL=command-gating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-gating.d.ts","sourceRoot":"","sources":["../../src/channels/command-gating.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;CACjB;AAgBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUnF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAYhE"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Command gating - intercepts slash commands (e.g. /help, /status, /stop)
3
+ * before they reach the agent, handling them locally.
4
+ *
5
+ * Returns null if the message is not a command and should be forwarded to the agent.
6
+ */
7
+ const BUILT_IN_COMMANDS = {
8
+ help: () => [
9
+ 'Available commands:',
10
+ ' /help - Show this help',
11
+ ' /status - Show gateway status',
12
+ ' /new - Start a fresh Codex session for this chat',
13
+ ' /stop - Stop the current agent session',
14
+ ].join('\n'),
15
+ status: () => 'agent-life-bridge is running.',
16
+ stop: () => 'Session stop requested.',
17
+ };
18
+ export function parseCommand(text) {
19
+ const trimmed = text.trim();
20
+ if (!trimmed.startsWith('/'))
21
+ return null;
22
+ const match = /^\/(\S+)(?:\s+([\s\S]*))?$/.exec(trimmed);
23
+ if (!match)
24
+ return null;
25
+ return {
26
+ command: match[1].toLowerCase(),
27
+ args: match[2]?.trim() ?? '',
28
+ };
29
+ }
30
+ export function handleCommand(text) {
31
+ const parsed = parseCommand(text);
32
+ if (!parsed)
33
+ return null;
34
+ const handler = BUILT_IN_COMMANDS[parsed.command];
35
+ if (!handler)
36
+ return null;
37
+ return {
38
+ command: parsed.command,
39
+ args: parsed.args,
40
+ response: handler(parsed.args),
41
+ };
42
+ }
43
+ //# sourceMappingURL=command-gating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-gating.js","sourceRoot":"","sources":["../../src/channels/command-gating.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,iBAAiB,GAA6C;IAClE,IAAI,EAAE,GAAG,EAAE,CAAC;QACV,qBAAqB;QACrB,4BAA4B;QAC5B,iCAAiC;QACjC,uDAAuD;QACvD,4CAA4C;KAC7C,CAAC,IAAI,CAAC,IAAI,CAAC;IAEZ,MAAM,EAAE,GAAG,EAAE,CAAC,+BAA+B;IAE7C,IAAI,EAAE,GAAG,EAAE,CAAC,yBAAyB;CACtC,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAEzC,MAAM,KAAK,GAAG,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;QAC/B,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;KAC7B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAExB,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAEzB,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;KAC/B,CAAA;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Controls for pausing/resuming/aborting a draft stream.
3
+ * Used by outbound adapters to manage backpressure from the channel API
4
+ * (e.g. rate limiting on editMessageText).
5
+ */
6
+ export declare class DraftStreamControls {
7
+ private _paused;
8
+ private _aborted;
9
+ private resumeResolve;
10
+ pause(): void;
11
+ resume(): void;
12
+ abort(): void;
13
+ get paused(): boolean;
14
+ get aborted(): boolean;
15
+ /**
16
+ * Await this before sending the next chunk.
17
+ * Resolves immediately if not paused, otherwise waits for resume().
18
+ */
19
+ waitIfPaused(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=draft-stream-controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-stream-controls.d.ts","sourceRoot":"","sources":["../../src/channels/draft-stream-controls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,aAAa,CAA4B;IAEjD,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAQd,KAAK,IAAI,IAAI;IAMb,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAMpC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Controls for pausing/resuming/aborting a draft stream.
3
+ * Used by outbound adapters to manage backpressure from the channel API
4
+ * (e.g. rate limiting on editMessageText).
5
+ */
6
+ export class DraftStreamControls {
7
+ _paused = false;
8
+ _aborted = false;
9
+ resumeResolve = null;
10
+ pause() {
11
+ this._paused = true;
12
+ }
13
+ resume() {
14
+ this._paused = false;
15
+ if (this.resumeResolve) {
16
+ this.resumeResolve();
17
+ this.resumeResolve = null;
18
+ }
19
+ }
20
+ abort() {
21
+ this._aborted = true;
22
+ // Also resume to unblock any waiters
23
+ this.resume();
24
+ }
25
+ get paused() {
26
+ return this._paused;
27
+ }
28
+ get aborted() {
29
+ return this._aborted;
30
+ }
31
+ /**
32
+ * Await this before sending the next chunk.
33
+ * Resolves immediately if not paused, otherwise waits for resume().
34
+ */
35
+ async waitIfPaused() {
36
+ if (!this._paused)
37
+ return;
38
+ return new Promise(resolve => {
39
+ this.resumeResolve = resolve;
40
+ });
41
+ }
42
+ }
43
+ //# sourceMappingURL=draft-stream-controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-stream-controls.js","sourceRoot":"","sources":["../../src/channels/draft-stream-controls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IACtB,OAAO,GAAG,KAAK,CAAA;IACf,QAAQ,GAAG,KAAK,CAAA;IAChB,aAAa,GAAwB,IAAI,CAAA;IAEjD,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,EAAE,CAAA;YACpB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,qCAAqC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAA;IACf,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAM;QACzB,OAAO,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YACjC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAA;QAC9B,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ import type { Logger } from '../types/index.js';
2
+ /** Returns the message_id of the created message */
3
+ export type SendFn = (text: string) => Promise<number>;
4
+ export type EditFn = (messageId: number, text: string) => Promise<void>;
5
+ export interface DraftStreamOpts {
6
+ /** Initial send function — called once to create the message */
7
+ send: SendFn;
8
+ /** Edit function — called to update the message with new content */
9
+ edit: EditFn;
10
+ /** Debounce interval for edit calls (ms). Default: 1000 */
11
+ debounceMs?: number;
12
+ logger: Logger;
13
+ }
14
+ /**
15
+ * Manages the streaming reply lifecycle:
16
+ * 1. First chunk → sendMessage (creates the message, gets message_id)
17
+ * 2. Subsequent chunks → editMessageText (updates in place, debounced)
18
+ * 3. On complete → final editMessageText with full content
19
+ */
20
+ export declare class DraftStreamLoop {
21
+ private messageId;
22
+ private buffer;
23
+ private debounceTimer;
24
+ private readonly opts;
25
+ constructor(opts: DraftStreamOpts);
26
+ push(chunk: string): Promise<void>;
27
+ complete(): Promise<void>;
28
+ private scheduleEdit;
29
+ getBuffer(): string;
30
+ }
31
+ //# sourceMappingURL=draft-stream-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-stream-loop.d.ts","sourceRoot":"","sources":["../../src/channels/draft-stream-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,oDAAoD;AACpD,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AACtD,MAAM,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAEvE,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAA;IACZ,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAA;IACZ,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;gBAEpC,IAAI,EAAE,eAAe;IAO3B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B,OAAO,CAAC,YAAY;IAgBpB,SAAS,IAAI,MAAM;CAGpB"}