@llblab/pi-telegram 0.45.11 → 0.47.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 (204) hide show
  1. package/BACKLOG.md +5 -1
  2. package/CHANGELOG.md +12 -0
  3. package/README.md +6 -6
  4. package/dist/api/activity.d.ts +6 -0
  5. package/dist/api/activity.js +6 -0
  6. package/dist/api/commands.d.ts +6 -0
  7. package/dist/api/commands.js +6 -0
  8. package/dist/api/delivery.d.ts +6 -0
  9. package/dist/api/delivery.js +6 -0
  10. package/dist/api/inbound.d.ts +6 -0
  11. package/dist/api/inbound.js +6 -0
  12. package/dist/api/keyboard.d.ts +6 -0
  13. package/dist/api/keyboard.js +6 -0
  14. package/dist/api/outbound.d.ts +6 -0
  15. package/dist/api/outbound.js +6 -0
  16. package/dist/api/sections.d.ts +7 -0
  17. package/dist/api/sections.js +6 -0
  18. package/dist/api/status.d.ts +6 -0
  19. package/dist/api/status.js +6 -0
  20. package/dist/api/updates.d.ts +6 -0
  21. package/dist/api/updates.js +6 -0
  22. package/dist/api/voice.d.ts +6 -0
  23. package/dist/api/voice.js +6 -0
  24. package/dist/index.d.ts +6 -0
  25. package/dist/index.js +6 -0
  26. package/dist/lib/activity-verbosity.d.ts +52 -0
  27. package/dist/lib/activity-verbosity.js +596 -0
  28. package/dist/lib/activity.d.ts +220 -0
  29. package/dist/lib/activity.js +574 -0
  30. package/dist/lib/agent-messages.d.ts +28 -0
  31. package/dist/lib/agent-messages.js +86 -0
  32. package/dist/lib/bindings.d.ts +250 -0
  33. package/dist/lib/bindings.js +936 -0
  34. package/dist/lib/bus-api.d.ts +18 -0
  35. package/dist/lib/bus-api.js +254 -0
  36. package/dist/lib/bus-follower.d.ts +464 -0
  37. package/dist/lib/bus-follower.js +1686 -0
  38. package/dist/lib/bus-leader.d.ts +292 -0
  39. package/dist/lib/bus-leader.js +2242 -0
  40. package/dist/lib/bus-transport.d.ts +64 -0
  41. package/dist/lib/bus-transport.js +140 -0
  42. package/dist/lib/bus.d.ts +518 -0
  43. package/dist/lib/bus.js +2055 -0
  44. package/dist/lib/channel-posts.d.ts +170 -0
  45. package/dist/lib/channel-posts.js +611 -0
  46. package/dist/lib/command-templates.d.ts +70 -0
  47. package/dist/lib/command-templates.js +744 -0
  48. package/dist/lib/commands.d.ts +541 -0
  49. package/dist/lib/commands.js +1155 -0
  50. package/dist/lib/config.d.ts +252 -0
  51. package/dist/lib/config.js +889 -0
  52. package/dist/lib/delivery.d.ts +163 -0
  53. package/dist/lib/delivery.js +542 -0
  54. package/dist/lib/extension.d.ts +7 -0
  55. package/dist/lib/extension.js +1608 -0
  56. package/dist/lib/generative-app-worker.mjs +104 -0
  57. package/dist/lib/generative-apps.d.ts +212 -0
  58. package/dist/lib/generative-apps.js +1006 -0
  59. package/dist/lib/inbound.d.ts +91 -0
  60. package/dist/lib/inbound.js +502 -0
  61. package/dist/lib/journal.d.ts +665 -0
  62. package/dist/lib/journal.js +3701 -0
  63. package/dist/lib/keyboard.d.ts +23 -0
  64. package/dist/lib/keyboard.js +37 -0
  65. package/dist/lib/lifecycle.d.ts +157 -0
  66. package/dist/lib/lifecycle.js +395 -0
  67. package/dist/lib/locks.d.ts +164 -0
  68. package/dist/lib/locks.js +1208 -0
  69. package/dist/lib/logging.d.ts +50 -0
  70. package/dist/lib/logging.js +274 -0
  71. package/dist/lib/media.d.ts +181 -0
  72. package/dist/lib/media.js +602 -0
  73. package/dist/lib/menu-model.d.ts +217 -0
  74. package/dist/lib/menu-model.js +663 -0
  75. package/dist/lib/menu-queue.d.ts +37 -0
  76. package/dist/lib/menu-queue.js +408 -0
  77. package/dist/lib/menu-settings.d.ts +116 -0
  78. package/dist/lib/menu-settings.js +595 -0
  79. package/dist/lib/menu-status.d.ts +32 -0
  80. package/dist/lib/menu-status.js +112 -0
  81. package/dist/lib/menu-thinking.d.ts +29 -0
  82. package/dist/lib/menu-thinking.js +82 -0
  83. package/dist/lib/menu.d.ts +171 -0
  84. package/dist/lib/menu.js +323 -0
  85. package/dist/lib/model.d.ts +127 -0
  86. package/dist/lib/model.js +409 -0
  87. package/dist/lib/outbound-attachments.d.ts +241 -0
  88. package/dist/lib/outbound-attachments.js +639 -0
  89. package/dist/lib/outbound-buttons.d.ts +69 -0
  90. package/dist/lib/outbound-buttons.js +248 -0
  91. package/dist/lib/outbound-markup.d.ts +42 -0
  92. package/dist/lib/outbound-markup.js +678 -0
  93. package/dist/lib/outbound-voice.d.ts +55 -0
  94. package/dist/lib/outbound-voice.js +152 -0
  95. package/dist/lib/outbound.d.ts +185 -0
  96. package/dist/lib/outbound.js +516 -0
  97. package/dist/lib/ownership.d.ts +77 -0
  98. package/dist/lib/ownership.js +174 -0
  99. package/dist/lib/paths.d.ts +40 -0
  100. package/dist/lib/paths.js +94 -0
  101. package/dist/lib/pi.d.ts +72 -0
  102. package/dist/lib/pi.js +121 -0
  103. package/dist/lib/polling.d.ts +351 -0
  104. package/dist/lib/polling.js +1196 -0
  105. package/dist/lib/preview.d.ts +192 -0
  106. package/dist/lib/preview.js +614 -0
  107. package/dist/lib/prompt-templates.d.ts +24 -0
  108. package/dist/lib/prompt-templates.js +118 -0
  109. package/dist/lib/prompts.d.ts +57 -0
  110. package/dist/lib/prompts.js +167 -0
  111. package/dist/lib/queue.d.ts +766 -0
  112. package/dist/lib/queue.js +1965 -0
  113. package/dist/lib/recovery.d.ts +86 -0
  114. package/dist/lib/recovery.js +285 -0
  115. package/dist/lib/rendering.d.ts +20 -0
  116. package/dist/lib/rendering.js +983 -0
  117. package/dist/lib/replies.d.ts +214 -0
  118. package/dist/lib/replies.js +737 -0
  119. package/dist/lib/routing.d.ts +207 -0
  120. package/dist/lib/routing.js +2282 -0
  121. package/dist/lib/runtime.d.ts +172 -0
  122. package/dist/lib/runtime.js +402 -0
  123. package/dist/lib/sections.d.ts +165 -0
  124. package/dist/lib/sections.js +327 -0
  125. package/dist/lib/setup.d.ts +82 -0
  126. package/dist/lib/setup.js +150 -0
  127. package/dist/lib/skills.d.ts +8 -0
  128. package/dist/lib/skills.js +12 -0
  129. package/dist/lib/status.d.ts +442 -0
  130. package/dist/lib/status.js +1006 -0
  131. package/dist/lib/sync.d.ts +179 -0
  132. package/dist/lib/sync.js +782 -0
  133. package/dist/lib/target.d.ts +20 -0
  134. package/dist/lib/target.js +27 -0
  135. package/dist/lib/telegram-api.d.ts +541 -0
  136. package/dist/lib/telegram-api.js +1159 -0
  137. package/dist/lib/text-groups.d.ts +89 -0
  138. package/dist/lib/text-groups.js +317 -0
  139. package/dist/lib/thread-cleanup-manager.d.ts +288 -0
  140. package/dist/lib/thread-cleanup-manager.js +560 -0
  141. package/dist/lib/thread-display.d.ts +46 -0
  142. package/dist/lib/thread-display.js +257 -0
  143. package/dist/lib/thread-naming.d.ts +46 -0
  144. package/dist/lib/thread-naming.js +78 -0
  145. package/dist/lib/thread-reconciler.d.ts +239 -0
  146. package/dist/lib/thread-reconciler.js +644 -0
  147. package/dist/lib/threads.d.ts +621 -0
  148. package/dist/lib/threads.js +3679 -0
  149. package/dist/lib/time-injection.d.ts +15 -0
  150. package/dist/lib/time-injection.js +56 -0
  151. package/dist/lib/turns.d.ts +109 -0
  152. package/dist/lib/turns.js +500 -0
  153. package/dist/lib/updates.d.ts +1290 -0
  154. package/dist/lib/updates.js +3634 -0
  155. package/dist/lib/voice.d.ts +117 -0
  156. package/dist/lib/voice.js +174 -0
  157. package/dist/lib/workspace-admission.d.ts +264 -0
  158. package/dist/lib/workspace-admission.js +1136 -0
  159. package/dist/lib/workspace-retirement.d.ts +219 -0
  160. package/dist/lib/workspace-retirement.js +587 -0
  161. package/dist/lib/workspace-slots.d.ts +30 -0
  162. package/dist/lib/workspace-slots.js +54 -0
  163. package/dist/package.json +126 -0
  164. package/dist/pi-telegram/index.js +1 -0
  165. package/dist/skills/generated-control-surface/SKILL.md +107 -0
  166. package/dist/skills/generated-control-surface/references/capability-adapters.md +27 -0
  167. package/dist/skills/generated-control-surface/references/layout-and-state.md +37 -0
  168. package/dist/skills/generative-apps/SKILL.md +115 -0
  169. package/dist/skills/show-me/SKILL.md +166 -0
  170. package/dist/skills/show-me/references/telegram-surfaces.md +43 -0
  171. package/dist/skills/telegram-bridge/SKILL.md +129 -0
  172. package/dist/skills/telegram-bridge/references/configuration.md +15 -0
  173. package/dist/skills/telegram-bridge/references/delivery-and-threads.md +27 -0
  174. package/dist/skills/telegram-bridge/references/diagnosis.md +18 -0
  175. package/docs/architecture.md +1 -1
  176. package/docs/compact-matrix-literal.md +10 -3
  177. package/docs/generative-apps.md +15 -13
  178. package/docs/multi-instance-bus.md +17 -3
  179. package/docs/outbound.md +1 -1
  180. package/docs/public-api.md +2 -2
  181. package/lib/bindings.ts +89 -6
  182. package/lib/bus-follower.ts +11 -3
  183. package/lib/bus-leader.ts +57 -20
  184. package/lib/bus.ts +12 -2
  185. package/lib/commands.ts +2 -2
  186. package/lib/config.ts +14 -7
  187. package/lib/delivery.ts +38 -6
  188. package/lib/extension.ts +26 -1
  189. package/lib/generative-apps.ts +379 -13
  190. package/lib/menu-settings.ts +21 -5
  191. package/lib/outbound-markup.ts +16 -7
  192. package/lib/pi.ts +4 -0
  193. package/lib/sync.ts +3 -0
  194. package/lib/telegram-api.ts +12 -1
  195. package/lib/thread-cleanup-manager.ts +36 -6
  196. package/lib/thread-display.ts +96 -18
  197. package/lib/threads.ts +150 -30
  198. package/package.json +56 -13
  199. package/scripts/build-dist.mjs +44 -0
  200. package/scripts/measure-bus.mjs +8 -1
  201. package/scripts/measure-workspace.mjs +8 -1
  202. package/skills/generative-apps/SKILL.md +1 -1
  203. package/skills/show-me/SKILL.md +1 -1
  204. package/skills/telegram-bridge/SKILL.md +1 -1
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Telegram bus-aware API runtime
3
+ * Zones: multi-instance bus, telegram api transport, live instance routing
4
+ * Wraps the direct Telegram Bot API runtime so follower instances can route outbound calls through the bus leader
5
+ */
6
+ import type { TelegramBridgeApiRuntime } from "./telegram-api.ts";
7
+ export type TelegramBusApiCall = (method: string, args: unknown[]) => Promise<unknown>;
8
+ export interface TelegramBusAwareApiRuntimeDeps {
9
+ directRuntime: TelegramBridgeApiRuntime;
10
+ ownsDirect: () => boolean;
11
+ callFollowerApi: TelegramBusApiCall;
12
+ getDefaultTarget?: () => {
13
+ chatId: number;
14
+ threadId?: number;
15
+ } | undefined;
16
+ }
17
+ export declare function createTelegramAggregateTypingActionSender(runtime: Pick<TelegramBridgeApiRuntime, "call">): (chatId: number) => Promise<unknown>;
18
+ export declare function createTelegramBusAwareApiRuntime(deps: TelegramBusAwareApiRuntimeDeps): TelegramBridgeApiRuntime;
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Telegram bus-aware API runtime
3
+ * Zones: multi-instance bus, telegram api transport, live instance routing
4
+ * Wraps the direct Telegram Bot API runtime so follower instances can route outbound calls through the bus leader
5
+ */
6
+ import { markTelegramBusCrossTargetDelivery, stripTelegramBusApiMetadata, } from "./bus.js";
7
+ import { buildTelegramAnswerGuestQueryBody, isTelegramMessageNotModifiedError, } from "./telegram-api.js";
8
+ function asRecord(value) {
9
+ return value && typeof value === "object" && !Array.isArray(value)
10
+ ? value
11
+ : {};
12
+ }
13
+ function asBoolean(value) {
14
+ return Boolean(value);
15
+ }
16
+ function asSentMessage(value) {
17
+ return asRecord(value);
18
+ }
19
+ function withDefaultThreadTarget(body, target) {
20
+ if (target?.threadId === undefined)
21
+ return body;
22
+ if (body.message_thread_id !== undefined)
23
+ return body;
24
+ return body.chat_id === target.chatId
25
+ ? { ...body, message_thread_id: target.threadId }
26
+ : body;
27
+ }
28
+ function markFollowerCrossTargetDelivery(body, defaultTarget) {
29
+ if (!defaultTarget || body.chat_id !== defaultTarget.chatId)
30
+ return body;
31
+ const threadId = body.message_thread_id;
32
+ const isDifferentTarget = threadId === undefined
33
+ ? defaultTarget.threadId !== undefined
34
+ : threadId !== defaultTarget.threadId;
35
+ return isDifferentTarget ? markTelegramBusCrossTargetDelivery(body) : body;
36
+ }
37
+ function rejectTelegramDirectOwnership(method) {
38
+ return Promise.reject(new Error(`Telegram ${method} requires direct transport ownership.`));
39
+ }
40
+ export function createTelegramAggregateTypingActionSender(runtime) {
41
+ return (chatId) => runtime.call("sendChatAction", { chat_id: chatId, action: "typing" });
42
+ }
43
+ export function createTelegramBusAwareApiRuntime(deps) {
44
+ return {
45
+ call(method, body, options) {
46
+ return deps.ownsDirect()
47
+ ? deps.directRuntime.call(method, body, options)
48
+ : deps.callFollowerApi("call", [
49
+ method,
50
+ body,
51
+ options,
52
+ ]);
53
+ },
54
+ callMultipart(method, fields, fileField, filePath, fileName, options) {
55
+ return deps.ownsDirect()
56
+ ? deps.directRuntime.callMultipart(method, fields, fileField, filePath, fileName, options)
57
+ : deps.callFollowerApi("callMultipart", [
58
+ method,
59
+ fields,
60
+ fileField,
61
+ filePath,
62
+ fileName,
63
+ options,
64
+ ]);
65
+ },
66
+ downloadFile(fileId, suggestedName) {
67
+ return deps.ownsDirect()
68
+ ? deps.directRuntime.downloadFile(fileId, suggestedName)
69
+ : deps.callFollowerApi("downloadFile", [
70
+ fileId,
71
+ suggestedName,
72
+ ]);
73
+ },
74
+ deleteWebhook(signal) {
75
+ return deps.ownsDirect()
76
+ ? deps.directRuntime.deleteWebhook(signal)
77
+ : rejectTelegramDirectOwnership("deleteWebhook");
78
+ },
79
+ getUpdates(body, signal) {
80
+ return deps.ownsDirect()
81
+ ? deps.directRuntime.getUpdates(body, signal)
82
+ : rejectTelegramDirectOwnership("getUpdates");
83
+ },
84
+ setMyCommands(commands) {
85
+ return deps.ownsDirect()
86
+ ? deps.directRuntime.setMyCommands(commands)
87
+ : deps
88
+ .callFollowerApi("call", ["setMyCommands", { commands }])
89
+ .then(asBoolean);
90
+ },
91
+ sendChatAction(chatId, action, options) {
92
+ const body = withDefaultThreadTarget({
93
+ chat_id: chatId,
94
+ action,
95
+ ...(options?.message_thread_id !== undefined
96
+ ? { message_thread_id: options.message_thread_id }
97
+ : {}),
98
+ }, deps.getDefaultTarget?.());
99
+ return deps.ownsDirect()
100
+ ? deps.directRuntime.sendChatAction(chatId, action, options)
101
+ : deps
102
+ .callFollowerApi("call", ["sendChatAction", body])
103
+ .then(asBoolean);
104
+ },
105
+ sendTypingAction(chatId, options) {
106
+ const body = withDefaultThreadTarget({
107
+ chat_id: chatId,
108
+ action: "typing",
109
+ ...(options?.message_thread_id !== undefined
110
+ ? { message_thread_id: options.message_thread_id }
111
+ : {}),
112
+ }, deps.getDefaultTarget?.());
113
+ return deps.ownsDirect()
114
+ ? deps.directRuntime.sendTypingAction(chatId, options)
115
+ : deps
116
+ .callFollowerApi("call", ["sendChatAction", body])
117
+ .then(asBoolean);
118
+ },
119
+ sendRecordVoiceAction(chatId, options) {
120
+ const body = withDefaultThreadTarget({
121
+ chat_id: chatId,
122
+ action: "record_voice",
123
+ ...(options?.message_thread_id !== undefined
124
+ ? { message_thread_id: options.message_thread_id }
125
+ : {}),
126
+ }, deps.getDefaultTarget?.());
127
+ return deps.ownsDirect()
128
+ ? deps.directRuntime.sendRecordVoiceAction(chatId, options)
129
+ : deps
130
+ .callFollowerApi("call", ["sendChatAction", body])
131
+ .then(asBoolean);
132
+ },
133
+ sendMessageDraft(chatId, draftId, text, options) {
134
+ const body = {
135
+ chat_id: chatId,
136
+ draft_id: draftId,
137
+ };
138
+ if (text !== undefined)
139
+ body.text = text;
140
+ if (options?.parse_mode !== undefined)
141
+ body.parse_mode = options.parse_mode;
142
+ if (options?.entities !== undefined)
143
+ body.entities = options.entities;
144
+ if (options?.message_thread_id !== undefined) {
145
+ body.message_thread_id = options.message_thread_id;
146
+ }
147
+ const scopedBody = withDefaultThreadTarget(body, deps.getDefaultTarget?.());
148
+ return deps.ownsDirect()
149
+ ? deps.directRuntime.sendMessageDraft(chatId, draftId, text, options)
150
+ : deps
151
+ .callFollowerApi("call", ["sendMessageDraft", scopedBody])
152
+ .then(asBoolean);
153
+ },
154
+ sendMessage(body) {
155
+ return deps.ownsDirect()
156
+ ? deps.directRuntime.sendMessage(stripTelegramBusApiMetadata(body))
157
+ : deps
158
+ .callFollowerApi("call", [
159
+ "sendMessage",
160
+ markFollowerCrossTargetDelivery(body, deps.getDefaultTarget?.()),
161
+ ])
162
+ .then(asSentMessage);
163
+ },
164
+ sendRichMessage(body) {
165
+ return deps.ownsDirect()
166
+ ? deps.directRuntime.sendRichMessage(stripTelegramBusApiMetadata(body))
167
+ : deps
168
+ .callFollowerApi("call", [
169
+ "sendRichMessage",
170
+ markFollowerCrossTargetDelivery(body, deps.getDefaultTarget?.()),
171
+ ])
172
+ .then(asSentMessage);
173
+ },
174
+ sendRichMessageDraft(body) {
175
+ return deps.ownsDirect()
176
+ ? deps.directRuntime.sendRichMessageDraft(body)
177
+ : deps
178
+ .callFollowerApi("call", ["sendRichMessageDraft", body])
179
+ .then(asBoolean);
180
+ },
181
+ async editMessageText(body) {
182
+ if (deps.ownsDirect())
183
+ return deps.directRuntime.editMessageText(body);
184
+ try {
185
+ await deps.callFollowerApi("call", ["editMessageText", body]);
186
+ return "edited";
187
+ }
188
+ catch (error) {
189
+ if (isTelegramMessageNotModifiedError(error))
190
+ return "unchanged";
191
+ throw error;
192
+ }
193
+ },
194
+ async editMessageReplyMarkup(chatId, messageId, replyMarkup) {
195
+ if (deps.ownsDirect()) {
196
+ await deps.directRuntime.editMessageReplyMarkup(chatId, messageId, replyMarkup);
197
+ return;
198
+ }
199
+ await deps.callFollowerApi("call", [
200
+ "editMessageReplyMarkup",
201
+ { chat_id: chatId, message_id: messageId, reply_markup: replyMarkup },
202
+ ]);
203
+ },
204
+ async answerCallbackQuery(callbackQueryId, text) {
205
+ if (deps.ownsDirect()) {
206
+ await deps.directRuntime.answerCallbackQuery(callbackQueryId, text);
207
+ return;
208
+ }
209
+ await deps.callFollowerApi("call", [
210
+ "answerCallbackQuery",
211
+ {
212
+ callback_query_id: callbackQueryId,
213
+ ...(text !== undefined ? { text } : {}),
214
+ },
215
+ ]);
216
+ },
217
+ async answerGuestQuery(guestQueryId, text, options) {
218
+ if (deps.ownsDirect()) {
219
+ await deps.directRuntime.answerGuestQuery(guestQueryId, text, options);
220
+ return;
221
+ }
222
+ await deps.callFollowerApi("call", [
223
+ "answerGuestQuery",
224
+ buildTelegramAnswerGuestQueryBody(guestQueryId, text, options),
225
+ ]);
226
+ },
227
+ answerGuestQueryForInlineMessage(guestQueryId, text, options) {
228
+ // Guest answers can only be edited while this instance owns direct
229
+ // transport; follower forwarding cannot preserve the inline message id.
230
+ return deps.ownsDirect()
231
+ ? deps.directRuntime.answerGuestQueryForInlineMessage(guestQueryId, text, options)
232
+ : rejectTelegramDirectOwnership("answerGuestQueryForInlineMessage");
233
+ },
234
+ editGuestInlineMessage(inlineMessageId, content) {
235
+ return deps.ownsDirect()
236
+ ? deps.directRuntime.editGuestInlineMessage(inlineMessageId, content)
237
+ : rejectTelegramDirectOwnership("editGuestInlineMessage");
238
+ },
239
+ async deleteMessage(chatId, messageId) {
240
+ if (deps.ownsDirect())
241
+ return deps.directRuntime.deleteMessage(chatId, messageId);
242
+ await deps.callFollowerApi("call", [
243
+ "deleteMessage",
244
+ {
245
+ chat_id: chatId,
246
+ message_id: messageId,
247
+ },
248
+ ]);
249
+ },
250
+ prepareTempDir() {
251
+ return deps.directRuntime.prepareTempDir();
252
+ },
253
+ };
254
+ }