@llblab/pi-kit 0.27.6 → 0.28.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 (182) hide show
  1. package/BACKLOG.md +2 -5
  2. package/CHANGELOG.md +5 -0
  3. package/README.md +2 -2
  4. package/node_modules/@llblab/pi-telegram/AGENTS.md +10 -8
  5. package/node_modules/@llblab/pi-telegram/BACKLOG.md +1 -9
  6. package/node_modules/@llblab/pi-telegram/CHANGELOG.md +13 -0
  7. package/node_modules/@llblab/pi-telegram/LICENSE +21 -0
  8. package/node_modules/@llblab/pi-telegram/README.md +15 -5
  9. package/node_modules/@llblab/pi-telegram/dist/lib/activity-verbosity.d.ts +1 -5
  10. package/node_modules/@llblab/pi-telegram/dist/lib/activity-verbosity.js +5 -7
  11. package/node_modules/@llblab/pi-telegram/dist/lib/bindings.d.ts +5 -1
  12. package/node_modules/@llblab/pi-telegram/dist/lib/bindings.js +6 -1
  13. package/node_modules/@llblab/pi-telegram/dist/lib/bus-api.js +4 -2
  14. package/node_modules/@llblab/pi-telegram/dist/lib/bus-follower.d.ts +54 -56
  15. package/node_modules/@llblab/pi-telegram/dist/lib/bus-follower.js +206 -139
  16. package/node_modules/@llblab/pi-telegram/dist/lib/bus-leader.d.ts +21 -2
  17. package/node_modules/@llblab/pi-telegram/dist/lib/bus-leader.js +181 -25
  18. package/node_modules/@llblab/pi-telegram/dist/lib/bus-transport.d.ts +4 -1
  19. package/node_modules/@llblab/pi-telegram/dist/lib/bus-transport.js +28 -4
  20. package/node_modules/@llblab/pi-telegram/dist/lib/bus.d.ts +52 -56
  21. package/node_modules/@llblab/pi-telegram/dist/lib/bus.js +78 -246
  22. package/node_modules/@llblab/pi-telegram/dist/lib/channel-posts.d.ts +1 -3
  23. package/node_modules/@llblab/pi-telegram/dist/lib/channel-posts.js +23 -26
  24. package/node_modules/@llblab/pi-telegram/dist/lib/command-templates.d.ts +0 -5
  25. package/node_modules/@llblab/pi-telegram/dist/lib/command-templates.js +5 -5
  26. package/node_modules/@llblab/pi-telegram/dist/lib/commands.d.ts +0 -23
  27. package/node_modules/@llblab/pi-telegram/dist/lib/commands.js +15 -15
  28. package/node_modules/@llblab/pi-telegram/dist/lib/config.d.ts +0 -17
  29. package/node_modules/@llblab/pi-telegram/dist/lib/config.js +12 -14
  30. package/node_modules/@llblab/pi-telegram/dist/lib/delivery.d.ts +0 -4
  31. package/node_modules/@llblab/pi-telegram/dist/lib/delivery.js +2 -5
  32. package/node_modules/@llblab/pi-telegram/dist/lib/extension.js +255 -61
  33. package/node_modules/@llblab/pi-telegram/dist/lib/generative-apps.d.ts +0 -19
  34. package/node_modules/@llblab/pi-telegram/dist/lib/inbound.d.ts +0 -2
  35. package/node_modules/@llblab/pi-telegram/dist/lib/inbound.js +2 -2
  36. package/node_modules/@llblab/pi-telegram/dist/lib/journal.d.ts +177 -16
  37. package/node_modules/@llblab/pi-telegram/dist/lib/journal.js +1115 -249
  38. package/node_modules/@llblab/pi-telegram/dist/lib/keyboard.d.ts +0 -2
  39. package/node_modules/@llblab/pi-telegram/dist/lib/keyboard.js +2 -2
  40. package/node_modules/@llblab/pi-telegram/dist/lib/lifecycle.js +1 -1
  41. package/node_modules/@llblab/pi-telegram/dist/lib/locks.d.ts +100 -12
  42. package/node_modules/@llblab/pi-telegram/dist/lib/locks.js +380 -14
  43. package/node_modules/@llblab/pi-telegram/dist/lib/logging.d.ts +30 -12
  44. package/node_modules/@llblab/pi-telegram/dist/lib/logging.js +129 -72
  45. package/node_modules/@llblab/pi-telegram/dist/lib/media.d.ts +28 -5
  46. package/node_modules/@llblab/pi-telegram/dist/lib/media.js +26 -8
  47. package/node_modules/@llblab/pi-telegram/dist/lib/menu-model.d.ts +0 -11
  48. package/node_modules/@llblab/pi-telegram/dist/lib/menu-model.js +8 -8
  49. package/node_modules/@llblab/pi-telegram/dist/lib/menu-settings.d.ts +0 -18
  50. package/node_modules/@llblab/pi-telegram/dist/lib/menu-settings.js +18 -18
  51. package/node_modules/@llblab/pi-telegram/dist/lib/menu-status.d.ts +4 -4
  52. package/node_modules/@llblab/pi-telegram/dist/lib/menu-status.js +12 -7
  53. package/node_modules/@llblab/pi-telegram/dist/lib/menu-thinking.d.ts +1 -1
  54. package/node_modules/@llblab/pi-telegram/dist/lib/menu-thinking.js +1 -1
  55. package/node_modules/@llblab/pi-telegram/dist/lib/menu.d.ts +1 -0
  56. package/node_modules/@llblab/pi-telegram/dist/lib/menu.js +4 -3
  57. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-attachments.d.ts +0 -1
  58. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-attachments.js +1 -1
  59. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-buttons.js +1 -8
  60. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-markup.d.ts +1 -6
  61. package/node_modules/@llblab/pi-telegram/dist/lib/outbound-markup.js +4 -21
  62. package/node_modules/@llblab/pi-telegram/dist/lib/outbound.d.ts +0 -8
  63. package/node_modules/@llblab/pi-telegram/dist/lib/outbound.js +5 -5
  64. package/node_modules/@llblab/pi-telegram/dist/lib/paths.d.ts +50 -7
  65. package/node_modules/@llblab/pi-telegram/dist/lib/paths.js +155 -17
  66. package/node_modules/@llblab/pi-telegram/dist/lib/pi.d.ts +1 -0
  67. package/node_modules/@llblab/pi-telegram/dist/lib/pi.js +2 -1
  68. package/node_modules/@llblab/pi-telegram/dist/lib/polling.d.ts +0 -5
  69. package/node_modules/@llblab/pi-telegram/dist/lib/polling.js +5 -5
  70. package/node_modules/@llblab/pi-telegram/dist/lib/preview.d.ts +0 -3
  71. package/node_modules/@llblab/pi-telegram/dist/lib/preview.js +3 -3
  72. package/node_modules/@llblab/pi-telegram/dist/lib/prompt-templates.d.ts +0 -1
  73. package/node_modules/@llblab/pi-telegram/dist/lib/prompt-templates.js +1 -1
  74. package/node_modules/@llblab/pi-telegram/dist/lib/queue.d.ts +3 -15
  75. package/node_modules/@llblab/pi-telegram/dist/lib/queue.js +69 -8
  76. package/node_modules/@llblab/pi-telegram/dist/lib/recovery.d.ts +29 -9
  77. package/node_modules/@llblab/pi-telegram/dist/lib/recovery.js +104 -33
  78. package/node_modules/@llblab/pi-telegram/dist/lib/replies.d.ts +0 -4
  79. package/node_modules/@llblab/pi-telegram/dist/lib/replies.js +1 -1
  80. package/node_modules/@llblab/pi-telegram/dist/lib/routing.d.ts +73 -8
  81. package/node_modules/@llblab/pi-telegram/dist/lib/routing.js +2206 -307
  82. package/node_modules/@llblab/pi-telegram/dist/lib/sections.d.ts +0 -2
  83. package/node_modules/@llblab/pi-telegram/dist/lib/sections.js +1 -1
  84. package/node_modules/@llblab/pi-telegram/dist/lib/status.d.ts +44 -9
  85. package/node_modules/@llblab/pi-telegram/dist/lib/status.js +149 -27
  86. package/node_modules/@llblab/pi-telegram/dist/lib/sync.d.ts +0 -5
  87. package/node_modules/@llblab/pi-telegram/dist/lib/sync.js +5 -4
  88. package/node_modules/@llblab/pi-telegram/dist/lib/telegram-api.d.ts +11 -3
  89. package/node_modules/@llblab/pi-telegram/dist/lib/telegram-api.js +34 -23
  90. package/node_modules/@llblab/pi-telegram/dist/lib/thread-cleanup-manager.d.ts +1 -0
  91. package/node_modules/@llblab/pi-telegram/dist/lib/thread-cleanup-manager.js +18 -21
  92. package/node_modules/@llblab/pi-telegram/dist/lib/thread-naming.d.ts +32 -5
  93. package/node_modules/@llblab/pi-telegram/dist/lib/thread-naming.js +191 -7
  94. package/node_modules/@llblab/pi-telegram/dist/lib/thread-reconciler.d.ts +2 -0
  95. package/node_modules/@llblab/pi-telegram/dist/lib/thread-reconciler.js +1 -1
  96. package/node_modules/@llblab/pi-telegram/dist/lib/threads.d.ts +291 -59
  97. package/node_modules/@llblab/pi-telegram/dist/lib/threads.js +1647 -369
  98. package/node_modules/@llblab/pi-telegram/dist/lib/turns.d.ts +0 -1
  99. package/node_modules/@llblab/pi-telegram/dist/lib/turns.js +1 -1
  100. package/node_modules/@llblab/pi-telegram/dist/lib/updates.d.ts +184 -28
  101. package/node_modules/@llblab/pi-telegram/dist/lib/updates.js +1032 -114
  102. package/node_modules/@llblab/pi-telegram/dist/lib/wire.d.ts +12 -0
  103. package/node_modules/@llblab/pi-telegram/dist/lib/wire.js +21 -0
  104. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-admission.d.ts +25 -17
  105. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-admission.js +95 -20
  106. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-identity.d.ts +20 -0
  107. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-identity.js +103 -0
  108. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-retirement.d.ts +43 -8
  109. package/node_modules/@llblab/pi-telegram/dist/lib/workspace-retirement.js +148 -52
  110. package/node_modules/@llblab/pi-telegram/dist/package.json +6 -6
  111. package/node_modules/@llblab/pi-telegram/dist/skills/generated-control-surface/SKILL.md +3 -3
  112. package/node_modules/@llblab/pi-telegram/dist/skills/telegram-bridge/references/diagnosis.md +3 -3
  113. package/node_modules/@llblab/pi-telegram/docs/README.md +1 -1
  114. package/node_modules/@llblab/pi-telegram/docs/activity.md +1 -1
  115. package/node_modules/@llblab/pi-telegram/docs/architecture.md +152 -34
  116. package/node_modules/@llblab/pi-telegram/docs/callback-namespaces.md +1 -1
  117. package/node_modules/@llblab/pi-telegram/docs/delivery.md +1 -1
  118. package/node_modules/@llblab/pi-telegram/docs/generative-apps.md +2 -2
  119. package/node_modules/@llblab/pi-telegram/docs/inbound.md +1 -1
  120. package/node_modules/@llblab/pi-telegram/docs/multi-instance-bus.md +125 -19
  121. package/node_modules/@llblab/pi-telegram/docs/public-api.md +3 -1
  122. package/node_modules/@llblab/pi-telegram/docs/ui-style.md +22 -8
  123. package/node_modules/@llblab/pi-telegram/docs/updates.md +1 -1
  124. package/node_modules/@llblab/pi-telegram/lib/activity-verbosity.ts +5 -9
  125. package/node_modules/@llblab/pi-telegram/lib/bindings.ts +6 -0
  126. package/node_modules/@llblab/pi-telegram/lib/bus-api.ts +5 -2
  127. package/node_modules/@llblab/pi-telegram/lib/bus-follower.ts +243 -224
  128. package/node_modules/@llblab/pi-telegram/lib/bus-leader.ts +178 -31
  129. package/node_modules/@llblab/pi-telegram/lib/bus-transport.ts +30 -8
  130. package/node_modules/@llblab/pi-telegram/lib/bus.ts +110 -334
  131. package/node_modules/@llblab/pi-telegram/lib/channel-posts.ts +29 -29
  132. package/node_modules/@llblab/pi-telegram/lib/command-templates.ts +5 -5
  133. package/node_modules/@llblab/pi-telegram/lib/commands.ts +15 -15
  134. package/node_modules/@llblab/pi-telegram/lib/config.ts +12 -17
  135. package/node_modules/@llblab/pi-telegram/lib/delivery.ts +2 -8
  136. package/node_modules/@llblab/pi-telegram/lib/extension.ts +257 -72
  137. package/node_modules/@llblab/pi-telegram/lib/generative-apps.ts +0 -22
  138. package/node_modules/@llblab/pi-telegram/lib/inbound.ts +2 -2
  139. package/node_modules/@llblab/pi-telegram/lib/journal.ts +1182 -326
  140. package/node_modules/@llblab/pi-telegram/lib/keyboard.ts +2 -2
  141. package/node_modules/@llblab/pi-telegram/lib/lifecycle.ts +1 -1
  142. package/node_modules/@llblab/pi-telegram/lib/locks.ts +402 -23
  143. package/node_modules/@llblab/pi-telegram/lib/logging.ts +151 -101
  144. package/node_modules/@llblab/pi-telegram/lib/media.ts +51 -9
  145. package/node_modules/@llblab/pi-telegram/lib/menu-model.ts +8 -8
  146. package/node_modules/@llblab/pi-telegram/lib/menu-settings.ts +18 -18
  147. package/node_modules/@llblab/pi-telegram/lib/menu-status.ts +11 -0
  148. package/node_modules/@llblab/pi-telegram/lib/menu-thinking.ts +2 -2
  149. package/node_modules/@llblab/pi-telegram/lib/menu.ts +5 -1
  150. package/node_modules/@llblab/pi-telegram/lib/outbound-attachments.ts +1 -1
  151. package/node_modules/@llblab/pi-telegram/lib/outbound-buttons.ts +1 -10
  152. package/node_modules/@llblab/pi-telegram/lib/outbound-markup.ts +5 -24
  153. package/node_modules/@llblab/pi-telegram/lib/outbound.ts +5 -5
  154. package/node_modules/@llblab/pi-telegram/lib/paths.ts +177 -17
  155. package/node_modules/@llblab/pi-telegram/lib/pi.ts +5 -2
  156. package/node_modules/@llblab/pi-telegram/lib/polling.ts +5 -5
  157. package/node_modules/@llblab/pi-telegram/lib/preview.ts +3 -3
  158. package/node_modules/@llblab/pi-telegram/lib/prompt-templates.ts +1 -1
  159. package/node_modules/@llblab/pi-telegram/lib/queue.ts +67 -9
  160. package/node_modules/@llblab/pi-telegram/lib/recovery.ts +104 -44
  161. package/node_modules/@llblab/pi-telegram/lib/replies.ts +1 -1
  162. package/node_modules/@llblab/pi-telegram/lib/routing.ts +1955 -375
  163. package/node_modules/@llblab/pi-telegram/lib/sections.ts +1 -1
  164. package/node_modules/@llblab/pi-telegram/lib/status.ts +156 -36
  165. package/node_modules/@llblab/pi-telegram/lib/sync.ts +4 -4
  166. package/node_modules/@llblab/pi-telegram/lib/telegram-api.ts +48 -33
  167. package/node_modules/@llblab/pi-telegram/lib/thread-cleanup-manager.ts +24 -21
  168. package/node_modules/@llblab/pi-telegram/lib/thread-naming.ts +267 -9
  169. package/node_modules/@llblab/pi-telegram/lib/thread-reconciler.ts +3 -1
  170. package/node_modules/@llblab/pi-telegram/lib/threads.ts +1697 -488
  171. package/node_modules/@llblab/pi-telegram/lib/turns.ts +1 -1
  172. package/node_modules/@llblab/pi-telegram/lib/updates.ts +1072 -151
  173. package/node_modules/@llblab/pi-telegram/lib/wire.ts +28 -0
  174. package/node_modules/@llblab/pi-telegram/lib/workspace-admission.ts +97 -47
  175. package/node_modules/@llblab/pi-telegram/lib/workspace-identity.ts +147 -0
  176. package/node_modules/@llblab/pi-telegram/lib/workspace-retirement.ts +188 -89
  177. package/node_modules/@llblab/pi-telegram/package.json +6 -6
  178. package/node_modules/@llblab/pi-telegram/scripts/audit-exports.mjs +100 -0
  179. package/node_modules/@llblab/pi-telegram/scripts/check-downgrade.mjs +80 -43
  180. package/node_modules/@llblab/pi-telegram/skills/generated-control-surface/SKILL.md +3 -3
  181. package/node_modules/@llblab/pi-telegram/skills/telegram-bridge/references/diagnosis.md +3 -3
  182. package/package.json +2 -2
@@ -1,37 +1,17 @@
1
1
  /**
2
2
  * Telegram thread binding helpers
3
- * Zones: multi-instance bus, Telegram UI threads, volatile extension state
4
- * Owns current live instance-binding to Telegram UI thread mappings backed by Bot API ForumTopic/message_thread_id transport
3
+ * Zones: multi-instance bus, Telegram UI threads, durable Workspace state
4
+ * Owns live mappings, Workspace bindings and guarded Restore transitions; routing and transport effects stay outside.
5
5
  */
6
6
  import { type TelegramApiCallOptions } from "./telegram-api.ts";
7
- import type { TelegramTarget } from "./target.ts";
7
+ import { type TelegramTarget } from "./target.ts";
8
+ export { chooseTelegramThreadName, createTelegramThreadName, getTelegramManualThreadDisplayNameValidationError, getTelegramTopicIdentityName, getTelegramTopicThreadNameValidationError, getTelegramTopicTitleForThreadName, isTelegramTopicThreadNameValidForSlot, type TelegramThreadNameInput, } from "./thread-naming.ts";
9
+ export declare const getTelegramTopicName: (request: TelegramTopicTargetProvisionRequest, template?: string, slot?: string) => string;
10
+ import { type TelegramWorkspaceBindingIdentity } from "./workspace-identity.ts";
11
+ export { createTelegramWorkspaceBindingIdentity, createTelegramWorkspaceDirectoryKey, normalizeTelegramSessionId, normalizeTelegramWorkspacePath, type TelegramWorkspaceBindingIdentity, } from "./workspace-identity.ts";
12
+ import { type TelegramLockRuntime, type TelegramLockContext, type TelegramRuntimeStateMutation, type TelegramOwnedStatePublicationOptions, type TelegramOwnedStatePublicationResult } from "./locks.ts";
8
13
  import * as ThreadReconciler from "./thread-reconciler.ts";
9
14
  import { type TelegramWorkspaceSlotOccupancy } from "./workspace-slots.ts";
10
- export interface TelegramThreadNameInput {
11
- seed: string;
12
- cwd?: string;
13
- role?: "leader" | "follower";
14
- peers?: readonly string[];
15
- slot?: string;
16
- }
17
- export interface TelegramWorkspaceBindingIdentity {
18
- cwd: string;
19
- workspaceKey: string;
20
- /** Exact durable Pi session identity; absent only on legacy cwd-only bindings. */
21
- sessionId?: string;
22
- /** Full SHA-256 index component for session-qualified bindings. */
23
- sessionKey?: string;
24
- /** Immutable legacy binding-key component, not the displayed global letter. */
25
- instanceSlot: string;
26
- bindingKey: string;
27
- /** Profile-wide letter reserved by the transient claim. */
28
- slot?: string;
29
- }
30
- export declare function normalizeTelegramSessionId(sessionId: string): string | undefined;
31
- export declare function createTelegramSessionKey(sessionId: string): string | undefined;
32
- export declare function normalizeTelegramWorkspacePath(cwd: string): string | undefined;
33
- export declare function createTelegramWorkspaceDirectoryKey(cwd: string): string | undefined;
34
- export declare function createTelegramWorkspaceBindingIdentity(cwd: string, ordinal?: number, sessionId?: string): TelegramWorkspaceBindingIdentity | undefined;
35
15
  export type TelegramTopicTargetStatus = "active" | "offline" | "stale" | "pending" | "starting" | "probe-required" | "failed";
36
16
  export type TelegramTopicSyncStatus = "open" | "closed" | "deleted" | "unknown";
37
17
  export type TelegramThreadOwner = {
@@ -81,6 +61,14 @@ export interface TelegramThreadPendingProvision {
81
61
  leaderEpoch?: number | string;
82
62
  }
83
63
  export type TelegramThreadCleanupIntent = ThreadReconciler.TelegramThreadCleanupIntent;
64
+ export type TelegramProvisionRecoveryFile = Record<string, {
65
+ instanceId: string;
66
+ profileKey?: string;
67
+ leaderEpoch?: number | string;
68
+ target: TelegramTarget & {
69
+ threadId: number;
70
+ };
71
+ }>;
84
72
  export interface TelegramTopicSyncObservation {
85
73
  target: TelegramTarget & {
86
74
  threadId: number;
@@ -121,6 +109,10 @@ export interface TelegramThreadIdentityRecord {
121
109
  slot?: string;
122
110
  updatedAtMs: number;
123
111
  }
112
+ export interface TelegramWorkspaceJournalSource {
113
+ sessionId: string;
114
+ recipientBindingKey: string;
115
+ }
124
116
  export interface TelegramWorkspaceThreadBinding {
125
117
  cwd: string;
126
118
  workspaceKey: string;
@@ -142,6 +134,8 @@ export interface TelegramWorkspaceThreadBinding {
142
134
  displayTitle?: string;
143
135
  /** Historical follower-journal routing keys that may retain accepted work. */
144
136
  journalBindingKeys?: string[];
137
+ /** Exact session-qualified journal addresses; retained across session re-key. */
138
+ journalSources?: TelegramWorkspaceJournalSource[];
145
139
  /** True only when the historical journal-key set is proven complete. */
146
140
  journalBindingsComplete?: true;
147
141
  /** Sticky once this directory has multiple retained bindings. */
@@ -176,6 +170,221 @@ export interface TelegramBotStateSnapshot {
176
170
  lastSlot?: string;
177
171
  lastReconcileAction?: string;
178
172
  }
173
+ export interface TelegramWorkspaceRelocationRequest {
174
+ operationId: string;
175
+ binding: TelegramWorkspaceThreadBinding;
176
+ owner: TelegramTopicTargetRecord;
177
+ target: TelegramTarget & {
178
+ threadId: number;
179
+ };
180
+ }
181
+ export interface TelegramWorkspaceRestoreRequest extends TelegramWorkspaceRelocationRequest {
182
+ source: {
183
+ journalBindingKey: string;
184
+ updateIds: number[];
185
+ };
186
+ }
187
+ export interface TelegramWorkspaceRestoreExecutor {
188
+ instanceId: string;
189
+ leaderEpoch: string;
190
+ }
191
+ export interface TelegramWorkspaceRestoreAuthority {
192
+ executor: TelegramWorkspaceRestoreExecutor;
193
+ operatorUserId: number;
194
+ /** Exact profile, transport, session, source and Workspace-admission authority. */
195
+ isCurrent: () => boolean;
196
+ }
197
+ export type TelegramWorkspaceRestoreRecipient = {
198
+ kind: "leader" | "follower";
199
+ instanceId: string;
200
+ sessionId: string;
201
+ generation: string;
202
+ };
203
+ /** Retained queue admission is nonterminal; queue-completed requires positive journal-owner disposition. */
204
+ export type TelegramWorkspaceRestoreSourceSettlement = {
205
+ journalBindingKey: string;
206
+ updateIds: number[];
207
+ } & ({
208
+ kind: "completed";
209
+ } | {
210
+ kind: "queued" | "queue-completed";
211
+ receiptId: string;
212
+ queueKind: "prompt" | "control";
213
+ });
214
+ /** Positive execution/recipient acceptance, retained before source disposition; never a source-removal ACK. */
215
+ export type TelegramWorkspaceRestoreSourceAcceptance = {
216
+ journalBindingKey: string;
217
+ updateId: number;
218
+ /** SHA-256 of the exact journal entry captured by its worker owner, not a routed message projection. */
219
+ sourceSha256: string;
220
+ recipient: TelegramWorkspaceRestoreRecipient;
221
+ } & ({
222
+ kind: "completed";
223
+ } | {
224
+ kind: "forwarded";
225
+ deliveryId: string;
226
+ recipientBindingKey: string;
227
+ } | {
228
+ kind: "queued";
229
+ receiptId: string;
230
+ queueKind: "prompt" | "control";
231
+ queueOwnerSha256: string;
232
+ });
233
+ export interface TelegramWorkspaceRestoreIntent {
234
+ request: TelegramWorkspaceRestoreRequest;
235
+ operatorUserId: number;
236
+ executor: TelegramWorkspaceRestoreExecutor;
237
+ revision: number;
238
+ createdAtMs: number;
239
+ updatedAtMs: number;
240
+ phase: "relocated" | "recipient-issued" | "ready";
241
+ committedAtMs: number;
242
+ recipient?: TelegramWorkspaceRestoreRecipient;
243
+ readyRecipient?: TelegramWorkspaceRestoreRecipient;
244
+ routing?: {
245
+ acceptances?: TelegramWorkspaceRestoreSourceAcceptance[];
246
+ settlements: TelegramWorkspaceRestoreSourceSettlement[];
247
+ cleanup?: "issued" | "completed" | "not-issued";
248
+ };
249
+ }
250
+ /** Immutable source membership, not readiness, cancellation, or proof of complete Thread coverage. */
251
+ export interface TelegramTemporaryThreadInput {
252
+ journalBindingKey: string;
253
+ updateIds: number[];
254
+ }
255
+ /** A strict journal observation of committed cancellation plus matching private retention. */
256
+ export interface TelegramTemporaryThreadCancellationEvidence {
257
+ journalBindingKey: string;
258
+ updateId: number;
259
+ operatorAuthorityId: string;
260
+ }
261
+ /** A bot-created routing tab with an exact creation source; it owns no Pi binding or slot. */
262
+ export interface TelegramTemporaryThreadEntry {
263
+ source: {
264
+ journalBindingKey: string;
265
+ updateId: number;
266
+ };
267
+ /** Append-only known source groups. Missing legacy metadata never proves that the creation source was alone. */
268
+ inputs?: TelegramTemporaryThreadInput[];
269
+ /** Whole known groups with positively observed cancellation; never proof that deletion may be issued. */
270
+ cancelledInputs?: TelegramTemporaryThreadInput[];
271
+ /** Whole known groups whose Forward was positively completed by the journal owner; never deletion authority alone. */
272
+ completedInputs?: TelegramTemporaryThreadInput[];
273
+ /** Whole known groups whose Forward was durably issued before local handling/queueing or follower RPC; never delivery proof or a retry grant. */
274
+ forwardedInputs?: TelegramTemporaryThreadInput[];
275
+ /** Published at creation only: every subsequent Forward path must record issuance; missing legacy coverage stays unknown. */
276
+ forwardProtocol?: "one-shot-v1";
277
+ /** Published before the sole cleanup attempt; uncertainty survives executor adoption and restart. */
278
+ cleanupIssued?: true;
279
+ operatorUserId: number;
280
+ executor: TelegramWorkspaceRestoreExecutor;
281
+ /** Unique title token; the only identity an unacknowledged creation may later be matched by. */
282
+ token: string;
283
+ /** `creating` is published before the one creation request, so after a crash its outcome is unknown. */
284
+ phase: "creating" | "created";
285
+ target?: TelegramTarget & {
286
+ threadId: number;
287
+ };
288
+ revision: number;
289
+ createdAtMs: number;
290
+ updatedAtMs: number;
291
+ }
292
+ /** Canonical target classification only; a bound target still needs live same-session readiness proof. */
293
+ export type TelegramTemporaryThreadTargetObservation = {
294
+ kind: "bound";
295
+ binding: TelegramWorkspaceThreadBinding;
296
+ } | {
297
+ kind: "temporary";
298
+ } | {
299
+ kind: "unknown";
300
+ };
301
+ interface TelegramWorkspaceRestoreSnapshot {
302
+ version: 1;
303
+ profileName: string;
304
+ tokenSha256: string;
305
+ revision: number;
306
+ operations: TelegramWorkspaceRestoreIntent[];
307
+ temporaryThreads?: TelegramTemporaryThreadEntry[];
308
+ }
309
+ /** Scope-bound Workspace operations; raw snapshot mutation is private to the store. */
310
+ export interface TelegramWorkspaceRestore {
311
+ list(): TelegramWorkspaceRestoreIntent[];
312
+ commit(request: TelegramWorkspaceRestoreRequest, authority: TelegramWorkspaceRestoreAuthority): Promise<TelegramWorkspaceRestoreIntent | undefined>;
313
+ adopt(expected: TelegramWorkspaceRestoreIntent, authority: TelegramWorkspaceRestoreAuthority): TelegramWorkspaceRestoreIntent | undefined;
314
+ issueRecipient(expected: TelegramWorkspaceRestoreIntent, recipient: TelegramWorkspaceRestoreRecipient, authority: TelegramWorkspaceRestoreAuthority): {
315
+ issued: true;
316
+ intent: TelegramWorkspaceRestoreIntent;
317
+ } | undefined;
318
+ confirmReady(expected: TelegramWorkspaceRestoreIntent, acknowledged: TelegramWorkspaceRestoreRecipient, authority: TelegramWorkspaceRestoreAuthority): TelegramWorkspaceRestoreIntent | undefined;
319
+ confirmInspectedReady(expected: TelegramWorkspaceRestoreIntent, observed: TelegramWorkspaceRestoreRecipient, authority: TelegramWorkspaceRestoreAuthority): TelegramWorkspaceRestoreIntent | undefined;
320
+ issueRouting(expected: TelegramWorkspaceRestoreIntent, authority: TelegramWorkspaceRestoreAuthority): {
321
+ issued: true;
322
+ intent: TelegramWorkspaceRestoreIntent;
323
+ } | undefined;
324
+ recordSourceAcceptance(expected: TelegramWorkspaceRestoreIntent, evidence: TelegramWorkspaceRestoreSourceAcceptance, authority: TelegramWorkspaceRestoreAuthority): TelegramWorkspaceRestoreIntent | undefined;
325
+ recordSourceSettlement(expected: TelegramWorkspaceRestoreIntent, evidence: TelegramWorkspaceRestoreSourceSettlement, authority: TelegramWorkspaceRestoreAuthority): TelegramWorkspaceRestoreIntent | undefined;
326
+ issueCleanup(expected: TelegramWorkspaceRestoreIntent, authority: TelegramWorkspaceRestoreAuthority): {
327
+ issued: true;
328
+ intent: TelegramWorkspaceRestoreIntent;
329
+ } | undefined;
330
+ recordCleanup(expected: TelegramWorkspaceRestoreIntent, result: {
331
+ target: TelegramWorkspaceRestoreRequest["target"];
332
+ kind: "completed" | "not-issued";
333
+ }, authority: TelegramWorkspaceRestoreAuthority): TelegramWorkspaceRestoreIntent | undefined;
334
+ retire(expected: TelegramWorkspaceRestoreIntent, authority: TelegramWorkspaceRestoreAuthority): TelegramWorkspaceRestoreIntent | undefined;
335
+ /** Caller proves exact operator abandonment of every original; no dispatch grant may exist. */
336
+ retireAbandoned(expected: TelegramWorkspaceRestoreIntent, abandonedUpdateIds: readonly number[], authority: TelegramWorkspaceRestoreAuthority): TelegramWorkspaceRestoreIntent | undefined;
337
+ listTemporaryThreads(): TelegramTemporaryThreadEntry[];
338
+ /** Caller holds admission for effectful use. Fresh exact read grants no adoption, routing, disposition or deletion. */
339
+ inspectTemporaryThreadTarget(expected: TelegramTemporaryThreadEntry, authority: TelegramWorkspaceRestoreAuthority): TelegramTemporaryThreadTargetObservation | undefined;
340
+ /** Read-only veto for an already-granted in-flight attempt; never another grant, disposable classification or deletion ACK. */
341
+ isTemporaryThreadCleanupCurrent(expected: TelegramTemporaryThreadEntry, authority: TelegramWorkspaceRestoreAuthority): boolean;
342
+ /** Publishes `creating` before the caller's single creation request; an existing source entry is returned, never recreated. */
343
+ reserveTemporaryThread(source: TelegramTemporaryThreadEntry["source"], token: string, authority: TelegramWorkspaceRestoreAuthority): {
344
+ reserved: boolean;
345
+ entry: TelegramTemporaryThreadEntry;
346
+ } | undefined;
347
+ /** Caller proves a fresh owner-authenticated implicit Telegram creation and exact live source under profile admission.
348
+ * Registers that observed unbound target without issuing or fabricating a Bot API creation. */
349
+ registerImplicitTemporaryThread(input: TelegramTemporaryThreadInput, target: TelegramTarget & {
350
+ threadId: number;
351
+ }, token: string, authority: TelegramWorkspaceRestoreAuthority): TelegramTemporaryThreadEntry | undefined;
352
+ /** Records the exact acknowledged creation target; it never reopens a created entry. */
353
+ acknowledgeTemporaryThread(expected: TelegramTemporaryThreadEntry, target: TelegramTarget & {
354
+ threadId: number;
355
+ }, authority: TelegramWorkspaceRestoreAuthority): TelegramTemporaryThreadEntry | undefined;
356
+ adoptTemporaryThread(expected: TelegramTemporaryThreadEntry, authority: TelegramWorkspaceRestoreAuthority): TelegramTemporaryThreadEntry | undefined;
357
+ /** Caller supplies exact live source/group authority; duplicate membership is read-only, never a new dispatch grant. */
358
+ recordTemporaryThreadInput(expected: TelegramTemporaryThreadEntry, input: TelegramTemporaryThreadInput, authority: TelegramWorkspaceRestoreAuthority): TelegramTemporaryThreadEntry | undefined;
359
+ /** Records a positively completed Forward group; the caller proves every source of the group completed. */
360
+ /** Publishes the one-time Forward issuance fact before any RPC; a duplicate, cancelled, completed or Restore-owned group is refused. */
361
+ recordTemporaryThreadForwardIssued(expected: TelegramTemporaryThreadEntry, input: TelegramTemporaryThreadInput, authority: TelegramWorkspaceRestoreAuthority): TelegramTemporaryThreadEntry | undefined;
362
+ recordTemporaryThreadInputCompletion(expected: TelegramTemporaryThreadEntry, input: TelegramTemporaryThreadInput, authority: TelegramWorkspaceRestoreAuthority): TelegramTemporaryThreadEntry | undefined;
363
+ recordTemporaryThreadInputCancellation(expected: TelegramTemporaryThreadEntry, input: TelegramTemporaryThreadInput, authority: TelegramWorkspaceRestoreAuthority, inspect: (updateId: number) => TelegramTemporaryThreadCancellationEvidence | undefined): TelegramTemporaryThreadEntry | undefined;
364
+ /** Caller holds profile admission and proves fresh source/protection clearance; publication grants one attempt, never retry. */
365
+ issueTemporaryThreadCleanup(expected: TelegramTemporaryThreadEntry, authority: TelegramWorkspaceRestoreAuthority): {
366
+ issued: true;
367
+ entry: TelegramTemporaryThreadEntry;
368
+ } | undefined;
369
+ /** Caller proves source settlement or cancellation and target disposition; this releases protection only. */
370
+ /** `completed` names one newly completed group; every other known group must already be cancelled or completed. */
371
+ retireTemporaryThread(expected: TelegramTemporaryThreadEntry, authority: TelegramWorkspaceRestoreAuthority, completed?: TelegramTemporaryThreadInput): TelegramTemporaryThreadEntry | undefined;
372
+ /** New-world restart: atomically forgets this operator's Restore intents and temporary entries from previous runtime instances.
373
+ * Committed bindings stay; nothing is rolled back, replayed or deleted here. */
374
+ forgetPreviousWorld(authority: TelegramWorkspaceRestoreAuthority): {
375
+ operations: TelegramWorkspaceRestoreIntent[];
376
+ temporaryThreads: TelegramTemporaryThreadEntry[];
377
+ } | undefined;
378
+ }
379
+ export interface TelegramWorkspaceRestoreOptions {
380
+ profileName: string;
381
+ tokenSha256: string;
382
+ isCurrentScope?: () => boolean;
383
+ maxBytes?: number;
384
+ getNowMs?: () => number;
385
+ legacyPath?: string;
386
+ onPublicationBoundary?: (boundary: "after-write-before-rename" | "after-rename") => void;
387
+ }
179
388
  export interface TelegramSessionReplacementIntent {
180
389
  continuity: "workspace-thread" | "classic-chat";
181
390
  cwd: string;
@@ -200,13 +409,11 @@ export interface TelegramTopicTargetFile {
200
409
  source: "snapshot";
201
410
  writtenAtMs: number;
202
411
  bot: TelegramBotStateSnapshot;
203
- runtime?: Record<string, unknown>;
204
- liveRoster?: Record<string, unknown>;
205
- diagnostics?: Record<string, unknown>;
206
412
  threads: TelegramTopicTargetRecord[];
207
413
  identities?: TelegramThreadIdentityRecord[];
208
414
  workspaceBindings?: TelegramWorkspaceThreadBinding[];
209
415
  workspaceRetirements?: TelegramWorkspaceRetirementIntent[];
416
+ workspaceRestore?: TelegramWorkspaceRestoreSnapshot;
210
417
  sessionReplacement?: TelegramSessionReplacementIntent;
211
418
  reservations?: TelegramThreadReservation[];
212
419
  pendingProvisions?: TelegramThreadPendingProvision[];
@@ -221,6 +428,20 @@ export interface TelegramTopicTargetStore {
221
428
  invalidateTarget: (target: TelegramTarget, isCurrent: () => boolean, lastSyncError: string) => Promise<boolean>;
222
429
  /** Caller proves owner detachment; this does not assert Telegram Thread absence. */
223
430
  detachTargetOwner: (expected: TelegramTopicTargetRecord, isCurrent: () => boolean) => Promise<boolean>;
431
+ /** Caller holds Workspace admission; publication uses this store's exact transport-owner fence. */
432
+ workspaceRestore: (options: TelegramWorkspaceRestoreOptions) => TelegramWorkspaceRestore;
433
+ /** Read-only precondition under caller-owned admission; not registration or transport authority. */
434
+ assertWorkspaceRestoreRegistration: (candidate: {
435
+ target: TelegramTarget;
436
+ bindingKey?: string;
437
+ slot?: string;
438
+ }) => void;
439
+ /** Runs synchronous live publication under the same evidence transaction; caller retains authentication/admission. */
440
+ commitWorkspaceRestoreRegistration: (candidate: Parameters<TelegramTopicTargetStore["assertWorkspaceRestoreRegistration"]>[0], publish: () => void) => void;
441
+ /** Read-only canonical observation; the callback must finish synchronously under the snapshot transaction. */
442
+ withWorkspaceRestoreSnapshot: (expected: TelegramWorkspaceRestoreIntent, observe: (snapshot: Readonly<Pick<TelegramTopicTargetFile, "threads" | "workspaceBindings">>) => undefined) => void;
443
+ /** Fresh strict disk read of acknowledged temporary-tab targets; throws rather than guessing absence. */
444
+ listTemporaryThreadTargets: () => TelegramTarget[];
224
445
  list: () => TelegramTopicTargetRecord[];
225
446
  getFollowerRecoveryHintByTarget?: (target: TelegramTarget) => {
226
447
  slot?: string;
@@ -245,6 +466,8 @@ export interface TelegramTopicTargetStore {
245
466
  liveRoster?: Record<string, unknown>;
246
467
  diagnostics?: Record<string, unknown>;
247
468
  }) => void;
469
+ /** Writes the non-canonical status projection to its own file; it never touches canonical state or grants authority. */
470
+ persistStatus: () => Promise<void>;
248
471
  getByProfileKey: (profileKey: string) => TelegramTopicTargetRecord | undefined;
249
472
  getActiveByInstanceId: (instanceId: string) => TelegramTopicTargetRecord | undefined;
250
473
  getIdentityByProfileKey: (profileKey: string) => TelegramThreadIdentityRecord | undefined;
@@ -255,7 +478,10 @@ export interface TelegramTopicTargetStore {
255
478
  commitSessionReplacementIntent: (intent: TelegramSessionReplacementIntent, isCurrent: () => boolean) => Promise<boolean>;
256
479
  removeSessionReplacementIntent: (expected: TelegramSessionReplacementIntent, isCurrent: () => boolean) => Promise<boolean>;
257
480
  listWorkspaceRetirementIntents: () => TelegramWorkspaceRetirementIntent[];
258
- commitWorkspaceJournalEvidence: (expected: TelegramWorkspaceThreadBinding, journalBindingKeys: readonly string[], complete: boolean) => TelegramWorkspaceThreadBinding | undefined;
481
+ /** Metadata subset CAS only: callers prove exact-source/writer evidence; independent snapshot roots are untouched. */
482
+ commitWorkspaceJournalEvidence: (expected: TelegramWorkspaceThreadBinding, journalBindingKeys: readonly string[], complete: boolean, journalSources?: readonly TelegramWorkspaceJournalSource[]) => TelegramWorkspaceThreadBinding | undefined;
483
+ /** Acknowledge publication of the exact current metadata frame; never roll it back after an uncertain write. */
484
+ persistWorkspaceJournalEvidence: (expected: TelegramWorkspaceThreadBinding, isCurrent: () => boolean) => Promise<boolean>;
259
485
  upsertWorkspaceRetirementIntent: (intent: TelegramWorkspaceRetirementIntent) => boolean;
260
486
  removeWorkspaceRetirementIntent: (expected: TelegramWorkspaceRetirementIntent) => boolean;
261
487
  replaceWorkspaceRetirementIntent: (expected: TelegramWorkspaceRetirementIntent, replacement: TelegramWorkspaceRetirementIntent, isCurrent: () => boolean) => Promise<boolean>;
@@ -306,13 +532,14 @@ export interface TelegramTopicTargetStore {
306
532
  claimReusableTarget: (instanceId: string, threadName?: string) => TelegramTopicTargetRecord | undefined;
307
533
  }
308
534
  export declare function reconcileTelegramFreshAllocationCursor(store: Pick<TelegramTopicTargetStore, "getBotState" | "list" | "setBotState">, nowMs?: number): boolean;
309
- export declare function createTelegramCleanupTargetProtection(store: Pick<TelegramTopicTargetStore, "list"> & Partial<Pick<TelegramTopicTargetStore, "listReservations" | "listPendingProvisions" | "listPendingCleanups">>, departingRecord?: TelegramTopicTargetRecord): NonNullable<ThreadReconciler.ThreadReconciliationApplyPorts["isCleanupTargetProtected"]>;
535
+ export declare function createTelegramCleanupTargetProtection(store: Pick<TelegramTopicTargetStore, "list"> & Partial<Pick<TelegramTopicTargetStore, "listReservations" | "listPendingProvisions" | "listPendingCleanups" | "listTemporaryThreadTargets">>, departingRecord?: TelegramTopicTargetRecord): NonNullable<ThreadReconciler.ThreadReconciliationApplyPorts["isCleanupTargetProtected"]>;
310
536
  export interface TelegramTopicTargetStoreOptions {
311
537
  path: string | (() => string);
312
538
  telegramProfile?: string | (() => string | undefined);
313
539
  getNowMs?: () => number;
314
540
  canPersist?: () => boolean;
315
541
  commitPersist?: (commit: () => void) => boolean;
542
+ consolidated?: Pick<TelegramConsolidatedWorkspaceStorageOptions, "captureAuthority" | "publishIfOwned">;
316
543
  getExternalReservedSlots?: () => readonly string[];
317
544
  }
318
545
  export interface TelegramTopicTargetProvisionerDeps {
@@ -368,7 +595,6 @@ export interface TelegramTopicTargetProvisionResult {
368
595
  record: TelegramTopicTargetRecord;
369
596
  displayTitle?: string;
370
597
  }
371
- export declare function createTelegramThreadName(input: TelegramThreadNameInput): string;
372
598
  export declare function getTelegramStatePath(agentDir?: string, profileName?: string): string;
373
599
  export declare function getTelegramTopicTargetsPath(agentDir?: string, profileName?: string): string;
374
600
  export declare const TELEGRAM_LEADER_SESSION_HANDOFF_TTL_MS = 30000;
@@ -385,35 +611,42 @@ export interface TelegramLeaderSessionHandoff {
385
611
  }
386
612
  export declare function getTelegramLeaderSessionHandoff(): TelegramLeaderSessionHandoff | undefined;
387
613
  export declare function setTelegramLeaderSessionHandoff(handoff: TelegramLeaderSessionHandoff | undefined): void;
388
- export declare function isTelegramLeaderSessionHandoffFresh(handoff: TelegramLeaderSessionHandoff | undefined, options?: {
389
- pid?: number;
390
- nowMs?: number;
391
- ttlMs?: number;
392
- }): handoff is TelegramLeaderSessionHandoff;
393
614
  export declare function getTelegramThreadOwnerKey(owner: TelegramThreadOwner): string;
394
615
  export declare function getTelegramThreadOwnerFromProfileKey(profileKey: string): TelegramThreadOwner;
395
616
  export declare function normalizeTelegramSessionReplacementIntent(value: unknown): TelegramSessionReplacementIntent | undefined;
617
+ export declare const isTelegramWorkspaceRestoreRecipient: (value: unknown) => value is TelegramWorkspaceRestoreRecipient;
618
+ export declare function isTelegramWorkspaceRestoreRequest(value: unknown): value is TelegramWorkspaceRestoreRequest;
619
+ /** Stable acceptance scope, not a removal ACK; adoption and mutable progress cannot change it. */
620
+ export declare function getTelegramWorkspaceRestoreSourceCompletionSha256(operation: TelegramWorkspaceRestoreIntent, acceptance: TelegramWorkspaceRestoreSourceAcceptance): string;
621
+ export declare function getTelegramTemporaryThreadInputs(entry: TelegramTemporaryThreadEntry): TelegramTemporaryThreadInput[];
622
+ /** Every known group is durably cancelled or Forward-completed; still not deletion authority by itself. */
623
+ export declare function isTelegramTemporaryThreadFullyResolved(entry: TelegramTemporaryThreadEntry): boolean;
624
+ /** The unified section accepts only lossless current-format Workspace evidence, never tolerant legacy repair. */
625
+ export declare function parseTelegramWorkspaceStateSection(value: unknown, profile: string): TelegramTopicTargetFile | undefined;
626
+ export declare function resolveTelegramWorkspaceProvisionRecoveryPath(statePath: string, profileName?: string, layout?: "consolidated"): string;
627
+ export interface TelegramConsolidatedWorkspaceStorageOptions {
628
+ getPath: () => string;
629
+ getProfile: () => string | undefined;
630
+ /** Exact owner/context/session grant captured before the caller's first await. */
631
+ captureAuthority: () => (() => boolean) | undefined;
632
+ publishIfOwned: NonNullable<TelegramLockRuntime<TelegramLockContext>["publishStateSectionIfOwned"]>;
633
+ }
634
+ export type TelegramWorkspaceStatePublication = <T>(mutate: (current: unknown) => TelegramRuntimeStateMutation<T>, publication?: Partial<Pick<TelegramOwnedStatePublicationOptions, "onPublicationBoundary" | "publishRename" | "isCurrent">>) => TelegramOwnedStatePublicationResult<T>;
635
+ /** Prepared Workspace IO adapter; transition/CAS policy remains with the existing Threads owner. */
636
+ export declare function createTelegramConsolidatedWorkspaceStorage(options: TelegramConsolidatedWorkspaceStorageOptions): {
637
+ readRaw: () => unknown;
638
+ read: () => TelegramTopicTargetFile | undefined;
639
+ capturePublication(): TelegramWorkspaceStatePublication | undefined;
640
+ };
396
641
  export declare function isSameTelegramProcessInstance(left: string | undefined, right: string | undefined): boolean;
642
+ /** Resolving selects a scope-bound view of the existing Workspace owner; it creates no files. */
643
+ export declare function createTelegramWorkspaceRestoreResolver(deps: {
644
+ getProfileName: () => string | undefined;
645
+ getBotToken: () => string | undefined;
646
+ threadStore: Pick<TelegramTopicTargetStore, "workspaceRestore">;
647
+ agentDir?: string;
648
+ }): () => TelegramWorkspaceRestore | undefined;
397
649
  export declare function createTelegramTopicTargetStore(options: TelegramTopicTargetStoreOptions): TelegramTopicTargetStore;
398
- export declare function normalizeTelegramTopicTargetThreadName(threadName: string): string;
399
- export declare function getTelegramTopicIdentityName(threadName: string): string;
400
- export declare function listOccupiedTelegramThreadIdentities(input: {
401
- records: readonly TelegramTopicTargetRecord[];
402
- workspaceBindings?: readonly TelegramWorkspaceThreadBinding[];
403
- pendingProvisions?: readonly TelegramThreadPendingProvision[];
404
- exceptTarget?: TelegramTarget;
405
- exceptWorkspaceBindingKey?: string;
406
- }): string[];
407
- export declare function chooseTelegramThreadName(input: {
408
- slot: string | undefined;
409
- entropy?: number | string;
410
- getRandom?: () => number;
411
- occupied?: readonly string[];
412
- }): string | undefined;
413
- export declare function getTelegramTopicThreadNameValidationError(threadName: string, _slot: string | undefined): string | undefined;
414
- export declare function getTelegramManualThreadDisplayNameValidationError(threadName: string): string | undefined;
415
- export declare function isTelegramTopicThreadNameValidForSlot(threadName: string, slot: string | undefined): boolean;
416
- export declare function getTelegramTopicName(request: TelegramTopicTargetProvisionRequest, template?: string, slot?: string): string;
417
650
  export interface TelegramPromoteFollowerBindingToLeaderDeps {
418
651
  store: TelegramTopicTargetStore;
419
652
  instanceId: string;
@@ -644,6 +877,5 @@ export declare function getTelegramTargetFromApiBody(body: unknown): (TelegramTa
644
877
  }) | undefined;
645
878
  export declare function isTelegramTopicTargetStaleError(error: unknown): boolean;
646
879
  export declare function isTelegramTopicModeUnavailableError(error: unknown): boolean;
647
- export declare function getTelegramTopicTitleForThreadName(threadName: string, slot: string, template?: string): string;
648
880
  export declare function createTelegramTopicTargetRenamer(deps: TelegramTopicTargetRenamerDeps): (request: TelegramTopicTargetRenameRequest) => Promise<TelegramTopicTargetRecord | undefined>;
649
881
  export declare function createTelegramTopicTargetProvisioner(deps: TelegramTopicTargetProvisionerDeps): (request: TelegramTopicTargetProvisionRequest) => Promise<TelegramTopicTargetProvisionResult>;