@llblab/pi-telegram 0.52.2 → 0.53.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 (204) hide show
  1. package/AGENTS.md +9 -7
  2. package/BACKLOG.md +1 -18
  3. package/CHANGELOG.md +15 -0
  4. package/README.md +7 -11
  5. package/api/commands.ts +3 -0
  6. package/dist/api/commands.d.ts +1 -1
  7. package/dist/lib/activity-verbosity.d.ts +1 -5
  8. package/dist/lib/activity-verbosity.js +15 -42
  9. package/dist/lib/activity.d.ts +9 -0
  10. package/dist/lib/activity.js +39 -10
  11. package/dist/lib/agent-messages.js +7 -3
  12. package/dist/lib/bindings.d.ts +43 -5
  13. package/dist/lib/bindings.js +163 -20
  14. package/dist/lib/bus-api.d.ts +12 -0
  15. package/dist/lib/bus-api.js +182 -79
  16. package/dist/lib/bus-follower.d.ts +111 -31
  17. package/dist/lib/bus-follower.js +1324 -359
  18. package/dist/lib/bus-leader.d.ts +41 -91
  19. package/dist/lib/bus-leader.js +969 -637
  20. package/dist/lib/bus-transport.js +16 -9
  21. package/dist/lib/bus.d.ts +215 -18
  22. package/dist/lib/bus.js +1048 -327
  23. package/dist/lib/channel-posts.d.ts +5 -0
  24. package/dist/lib/channel-posts.js +434 -261
  25. package/dist/lib/command-templates.d.ts +26 -5
  26. package/dist/lib/command-templates.js +92 -176
  27. package/dist/lib/commands.d.ts +168 -82
  28. package/dist/lib/commands.js +1409 -291
  29. package/dist/lib/config.d.ts +1 -8
  30. package/dist/lib/config.js +34 -76
  31. package/dist/lib/delivery.d.ts +2 -2
  32. package/dist/lib/delivery.js +16 -16
  33. package/dist/lib/extension.js +639 -171
  34. package/dist/lib/generative-app-worker.mjs +19 -7
  35. package/dist/lib/generative-apps.d.ts +0 -5
  36. package/dist/lib/generative-apps.js +61 -49
  37. package/dist/lib/inbound.d.ts +5 -0
  38. package/dist/lib/inbound.js +35 -59
  39. package/dist/lib/journal.d.ts +33 -3
  40. package/dist/lib/journal.js +2063 -782
  41. package/dist/lib/lifecycle.d.ts +2 -6
  42. package/dist/lib/lifecycle.js +75 -58
  43. package/dist/lib/locks.d.ts +29 -3
  44. package/dist/lib/locks.js +289 -108
  45. package/dist/lib/logging.js +50 -14
  46. package/dist/lib/media.d.ts +22 -1
  47. package/dist/lib/media.js +46 -28
  48. package/dist/lib/menu-model.d.ts +19 -5
  49. package/dist/lib/menu-model.js +53 -11
  50. package/dist/lib/menu-queue.d.ts +5 -4
  51. package/dist/lib/menu-queue.js +45 -63
  52. package/dist/lib/menu-settings.d.ts +5 -4
  53. package/dist/lib/menu-settings.js +114 -78
  54. package/dist/lib/menu-status.d.ts +1 -1
  55. package/dist/lib/menu-status.js +8 -25
  56. package/dist/lib/menu-thinking.d.ts +6 -1
  57. package/dist/lib/menu-thinking.js +14 -21
  58. package/dist/lib/menu.d.ts +8 -61
  59. package/dist/lib/menu.js +92 -164
  60. package/dist/lib/model.d.ts +1 -1
  61. package/dist/lib/model.js +2 -16
  62. package/dist/lib/outbound-attachments.d.ts +6 -27
  63. package/dist/lib/outbound-attachments.js +45 -38
  64. package/dist/lib/outbound-buttons.js +22 -16
  65. package/dist/lib/outbound-markup.d.ts +0 -2
  66. package/dist/lib/outbound-markup.js +51 -64
  67. package/dist/lib/outbound-voice.js +6 -3
  68. package/dist/lib/outbound.d.ts +6 -6
  69. package/dist/lib/outbound.js +65 -51
  70. package/dist/lib/ownership.js +6 -2
  71. package/dist/lib/paths.d.ts +5 -0
  72. package/dist/lib/paths.js +37 -21
  73. package/dist/lib/pi.d.ts +2 -0
  74. package/dist/lib/pi.js +8 -1
  75. package/dist/lib/polling.d.ts +21 -37
  76. package/dist/lib/polling.js +59 -50
  77. package/dist/lib/preview.js +39 -19
  78. package/dist/lib/process-identity.d.ts +24 -0
  79. package/dist/lib/process-identity.js +133 -0
  80. package/dist/lib/prompts.js +2 -7
  81. package/dist/lib/queue.d.ts +14 -16
  82. package/dist/lib/queue.js +252 -127
  83. package/dist/lib/recovery.d.ts +2 -83
  84. package/dist/lib/recovery.js +20 -274
  85. package/dist/lib/replies.d.ts +16 -24
  86. package/dist/lib/replies.js +99 -116
  87. package/dist/lib/routing.d.ts +120 -7
  88. package/dist/lib/routing.js +4667 -1152
  89. package/dist/lib/runtime.d.ts +1 -11
  90. package/dist/lib/sections.d.ts +4 -29
  91. package/dist/lib/sections.js +7 -20
  92. package/dist/lib/skills.js +4 -3
  93. package/dist/lib/status.js +86 -57
  94. package/dist/lib/sync.d.ts +1 -3
  95. package/dist/lib/sync.js +67 -43
  96. package/dist/lib/target.d.ts +4 -0
  97. package/dist/lib/target.js +18 -0
  98. package/dist/lib/telegram-api.d.ts +18 -13
  99. package/dist/lib/telegram-api.js +148 -53
  100. package/dist/lib/text-groups.js +4 -39
  101. package/dist/lib/thread-cleanup-manager.d.ts +6 -27
  102. package/dist/lib/thread-cleanup-manager.js +369 -186
  103. package/dist/lib/thread-display.d.ts +1 -2
  104. package/dist/lib/thread-display.js +58 -38
  105. package/dist/lib/thread-naming.d.ts +28 -8
  106. package/dist/lib/thread-naming.js +175 -66
  107. package/dist/lib/thread-reconciler.d.ts +42 -16
  108. package/dist/lib/thread-reconciler.js +90 -50
  109. package/dist/lib/threads.d.ts +82 -20
  110. package/dist/lib/threads.js +2247 -855
  111. package/dist/lib/time-injection.js +1 -2
  112. package/dist/lib/turns.js +1 -19
  113. package/dist/lib/updates.d.ts +169 -80
  114. package/dist/lib/updates.js +2418 -641
  115. package/dist/lib/voice.d.ts +7 -22
  116. package/dist/lib/voice.js +7 -22
  117. package/dist/lib/wire.js +1 -1
  118. package/dist/lib/workspace-admission.d.ts +3 -1
  119. package/dist/lib/workspace-admission.js +425 -211
  120. package/dist/lib/workspace-identity.js +8 -13
  121. package/dist/lib/workspace-retirement.d.ts +1 -1
  122. package/dist/lib/workspace-retirement.js +328 -140
  123. package/dist/lib/workspace-slots.js +8 -4
  124. package/dist/package.json +1 -1
  125. package/docs/architecture.md +31 -29
  126. package/docs/inbound.md +1 -1
  127. package/docs/multi-instance-bus.md +15 -3
  128. package/docs/outbound.md +1 -1
  129. package/docs/public-api.md +29 -1
  130. package/docs/ui-style.md +25 -8
  131. package/lib/activity-verbosity.ts +59 -82
  132. package/lib/activity.ts +146 -102
  133. package/lib/agent-messages.ts +12 -5
  134. package/lib/bindings.ts +389 -82
  135. package/lib/bus-api.ts +263 -102
  136. package/lib/bus-follower.ts +2440 -601
  137. package/lib/bus-leader.ts +2209 -1290
  138. package/lib/bus-transport.ts +46 -12
  139. package/lib/bus.ts +1673 -444
  140. package/lib/channel-posts.ts +848 -327
  141. package/lib/command-templates.ts +152 -265
  142. package/lib/commands.ts +2398 -555
  143. package/lib/config.ts +177 -170
  144. package/lib/delivery.ts +41 -29
  145. package/lib/extension.ts +1206 -433
  146. package/lib/generative-app-worker.mjs +19 -7
  147. package/lib/generative-apps.ts +324 -211
  148. package/lib/inbound.ts +95 -97
  149. package/lib/journal.ts +5311 -1763
  150. package/lib/keyboard.ts +1 -3
  151. package/lib/lifecycle.ts +128 -78
  152. package/lib/locks.ts +677 -203
  153. package/lib/logging.ts +147 -58
  154. package/lib/media.ts +82 -43
  155. package/lib/menu-model.ts +85 -18
  156. package/lib/menu-queue.ts +88 -129
  157. package/lib/menu-settings.ts +260 -155
  158. package/lib/menu-status.ts +20 -60
  159. package/lib/menu-thinking.ts +41 -56
  160. package/lib/menu.ts +112 -285
  161. package/lib/model.ts +8 -22
  162. package/lib/outbound-attachments.ts +156 -125
  163. package/lib/outbound-buttons.ts +76 -49
  164. package/lib/outbound-markup.ts +96 -94
  165. package/lib/outbound-voice.ts +33 -27
  166. package/lib/outbound.ts +128 -125
  167. package/lib/ownership.ts +19 -10
  168. package/lib/paths.ts +148 -49
  169. package/lib/pi.ts +35 -15
  170. package/lib/polling.ts +144 -147
  171. package/lib/preview.ts +93 -40
  172. package/lib/process-identity.ts +164 -0
  173. package/lib/prompts.ts +4 -11
  174. package/lib/queue.ts +516 -301
  175. package/lib/recovery.ts +50 -454
  176. package/lib/rendering.ts +1 -3
  177. package/lib/replies.ts +248 -209
  178. package/lib/routing.ts +8509 -2186
  179. package/lib/runtime.ts +1 -12
  180. package/lib/sections.ts +24 -89
  181. package/lib/setup.ts +1 -3
  182. package/lib/skills.ts +9 -4
  183. package/lib/status.ts +215 -110
  184. package/lib/sync.ts +448 -361
  185. package/lib/target.ts +22 -3
  186. package/lib/telegram-api.ts +302 -127
  187. package/lib/text-groups.ts +5 -39
  188. package/lib/thread-cleanup-manager.ts +833 -331
  189. package/lib/thread-display.ts +213 -97
  190. package/lib/thread-naming.ts +232 -87
  191. package/lib/thread-reconciler.ts +155 -72
  192. package/lib/threads.ts +5318 -1845
  193. package/lib/time-injection.ts +1 -4
  194. package/lib/turns.ts +15 -28
  195. package/lib/updates.ts +5184 -1612
  196. package/lib/voice.ts +7 -35
  197. package/lib/wire.ts +1 -1
  198. package/lib/workspace-admission.ts +996 -416
  199. package/lib/workspace-identity.ts +14 -17
  200. package/lib/workspace-retirement.ts +878 -376
  201. package/lib/workspace-slots.ts +22 -13
  202. package/package.json +1 -1
  203. package/scripts/check-downgrade.mjs +0 -472
  204. package/scripts/measure-workspace.mjs +0 -108
@@ -5,12 +5,11 @@
5
5
  */
6
6
 
7
7
  import { formatTelegramCommandEmojiPrefix } from "./commands.ts";
8
+ import { refuseUnavailableTelegramThinkingControls } from "./menu-thinking.ts";
8
9
  import {
9
- getTelegramSectionMainMenuRows,
10
- type TelegramSectionRegistry,
11
- } from "./sections.ts";
12
- import {
10
+ editTelegramMenuMessage,
13
11
  formatStatusButtonLabel,
12
+ sendTelegramMenuMessage,
14
13
  type TelegramMenuMessageRuntimeDeps,
15
14
  type TelegramMenuRenderPayload,
16
15
  type TelegramModelMenuState,
@@ -21,6 +20,10 @@ import {
21
20
  type MenuModel,
22
21
  type ThinkingLevel,
23
22
  } from "./model.ts";
23
+ import {
24
+ getTelegramSectionMainMenuRows,
25
+ type TelegramSectionRegistry,
26
+ } from "./sections.ts";
24
27
 
25
28
  export interface TelegramStatusMenuCallbackDeps {
26
29
  updateModelMenuMessage: () => Promise<void>;
@@ -60,46 +63,6 @@ function isTelegramStatusMenuCallbackAction(
60
63
  return data === `menu:${action}` || data === `status:${action}`;
61
64
  }
62
65
 
63
- function applyTelegramMenuRenderPayload(
64
- state: TelegramModelMenuState,
65
- payload: TelegramMenuRenderPayload,
66
- ): TelegramMenuRenderPayload {
67
- state.mode = payload.nextMode;
68
- return payload;
69
- }
70
-
71
- async function editTelegramMenuMessage(
72
- state: TelegramModelMenuState,
73
- payload: TelegramMenuRenderPayload,
74
- deps: TelegramMenuMessageRuntimeDeps,
75
- ): Promise<void> {
76
- const appliedPayload = applyTelegramMenuRenderPayload(state, payload);
77
- await deps.editInteractiveMessage(
78
- state.chatId,
79
- state.messageId,
80
- appliedPayload.text,
81
- appliedPayload.mode,
82
- appliedPayload.replyMarkup,
83
- );
84
- }
85
-
86
- function sendTelegramMenuMessage(
87
- state: TelegramModelMenuState,
88
- payload: TelegramMenuRenderPayload,
89
- deps: TelegramMenuMessageRuntimeDeps,
90
- ): Promise<number | undefined> {
91
- const appliedPayload = applyTelegramMenuRenderPayload(state, payload);
92
- return deps.sendInteractiveMessage(
93
- state.chatId,
94
- appliedPayload.text,
95
- appliedPayload.mode,
96
- appliedPayload.replyMarkup,
97
- state.threadId !== undefined
98
- ? { target: { chatId: state.chatId, threadId: state.threadId } }
99
- : undefined,
100
- );
101
- }
102
-
103
66
  export async function openTelegramStatusMenu<
104
67
  TModel extends MenuModel = MenuModel,
105
68
  >(deps: TelegramStatusMenuOpenDeps<TModel>): Promise<void> {
@@ -135,20 +98,14 @@ export async function handleTelegramStatusMenuCallbackAction(
135
98
  return true;
136
99
  }
137
100
  if (!isTelegramStatusMenuCallbackAction(data, "thinking")) return false;
138
- if (deps.isVoiceReplyActive?.()) {
139
- await deps.answerCallbackQuery(
140
- callbackQueryId,
141
- "Thinking controls are disabled during voice replies.",
142
- );
143
- return true;
144
- }
145
- if (!activeModel?.reasoning) {
146
- await deps.answerCallbackQuery(
101
+ if (
102
+ await refuseUnavailableTelegramThinkingControls(
147
103
  callbackQueryId,
148
- "This model has no reasoning controls.",
149
- );
104
+ activeModel,
105
+ deps,
106
+ )
107
+ )
150
108
  return true;
151
- }
152
109
  await deps.updateThinkingMenuMessage();
153
110
  await deps.answerCallbackQuery(callbackQueryId);
154
111
  return true;
@@ -189,10 +146,13 @@ export function buildStatusReplyMarkup(
189
146
  callback_data: "menu:queue",
190
147
  },
191
148
  ]);
192
- if (pendingCancellationCount > 0) rows.push([{
193
- text: `❌ Pending cancellations: ${pendingCancellationCount}`,
194
- callback_data: "reroutecancel:review:open",
195
- }]);
149
+ if (pendingCancellationCount > 0)
150
+ rows.push([
151
+ {
152
+ text: `❌ Pending cancellations: ${pendingCancellationCount}`,
153
+ callback_data: "reroutecancel:review:open",
154
+ },
155
+ ]);
196
156
  if (sectionRegistry) {
197
157
  const sectionRows = getTelegramSectionMainMenuRows(sectionRegistry);
198
158
  for (const row of sectionRows) {
@@ -4,11 +4,13 @@
4
4
  * Owns thinking-menu text, reply markup, callback handling, and thinking-menu message rendering
5
5
  */
6
6
 
7
- import type {
8
- TelegramMenuMessageRuntimeDeps,
9
- TelegramMenuRenderPayload,
10
- TelegramModelMenuState,
11
- TelegramReplyMarkup,
7
+ import {
8
+ editTelegramMenuMessage,
9
+ sendTelegramMenuMessage,
10
+ type TelegramMenuMessageRuntimeDeps,
11
+ type TelegramMenuRenderPayload,
12
+ type TelegramModelMenuState,
13
+ type TelegramReplyMarkup,
12
14
  } from "./menu-model.ts";
13
15
  import {
14
16
  isThinkingLevel,
@@ -45,72 +47,55 @@ function parseTelegramThinkingMenuCallbackAction(
45
47
  return { kind: "thinking:set", level: data.slice("thinking:set:".length) };
46
48
  }
47
49
 
48
- function applyTelegramMenuRenderPayload(
49
- state: TelegramModelMenuState,
50
- payload: TelegramMenuRenderPayload,
51
- ): TelegramMenuRenderPayload {
52
- state.mode = payload.nextMode;
53
- return payload;
54
- }
55
-
56
- async function editTelegramMenuMessage(
57
- state: TelegramModelMenuState,
58
- payload: TelegramMenuRenderPayload,
59
- deps: TelegramMenuMessageRuntimeDeps,
60
- ): Promise<void> {
61
- const appliedPayload = applyTelegramMenuRenderPayload(state, payload);
62
- await deps.editInteractiveMessage(
63
- state.chatId,
64
- state.messageId,
65
- appliedPayload.text,
66
- appliedPayload.mode,
67
- appliedPayload.replyMarkup,
68
- );
69
- }
70
-
71
- function sendTelegramMenuMessage(
72
- state: TelegramModelMenuState,
73
- payload: TelegramMenuRenderPayload,
74
- deps: TelegramMenuMessageRuntimeDeps,
75
- ): Promise<number | undefined> {
76
- const appliedPayload = applyTelegramMenuRenderPayload(state, payload);
77
- return deps.sendInteractiveMessage(
78
- state.chatId,
79
- appliedPayload.text,
80
- appliedPayload.mode,
81
- appliedPayload.replyMarkup,
82
- state.threadId !== undefined
83
- ? { target: { chatId: state.chatId, threadId: state.threadId } }
84
- : undefined,
85
- );
86
- }
87
-
88
- export async function handleTelegramThinkingMenuCallbackAction(
50
+ /** Answers and returns true when voice replies or a non-reasoning model disable thinking controls. */
51
+ export async function refuseUnavailableTelegramThinkingControls(
89
52
  callbackQueryId: string,
90
- data: string | undefined,
91
53
  activeModel: MenuModel | undefined,
92
- deps: TelegramThinkingMenuCallbackDeps,
54
+ deps: {
55
+ answerCallbackQuery: (
56
+ callbackQueryId: string,
57
+ text?: string,
58
+ ) => Promise<void>;
59
+ isVoiceReplyActive?: () => boolean;
60
+ },
93
61
  ): Promise<boolean> {
94
- const action = parseTelegramThinkingMenuCallbackAction(data);
95
- if (!action) return false;
96
- if (!isThinkingLevel(action.level)) {
97
- await deps.answerCallbackQuery(callbackQueryId, "Invalid thinking level.");
98
- return true;
99
- }
100
62
  if (deps.isVoiceReplyActive?.()) {
101
63
  await deps.answerCallbackQuery(
102
64
  callbackQueryId,
103
- "Thinking controls are disabled during voice replies.",
65
+ "Thinking controls are disabled during voice replies",
104
66
  );
105
67
  return true;
106
68
  }
107
69
  if (!activeModel?.reasoning) {
108
70
  await deps.answerCallbackQuery(
109
71
  callbackQueryId,
110
- "This model has no reasoning controls.",
72
+ "This model has no reasoning controls",
111
73
  );
112
74
  return true;
113
75
  }
76
+ return false;
77
+ }
78
+
79
+ export async function handleTelegramThinkingMenuCallbackAction(
80
+ callbackQueryId: string,
81
+ data: string | undefined,
82
+ activeModel: MenuModel | undefined,
83
+ deps: TelegramThinkingMenuCallbackDeps,
84
+ ): Promise<boolean> {
85
+ const action = parseTelegramThinkingMenuCallbackAction(data);
86
+ if (!action) return false;
87
+ if (!isThinkingLevel(action.level)) {
88
+ await deps.answerCallbackQuery(callbackQueryId, "Invalid thinking level");
89
+ return true;
90
+ }
91
+ if (
92
+ await refuseUnavailableTelegramThinkingControls(
93
+ callbackQueryId,
94
+ activeModel,
95
+ deps,
96
+ )
97
+ )
98
+ return true;
114
99
  deps.setThinkingLevel(action.level);
115
100
  await deps.updateThinkingMenuMessage();
116
101
  await deps.answerCallbackQuery(