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