@llblab/pi-kit 0.29.1 → 0.30.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 (222) hide show
  1. package/BACKLOG.md +3 -1
  2. package/CHANGELOG.md +10 -0
  3. package/README.md +4 -4
  4. package/node_modules/@llblab/pi-state-flow/CHANGELOG.md +12 -0
  5. package/node_modules/@llblab/pi-state-flow/README.md +2 -2
  6. package/node_modules/@llblab/pi-state-flow/dist/lib/context.d.ts +2 -2
  7. package/node_modules/@llblab/pi-state-flow/dist/lib/context.js +17 -8
  8. package/node_modules/@llblab/pi-state-flow/dist/lib/extension.js +7 -3
  9. package/node_modules/@llblab/pi-state-flow/dist/lib/protocol.d.ts +2 -1
  10. package/node_modules/@llblab/pi-state-flow/dist/lib/protocol.js +3 -2
  11. package/node_modules/@llblab/pi-state-flow/dist/package.json +1 -1
  12. package/node_modules/@llblab/pi-state-flow/docs/architecture.md +3 -3
  13. package/node_modules/@llblab/pi-state-flow/docs/usage.md +3 -2
  14. package/node_modules/@llblab/pi-state-flow/lib/context.ts +17 -8
  15. package/node_modules/@llblab/pi-state-flow/lib/extension.ts +6 -3
  16. package/node_modules/@llblab/pi-state-flow/lib/protocol.ts +4 -2
  17. package/node_modules/@llblab/pi-state-flow/package.json +1 -1
  18. package/node_modules/@llblab/pi-telegram/AGENTS.md +13 -10
  19. package/node_modules/@llblab/pi-telegram/BACKLOG.md +1 -1
  20. package/node_modules/@llblab/pi-telegram/CHANGELOG.md +23 -0
  21. package/node_modules/@llblab/pi-telegram/README.md +10 -11
  22. package/node_modules/@llblab/pi-telegram/api/commands.ts +3 -0
  23. package/node_modules/@llblab/pi-telegram/dist/api/commands.d.ts +1 -1
  24. package/node_modules/@llblab/pi-telegram/dist/lib/activity-verbosity.d.ts +1 -5
  25. package/node_modules/@llblab/pi-telegram/dist/lib/activity-verbosity.js +15 -42
  26. package/node_modules/@llblab/pi-telegram/dist/lib/activity.d.ts +9 -0
  27. package/node_modules/@llblab/pi-telegram/dist/lib/activity.js +39 -10
  28. package/node_modules/@llblab/pi-telegram/dist/lib/agent-messages.js +7 -3
  29. package/node_modules/@llblab/pi-telegram/dist/lib/bindings.d.ts +43 -5
  30. package/node_modules/@llblab/pi-telegram/dist/lib/bindings.js +164 -20
  31. package/node_modules/@llblab/pi-telegram/dist/lib/bus-api.d.ts +12 -0
  32. package/node_modules/@llblab/pi-telegram/dist/lib/bus-api.js +181 -77
  33. package/node_modules/@llblab/pi-telegram/dist/lib/bus-follower.d.ts +111 -31
  34. package/node_modules/@llblab/pi-telegram/dist/lib/bus-follower.js +1324 -359
  35. package/node_modules/@llblab/pi-telegram/dist/lib/bus-leader.d.ts +41 -91
  36. package/node_modules/@llblab/pi-telegram/dist/lib/bus-leader.js +969 -637
  37. package/node_modules/@llblab/pi-telegram/dist/lib/bus-transport.js +16 -9
  38. package/node_modules/@llblab/pi-telegram/dist/lib/bus.d.ts +215 -18
  39. package/node_modules/@llblab/pi-telegram/dist/lib/bus.js +1048 -327
  40. package/node_modules/@llblab/pi-telegram/dist/lib/channel-posts.d.ts +5 -0
  41. package/node_modules/@llblab/pi-telegram/dist/lib/channel-posts.js +434 -261
  42. package/node_modules/@llblab/pi-telegram/dist/lib/command-templates.d.ts +26 -5
  43. package/node_modules/@llblab/pi-telegram/dist/lib/command-templates.js +92 -176
  44. package/node_modules/@llblab/pi-telegram/dist/lib/commands.d.ts +168 -82
  45. package/node_modules/@llblab/pi-telegram/dist/lib/commands.js +1409 -291
  46. package/node_modules/@llblab/pi-telegram/dist/lib/config.d.ts +1 -8
  47. package/node_modules/@llblab/pi-telegram/dist/lib/config.js +34 -76
  48. package/node_modules/@llblab/pi-telegram/dist/lib/delivery.d.ts +2 -2
  49. package/node_modules/@llblab/pi-telegram/dist/lib/delivery.js +16 -16
  50. package/node_modules/@llblab/pi-telegram/dist/lib/extension.js +642 -170
  51. package/node_modules/@llblab/pi-telegram/dist/lib/generative-app-worker.mjs +19 -7
  52. package/node_modules/@llblab/pi-telegram/dist/lib/generative-apps.d.ts +0 -5
  53. package/node_modules/@llblab/pi-telegram/dist/lib/generative-apps.js +61 -49
  54. package/node_modules/@llblab/pi-telegram/dist/lib/inbound.d.ts +5 -0
  55. package/node_modules/@llblab/pi-telegram/dist/lib/inbound.js +35 -59
  56. package/node_modules/@llblab/pi-telegram/dist/lib/journal.d.ts +40 -4
  57. package/node_modules/@llblab/pi-telegram/dist/lib/journal.js +2102 -760
  58. package/node_modules/@llblab/pi-telegram/dist/lib/lifecycle.d.ts +2 -6
  59. package/node_modules/@llblab/pi-telegram/dist/lib/lifecycle.js +75 -58
  60. package/node_modules/@llblab/pi-telegram/dist/lib/locks.d.ts +34 -3
  61. package/node_modules/@llblab/pi-telegram/dist/lib/locks.js +318 -119
  62. package/node_modules/@llblab/pi-telegram/dist/lib/logging.js +50 -14
  63. package/node_modules/@llblab/pi-telegram/dist/lib/media.d.ts +22 -1
  64. package/node_modules/@llblab/pi-telegram/dist/lib/media.js +46 -28
  65. package/node_modules/@llblab/pi-telegram/dist/lib/menu-model.d.ts +19 -5
  66. package/node_modules/@llblab/pi-telegram/dist/lib/menu-model.js +53 -11
  67. package/node_modules/@llblab/pi-telegram/dist/lib/menu-queue.d.ts +5 -4
  68. package/node_modules/@llblab/pi-telegram/dist/lib/menu-queue.js +45 -63
  69. package/node_modules/@llblab/pi-telegram/dist/lib/menu-settings.d.ts +5 -4
  70. package/node_modules/@llblab/pi-telegram/dist/lib/menu-settings.js +114 -78
  71. package/node_modules/@llblab/pi-telegram/dist/lib/menu-status.d.ts +1 -1
  72. package/node_modules/@llblab/pi-telegram/dist/lib/menu-status.js +8 -25
  73. package/node_modules/@llblab/pi-telegram/dist/lib/menu-thinking.d.ts +6 -1
  74. package/node_modules/@llblab/pi-telegram/dist/lib/menu-thinking.js +14 -21
  75. package/node_modules/@llblab/pi-telegram/dist/lib/menu.d.ts +8 -61
  76. package/node_modules/@llblab/pi-telegram/dist/lib/menu.js +92 -164
  77. package/node_modules/@llblab/pi-telegram/dist/lib/model.d.ts +1 -1
  78. package/node_modules/@llblab/pi-telegram/dist/lib/model.js +2 -16
  79. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-attachments.d.ts +6 -27
  80. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-attachments.js +45 -38
  81. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-buttons.js +22 -16
  82. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-markup.d.ts +0 -2
  83. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-markup.js +51 -64
  84. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-voice.js +6 -3
  85. package/node_modules/@llblab/pi-telegram/dist/lib/outbound.d.ts +6 -6
  86. package/node_modules/@llblab/pi-telegram/dist/lib/outbound.js +61 -51
  87. package/node_modules/@llblab/pi-telegram/dist/lib/ownership.js +6 -2
  88. package/node_modules/@llblab/pi-telegram/dist/lib/paths.d.ts +5 -0
  89. package/node_modules/@llblab/pi-telegram/dist/lib/paths.js +37 -21
  90. package/node_modules/@llblab/pi-telegram/dist/lib/pi.d.ts +2 -0
  91. package/node_modules/@llblab/pi-telegram/dist/lib/pi.js +8 -1
  92. package/node_modules/@llblab/pi-telegram/dist/lib/polling.d.ts +23 -37
  93. package/node_modules/@llblab/pi-telegram/dist/lib/polling.js +71 -52
  94. package/node_modules/@llblab/pi-telegram/dist/lib/preview.js +39 -19
  95. package/node_modules/@llblab/pi-telegram/dist/lib/process-identity.d.ts +24 -0
  96. package/node_modules/@llblab/pi-telegram/dist/lib/process-identity.js +133 -0
  97. package/node_modules/@llblab/pi-telegram/dist/lib/prompts.js +2 -7
  98. package/node_modules/@llblab/pi-telegram/dist/lib/queue.d.ts +16 -16
  99. package/node_modules/@llblab/pi-telegram/dist/lib/queue.js +261 -116
  100. package/node_modules/@llblab/pi-telegram/dist/lib/recovery.d.ts +2 -83
  101. package/node_modules/@llblab/pi-telegram/dist/lib/recovery.js +20 -274
  102. package/node_modules/@llblab/pi-telegram/dist/lib/replies.d.ts +16 -24
  103. package/node_modules/@llblab/pi-telegram/dist/lib/replies.js +99 -116
  104. package/node_modules/@llblab/pi-telegram/dist/lib/routing.d.ts +121 -7
  105. package/node_modules/@llblab/pi-telegram/dist/lib/routing.js +4750 -1161
  106. package/node_modules/@llblab/pi-telegram/dist/lib/runtime.d.ts +1 -11
  107. package/node_modules/@llblab/pi-telegram/dist/lib/sections.d.ts +4 -29
  108. package/node_modules/@llblab/pi-telegram/dist/lib/sections.js +7 -20
  109. package/node_modules/@llblab/pi-telegram/dist/lib/skills.js +4 -3
  110. package/node_modules/@llblab/pi-telegram/dist/lib/status.js +86 -57
  111. package/node_modules/@llblab/pi-telegram/dist/lib/sync.d.ts +6 -3
  112. package/node_modules/@llblab/pi-telegram/dist/lib/sync.js +112 -45
  113. package/node_modules/@llblab/pi-telegram/dist/lib/target.d.ts +4 -0
  114. package/node_modules/@llblab/pi-telegram/dist/lib/target.js +18 -0
  115. package/node_modules/@llblab/pi-telegram/dist/lib/telegram-api.d.ts +18 -11
  116. package/node_modules/@llblab/pi-telegram/dist/lib/telegram-api.js +165 -49
  117. package/node_modules/@llblab/pi-telegram/dist/lib/text-groups.js +4 -39
  118. package/node_modules/@llblab/pi-telegram/dist/lib/thread-cleanup-manager.d.ts +6 -27
  119. package/node_modules/@llblab/pi-telegram/dist/lib/thread-cleanup-manager.js +369 -186
  120. package/node_modules/@llblab/pi-telegram/dist/lib/thread-display.d.ts +1 -2
  121. package/node_modules/@llblab/pi-telegram/dist/lib/thread-display.js +58 -38
  122. package/node_modules/@llblab/pi-telegram/dist/lib/thread-naming.d.ts +28 -8
  123. package/node_modules/@llblab/pi-telegram/dist/lib/thread-naming.js +175 -66
  124. package/node_modules/@llblab/pi-telegram/dist/lib/thread-reconciler.d.ts +42 -16
  125. package/node_modules/@llblab/pi-telegram/dist/lib/thread-reconciler.js +90 -50
  126. package/node_modules/@llblab/pi-telegram/dist/lib/threads.d.ts +88 -24
  127. package/node_modules/@llblab/pi-telegram/dist/lib/threads.js +2276 -842
  128. package/node_modules/@llblab/pi-telegram/dist/lib/time-injection.js +1 -2
  129. package/node_modules/@llblab/pi-telegram/dist/lib/turns.js +1 -19
  130. package/node_modules/@llblab/pi-telegram/dist/lib/updates.d.ts +178 -82
  131. package/node_modules/@llblab/pi-telegram/dist/lib/updates.js +2438 -645
  132. package/node_modules/@llblab/pi-telegram/dist/lib/voice.d.ts +7 -22
  133. package/node_modules/@llblab/pi-telegram/dist/lib/voice.js +7 -22
  134. package/node_modules/@llblab/pi-telegram/dist/lib/wire.js +1 -1
  135. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-admission.d.ts +3 -1
  136. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-admission.js +425 -211
  137. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-identity.js +8 -13
  138. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-retirement.d.ts +1 -1
  139. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-retirement.js +328 -140
  140. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-slots.js +8 -4
  141. package/node_modules/@llblab/pi-telegram/dist/package.json +1 -1
  142. package/node_modules/@llblab/pi-telegram/docs/architecture.md +43 -35
  143. package/node_modules/@llblab/pi-telegram/docs/inbound.md +1 -1
  144. package/node_modules/@llblab/pi-telegram/docs/multi-instance-bus.md +15 -3
  145. package/node_modules/@llblab/pi-telegram/docs/outbound.md +1 -1
  146. package/node_modules/@llblab/pi-telegram/docs/public-api.md +29 -1
  147. package/node_modules/@llblab/pi-telegram/docs/ui-style.md +25 -8
  148. package/node_modules/@llblab/pi-telegram/lib/activity-verbosity.ts +59 -82
  149. package/node_modules/@llblab/pi-telegram/lib/activity.ts +146 -102
  150. package/node_modules/@llblab/pi-telegram/lib/agent-messages.ts +12 -5
  151. package/node_modules/@llblab/pi-telegram/lib/bindings.ts +390 -82
  152. package/node_modules/@llblab/pi-telegram/lib/bus-api.ts +262 -99
  153. package/node_modules/@llblab/pi-telegram/lib/bus-follower.ts +2440 -601
  154. package/node_modules/@llblab/pi-telegram/lib/bus-leader.ts +2209 -1290
  155. package/node_modules/@llblab/pi-telegram/lib/bus-transport.ts +46 -12
  156. package/node_modules/@llblab/pi-telegram/lib/bus.ts +1673 -444
  157. package/node_modules/@llblab/pi-telegram/lib/channel-posts.ts +848 -327
  158. package/node_modules/@llblab/pi-telegram/lib/command-templates.ts +152 -265
  159. package/node_modules/@llblab/pi-telegram/lib/commands.ts +2398 -555
  160. package/node_modules/@llblab/pi-telegram/lib/config.ts +177 -170
  161. package/node_modules/@llblab/pi-telegram/lib/delivery.ts +41 -29
  162. package/node_modules/@llblab/pi-telegram/lib/extension.ts +1209 -431
  163. package/node_modules/@llblab/pi-telegram/lib/generative-app-worker.mjs +19 -7
  164. package/node_modules/@llblab/pi-telegram/lib/generative-apps.ts +324 -211
  165. package/node_modules/@llblab/pi-telegram/lib/inbound.ts +95 -97
  166. package/node_modules/@llblab/pi-telegram/lib/journal.ts +5329 -1712
  167. package/node_modules/@llblab/pi-telegram/lib/keyboard.ts +1 -3
  168. package/node_modules/@llblab/pi-telegram/lib/lifecycle.ts +128 -78
  169. package/node_modules/@llblab/pi-telegram/lib/locks.ts +703 -212
  170. package/node_modules/@llblab/pi-telegram/lib/logging.ts +147 -58
  171. package/node_modules/@llblab/pi-telegram/lib/media.ts +82 -43
  172. package/node_modules/@llblab/pi-telegram/lib/menu-model.ts +85 -18
  173. package/node_modules/@llblab/pi-telegram/lib/menu-queue.ts +88 -129
  174. package/node_modules/@llblab/pi-telegram/lib/menu-settings.ts +260 -155
  175. package/node_modules/@llblab/pi-telegram/lib/menu-status.ts +20 -60
  176. package/node_modules/@llblab/pi-telegram/lib/menu-thinking.ts +41 -56
  177. package/node_modules/@llblab/pi-telegram/lib/menu.ts +112 -285
  178. package/node_modules/@llblab/pi-telegram/lib/model.ts +8 -22
  179. package/node_modules/@llblab/pi-telegram/lib/outbound-attachments.ts +156 -125
  180. package/node_modules/@llblab/pi-telegram/lib/outbound-buttons.ts +76 -49
  181. package/node_modules/@llblab/pi-telegram/lib/outbound-markup.ts +96 -94
  182. package/node_modules/@llblab/pi-telegram/lib/outbound-voice.ts +33 -27
  183. package/node_modules/@llblab/pi-telegram/lib/outbound.ts +125 -125
  184. package/node_modules/@llblab/pi-telegram/lib/ownership.ts +19 -10
  185. package/node_modules/@llblab/pi-telegram/lib/paths.ts +148 -49
  186. package/node_modules/@llblab/pi-telegram/lib/pi.ts +35 -15
  187. package/node_modules/@llblab/pi-telegram/lib/polling.ts +165 -149
  188. package/node_modules/@llblab/pi-telegram/lib/preview.ts +93 -40
  189. package/node_modules/@llblab/pi-telegram/lib/process-identity.ts +164 -0
  190. package/node_modules/@llblab/pi-telegram/lib/prompts.ts +4 -11
  191. package/node_modules/@llblab/pi-telegram/lib/queue.ts +523 -289
  192. package/node_modules/@llblab/pi-telegram/lib/recovery.ts +50 -454
  193. package/node_modules/@llblab/pi-telegram/lib/rendering.ts +1 -3
  194. package/node_modules/@llblab/pi-telegram/lib/replies.ts +248 -209
  195. package/node_modules/@llblab/pi-telegram/lib/routing.ts +8527 -2149
  196. package/node_modules/@llblab/pi-telegram/lib/runtime.ts +1 -12
  197. package/node_modules/@llblab/pi-telegram/lib/sections.ts +24 -89
  198. package/node_modules/@llblab/pi-telegram/lib/setup.ts +1 -3
  199. package/node_modules/@llblab/pi-telegram/lib/skills.ts +9 -4
  200. package/node_modules/@llblab/pi-telegram/lib/status.ts +215 -110
  201. package/node_modules/@llblab/pi-telegram/lib/sync.ts +488 -359
  202. package/node_modules/@llblab/pi-telegram/lib/target.ts +22 -3
  203. package/node_modules/@llblab/pi-telegram/lib/telegram-api.ts +322 -122
  204. package/node_modules/@llblab/pi-telegram/lib/text-groups.ts +5 -39
  205. package/node_modules/@llblab/pi-telegram/lib/thread-cleanup-manager.ts +833 -331
  206. package/node_modules/@llblab/pi-telegram/lib/thread-display.ts +213 -97
  207. package/node_modules/@llblab/pi-telegram/lib/thread-naming.ts +232 -87
  208. package/node_modules/@llblab/pi-telegram/lib/thread-reconciler.ts +155 -72
  209. package/node_modules/@llblab/pi-telegram/lib/threads.ts +5329 -1817
  210. package/node_modules/@llblab/pi-telegram/lib/time-injection.ts +1 -4
  211. package/node_modules/@llblab/pi-telegram/lib/turns.ts +15 -28
  212. package/node_modules/@llblab/pi-telegram/lib/updates.ts +5194 -1600
  213. package/node_modules/@llblab/pi-telegram/lib/voice.ts +7 -35
  214. package/node_modules/@llblab/pi-telegram/lib/wire.ts +1 -1
  215. package/node_modules/@llblab/pi-telegram/lib/workspace-admission.ts +996 -416
  216. package/node_modules/@llblab/pi-telegram/lib/workspace-identity.ts +14 -17
  217. package/node_modules/@llblab/pi-telegram/lib/workspace-retirement.ts +878 -376
  218. package/node_modules/@llblab/pi-telegram/lib/workspace-slots.ts +22 -13
  219. package/node_modules/@llblab/pi-telegram/package.json +1 -1
  220. package/package.json +3 -3
  221. package/node_modules/@llblab/pi-telegram/scripts/check-downgrade.mjs +0 -472
  222. package/node_modules/@llblab/pi-telegram/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(