@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,252 @@
1
+ /**
2
+ * Telegram bridge config and pairing helpers
3
+ * Zones: telegram config, pairing, filesystem
4
+ * Owns persisted bot/session pairing state, local config storage, live config controls, authorization policy, and first-user pairing side effects
5
+ */
6
+ export { TELEGRAM_DEFAULT_PROFILE_NAME } from "./paths.ts";
7
+ import type { CommandTemplateObjectConfig } from "./command-templates.ts";
8
+ import type { TelegramInboundHandlerConfig } from "./inbound.ts";
9
+ /** Parsed stored bot-token form: a literal secret or one environment-variable reference. */
10
+ export type TelegramBotTokenReference = {
11
+ kind: "literal";
12
+ token: string;
13
+ } | {
14
+ kind: "environment";
15
+ variable: string;
16
+ } | {
17
+ kind: "malformed";
18
+ };
19
+ /**
20
+ * Parse a persisted bot-token value. `$NAME` and `${NAME}` are exact
21
+ * environment-variable references. Any other `$`-prefixed value is malformed
22
+ * rather than a literal secret so a broken reference fails closed.
23
+ */
24
+ export declare function getTelegramBotTokenReference(value: string | undefined): TelegramBotTokenReference | undefined;
25
+ /** Resolve a persisted token at a validation/activation boundary. */
26
+ export declare function resolveTelegramBotToken(value: string | undefined, env?: NodeJS.ProcessEnv): string | undefined;
27
+ /** Redacted diagnostic for an unresolved or malformed token reference. */
28
+ export declare function getTelegramBotTokenDiagnostic(value: string | undefined, env?: NodeJS.ProcessEnv): string | undefined;
29
+ export type TelegramOutboundCommandTemplateConfig = string | CommandTemplateObjectConfig;
30
+ export interface TelegramOutboundHandlerConfig extends CommandTemplateObjectConfig {
31
+ type?: string;
32
+ match?: string | string[];
33
+ output?: string;
34
+ timeout?: number | string;
35
+ }
36
+ export type TelegramTimeMode = "hidden" | "always" | "interval";
37
+ export interface TelegramTimeConfig {
38
+ interval?: number;
39
+ }
40
+ export interface ResolvedTelegramTimeConfig {
41
+ injectionMode: TelegramTimeMode;
42
+ interval: number;
43
+ timezone: string;
44
+ }
45
+ export type TelegramThreadDisplayMode = "letters" | "names" | "directories" | "directory-snake" | "directory-title";
46
+ export declare function resolveTelegramThreadDisplayMode(config: Pick<TelegramConfig, "threadDisplayMode">): TelegramThreadDisplayMode;
47
+ export declare function setTelegramThreadDisplayMode(store: TelegramConfigStore, mode: TelegramThreadDisplayMode, isCurrent: () => boolean): Promise<void>;
48
+ export type TelegramAssistantRenderingMode = "rich" | "html";
49
+ export type TelegramActivityVerbosity = "quiet" | "thinking" | "tools" | "verbose";
50
+ export interface TelegramConfig {
51
+ /** @deprecated persisted identity belongs in profiles.default; retained for effective/legacy views */
52
+ botToken?: string;
53
+ /** @deprecated persisted identity belongs in profiles.default; retained for effective/legacy views */
54
+ botUsername?: string;
55
+ /** @deprecated persisted identity belongs in profiles.default; retained for effective/legacy views */
56
+ botId?: number;
57
+ /** @deprecated persisted identity belongs in profiles.default; retained for effective/legacy views */
58
+ allowedUserId?: number;
59
+ /** Effective view; persisted under profiles.<name>. */
60
+ threadDisplayMode?: TelegramThreadDisplayMode;
61
+ inboundHandlers?: TelegramInboundHandlerConfig[];
62
+ attachmentHandlers?: TelegramInboundHandlerConfig[];
63
+ outboundHandlers?: TelegramOutboundHandlerConfig[];
64
+ assistant?: {
65
+ draftPreviews?: boolean;
66
+ rendering?: TelegramAssistantRenderingMode;
67
+ activity?: TelegramActivityVerbosity;
68
+ timeInjection?: TelegramTimeMode;
69
+ /** @deprecated use activity */
70
+ activityVerbosity?: TelegramActivityVerbosity;
71
+ };
72
+ /** @deprecated use assistant.draftPreviews */
73
+ draftPreviews?: boolean;
74
+ /** @deprecated use assistant.draftPreviews */
75
+ richDraftPreviews?: boolean;
76
+ /** @deprecated use assistant.rendering */
77
+ assistantRendering?: TelegramAssistantRenderingMode;
78
+ voice?: {
79
+ /** `hidden` is a read-only compatibility alias for the former manual mode. */
80
+ replyMode?: "manual" | "hidden" | "mirror" | "always";
81
+ };
82
+ time?: TelegramTimeConfig;
83
+ threads?: {
84
+ /** Delete this instance's bound Telegram thread on graceful Pi quit. */
85
+ automaticCleanup?: boolean;
86
+ };
87
+ /** Canonical bot/session profiles, including profiles.default. */
88
+ profiles?: Record<string, TelegramBotProfile>;
89
+ }
90
+ /**
91
+ * Per-profile bot/session identity and Thread display preference.
92
+ * Stored under `profiles.<name>` in telegram.json.
93
+ * Shared bridge settings (inboundHandlers, outboundHandlers, voice, time,
94
+ * assistant) stay at the top level.
95
+ */
96
+ export interface TelegramBotProfile {
97
+ botToken: string;
98
+ botUsername?: string;
99
+ botId?: number;
100
+ allowedUserId?: number;
101
+ threadDisplayMode?: TelegramThreadDisplayMode;
102
+ }
103
+ export declare function isValidTelegramProfileName(name: string): boolean;
104
+ /** List defined profile names. */
105
+ export declare function getTelegramProfileNames(config: TelegramConfig): string[];
106
+ export interface TelegramConfigStore {
107
+ get: () => TelegramConfig;
108
+ getStoredConfig: () => TelegramConfig;
109
+ set: (config: TelegramConfig) => void;
110
+ setProfile: (profileName: string, profile: TelegramBotProfile) => void;
111
+ update: (mutate: (config: TelegramConfig) => void) => void;
112
+ activateProfile: (profileName: string | undefined) => boolean;
113
+ getActiveProfileName: () => string | undefined;
114
+ getBotToken: () => string | undefined;
115
+ getBotTokenDiagnostic: () => string | undefined;
116
+ hasBotToken: () => boolean;
117
+ getAllowedUserId: () => number | undefined;
118
+ getLegacyPollingCursor: () => number | undefined;
119
+ removeLegacyPollingCursor: () => void;
120
+ getInboundHandlers: () => TelegramInboundHandlerConfig[] | undefined;
121
+ getAttachmentHandlers: () => TelegramInboundHandlerConfig[] | undefined;
122
+ getOutboundHandlers: () => TelegramOutboundHandlerConfig[] | undefined;
123
+ setAllowedUserId: (userId: number) => void;
124
+ /** Publish an unpaired profile owner atomically; true only for the resulting exact owner. */
125
+ persistAllowedUserId: (userId: number, assertExecutionCurrent?: () => void, commitIfOwned?: (commit: () => void) => boolean) => Promise<boolean>;
126
+ /** Lock-only serialization for trusted synchronous source operations, not authorization.
127
+ * Does not read/adopt config. Acquire required Workspace admission first; never
128
+ * acquire owners or nest config admission here. Do not pass async callbacks:
129
+ * returned promises are not protected after their synchronous prefix.
130
+ */
131
+ withSourceSerialization: <T>(operation: () => T) => T;
132
+ /** Trusted synchronous publication only; caller acquires Workspace admission before this config transaction. */
133
+ withPairingAdmission: <T>(profileName: string, tokenSha256: string, publish: (preApprovalExcluded: boolean) => T) => T;
134
+ /** Observe an existing exact owner and refresh an unpaired cache; never create an owner. Callback must be synchronous. */
135
+ withPairedUserAdmission: <T>(profileName: string, tokenSha256: string, userId: number, publish: () => T, assertExecutionCurrent?: () => void) => {
136
+ admitted: false;
137
+ } | {
138
+ admitted: true;
139
+ value: T;
140
+ };
141
+ load: () => Promise<void>;
142
+ didLastLoadRecoverInvalidConfig: () => boolean;
143
+ persist: (config?: TelegramConfig, options?: {
144
+ isCurrent?: () => boolean;
145
+ }) => Promise<void>;
146
+ }
147
+ export declare function createTelegramConfigBotIdGetter(store: Pick<TelegramConfigStore, "get">): () => number | undefined;
148
+ export declare function createTelegramActiveProfileKeyGetter(store: Pick<TelegramConfigStore, "getActiveProfileName">): () => string;
149
+ export interface TelegramConfigStoreOptions {
150
+ initialConfig?: TelegramConfig;
151
+ agentDir?: string;
152
+ configPath?: string;
153
+ /** Environment used to resolve `$NAME` token references; defaults to process.env. */
154
+ env?: NodeJS.ProcessEnv;
155
+ recordRuntimeEvent?: (category: string, error: unknown, details?: Record<string, unknown>) => void;
156
+ }
157
+ export interface TelegramInvalidConfigRecovery {
158
+ configPath: string;
159
+ recoveryPath: string;
160
+ error: unknown;
161
+ }
162
+ export interface TelegramConfigRuntime {
163
+ updateVoiceConfig: (voice: NonNullable<TelegramConfig["voice"]>) => void;
164
+ }
165
+ export declare function setGlobalTelegramConfigRuntime(runtime: TelegramConfigRuntime | undefined): void;
166
+ export declare function updateTelegramVoiceConfig(voice: NonNullable<TelegramConfig["voice"]>): boolean;
167
+ type TelegramMutableConfigStore = Pick<TelegramConfigStore, "get" | "set" | "persist"> & {
168
+ load?: () => Promise<void>;
169
+ didLastLoadRecoverInvalidConfig?: () => boolean;
170
+ };
171
+ export declare function bindGlobalTelegramConfigRuntime(configStore: TelegramMutableConfigStore): void;
172
+ export declare function readTelegramConfig(configPath: string, options?: {
173
+ onInvalidConfig?: (recovery: TelegramInvalidConfigRecovery) => void;
174
+ }): Promise<TelegramConfig>;
175
+ export declare function writeTelegramConfig(agentDir: string, configPath: string, config: TelegramConfig): Promise<void>;
176
+ export declare function getTelegramProfileFields(config: TelegramConfig): TelegramBotProfile | undefined;
177
+ export declare function normalizeTelegramDefaultProfileConfig(config: TelegramConfig): {
178
+ config: TelegramConfig;
179
+ changed: boolean;
180
+ };
181
+ export declare function createTelegramConfigStore(options?: TelegramConfigStoreOptions): TelegramConfigStore;
182
+ export declare function createTelegramDraftPreviewsChecker(configStore: Pick<TelegramConfigStore, "get">): () => boolean;
183
+ export declare function createTelegramDraftPreviewsSetter(configStore: TelegramMutableConfigStore): (enabled: boolean) => Promise<void>;
184
+ export declare function createTelegramAssistantRenderingModeGetter(configStore: Pick<TelegramConfigStore, "get">): () => TelegramAssistantRenderingMode;
185
+ export declare function createTelegramAssistantRenderingModeSetter(configStore: TelegramMutableConfigStore): (mode: TelegramAssistantRenderingMode) => Promise<void>;
186
+ export declare function createTelegramActivityVerbosityGetter(configStore: Pick<TelegramConfigStore, "get">): () => TelegramActivityVerbosity;
187
+ export declare function createTelegramActivityVerbosityRefresher(configStore: TelegramMutableConfigStore): () => Promise<void>;
188
+ export declare function createTelegramActivityVerbositySetter(configStore: TelegramMutableConfigStore): (verbosity: TelegramActivityVerbosity) => Promise<void>;
189
+ export declare function createTelegramVoiceReplyModeGetter(configStore: Pick<TelegramConfigStore, "get">): () => "manual" | "mirror" | "always";
190
+ export declare function createTelegramVoiceReplyModeConfiguredChecker(configStore: Pick<TelegramConfigStore, "get">): () => boolean;
191
+ export declare function createTelegramVoiceReplyModeSetter(configStore: TelegramMutableConfigStore): (replyMode: "manual" | "hidden" | "mirror" | "always" | undefined) => Promise<void>;
192
+ export declare function resolveTelegramTimeConfig(raw: TelegramTimeConfig | undefined, timeInjection?: TelegramTimeMode | undefined): ResolvedTelegramTimeConfig;
193
+ export declare function createTelegramTimeConfigGetter(configStore: Pick<TelegramConfigStore, "get">): () => ResolvedTelegramTimeConfig;
194
+ export declare function createTelegramTimeInjectionModeGetter(configStore: Pick<TelegramConfigStore, "get">): () => TelegramTimeMode;
195
+ export declare function createTelegramTimeInjectionModeSetter(configStore: TelegramMutableConfigStore): (injectionMode: TelegramTimeMode) => Promise<void>;
196
+ export interface TelegramProactivePushTarget {
197
+ chatId: number;
198
+ threadId?: number;
199
+ }
200
+ export declare function createTelegramProactivePushChatIdGetter(getTarget: () => TelegramProactivePushTarget | undefined): () => number | undefined;
201
+ export declare function createTelegramProactivePushTargetGetter(deps: {
202
+ getActiveTurnTarget: () => TelegramProactivePushTarget | undefined;
203
+ getAssignedTarget: () => TelegramProactivePushTarget | undefined;
204
+ getAllowedUserId: () => number | undefined;
205
+ }): () => TelegramProactivePushTarget | undefined;
206
+ export declare function createTelegramAutomaticThreadCleanupChecker(configStore: Pick<TelegramConfigStore, "get">): () => boolean;
207
+ export declare function createTelegramAutomaticThreadCleanupResolver(configStore: TelegramMutableConfigStore): () => Promise<boolean>;
208
+ export declare function createTelegramAutomaticThreadCleanupSetter(configStore: TelegramMutableConfigStore): (enabled: boolean) => Promise<void>;
209
+ export declare function createTelegramConfigControls(configStore: TelegramMutableConfigStore): {
210
+ areDraftPreviewsEnabled: () => boolean;
211
+ setDraftPreviewsEnabled: (enabled: boolean) => Promise<void>;
212
+ getAssistantRenderingMode: () => TelegramAssistantRenderingMode;
213
+ setAssistantRenderingMode: (mode: TelegramAssistantRenderingMode) => Promise<void>;
214
+ getActivityVerbosity: () => TelegramActivityVerbosity;
215
+ refreshActivityVerbosity: () => Promise<void>;
216
+ setActivityVerbosity: (verbosity: TelegramActivityVerbosity) => Promise<void>;
217
+ getVoiceReplyMode: () => "manual" | "mirror" | "always";
218
+ isVoiceReplyModeConfigured: () => boolean;
219
+ setVoiceReplyMode: (replyMode: "manual" | "hidden" | "mirror" | "always" | undefined) => Promise<void>;
220
+ getTimeInjectionMode: () => TelegramTimeMode;
221
+ setTimeInjectionMode: (injectionMode: TelegramTimeMode) => Promise<void>;
222
+ isAutomaticThreadCleanupEnabled: () => boolean;
223
+ resolveAutomaticThreadCleanupEnabled: () => Promise<boolean>;
224
+ setAutomaticThreadCleanupEnabled: (enabled: boolean) => Promise<void>;
225
+ };
226
+ export type TelegramAuthorizationState = {
227
+ kind: "pair";
228
+ userId: number;
229
+ } | {
230
+ kind: "allow";
231
+ } | {
232
+ kind: "deny";
233
+ };
234
+ export interface TelegramUserPairingDeps<TContext> {
235
+ allowedUserId?: number;
236
+ ctx: TContext;
237
+ persistAllowedUserId: TelegramConfigStore["persistAllowedUserId"];
238
+ updateStatus: (ctx: TContext) => void;
239
+ assertExecutionCurrent?: () => void;
240
+ }
241
+ export interface TelegramUserPairingRuntimeDeps<TContext> {
242
+ getAllowedUserId: () => number | undefined;
243
+ persistAllowedUserId: TelegramConfigStore["persistAllowedUserId"];
244
+ updateStatus: (ctx: TContext) => void;
245
+ }
246
+ export interface TelegramUserPairingRuntime<TContext> {
247
+ /** True means this user is authorized, whether newly paired or already configured. */
248
+ pairIfNeeded: (userId: number, ctx: TContext, assertExecutionCurrent?: () => void) => Promise<boolean>;
249
+ }
250
+ export declare function getTelegramAuthorizationState(userId: number, allowedUserId?: number): TelegramAuthorizationState;
251
+ export declare function pairTelegramUserIfNeeded<TContext>(userId: number, deps: TelegramUserPairingDeps<TContext>): Promise<boolean>;
252
+ export declare function createTelegramUserPairingRuntime<TContext>(deps: TelegramUserPairingRuntimeDeps<TContext>): TelegramUserPairingRuntime<TContext>;