charness 3.3.1 → 3.4.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 (203) hide show
  1. package/CHANGELOG.md +612 -0
  2. package/DEVELOPMENT.md +76 -0
  3. package/README.md +5 -2
  4. package/SETUP.md +66 -20
  5. package/dist/adapters/claudeJsonStreamAdapter.d.ts +2 -0
  6. package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
  7. package/dist/adapters/claudeJsonStreamAdapter.js +15 -2
  8. package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
  9. package/dist/adapters/openCodeAdapter.d.ts +13 -1
  10. package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
  11. package/dist/adapters/openCodeAdapter.js +35 -13
  12. package/dist/adapters/openCodeAdapter.js.map +1 -1
  13. package/dist/agentLogin/agentLogin.d.ts +1 -0
  14. package/dist/agentLogin/agentLogin.d.ts.map +1 -1
  15. package/dist/agentLogin/agentLogin.js +5 -0
  16. package/dist/agentLogin/agentLogin.js.map +1 -1
  17. package/dist/apiErrorRetry.d.ts +10 -4
  18. package/dist/apiErrorRetry.d.ts.map +1 -1
  19. package/dist/apiErrorRetry.js +14 -7
  20. package/dist/apiErrorRetry.js.map +1 -1
  21. package/dist/apiRetryKick.d.ts +6 -0
  22. package/dist/apiRetryKick.d.ts.map +1 -1
  23. package/dist/apiRetryKick.js +2 -1
  24. package/dist/apiRetryKick.js.map +1 -1
  25. package/dist/bot.d.ts +0 -3
  26. package/dist/bot.d.ts.map +1 -1
  27. package/dist/bot.js +337 -173
  28. package/dist/bot.js.map +1 -1
  29. package/dist/changelogEntries.d.ts +25 -0
  30. package/dist/changelogEntries.d.ts.map +1 -0
  31. package/dist/changelogEntries.js +66 -0
  32. package/dist/changelogEntries.js.map +1 -0
  33. package/dist/cli/bot.d.ts +6 -2
  34. package/dist/cli/bot.d.ts.map +1 -1
  35. package/dist/cli/bot.js +34 -2
  36. package/dist/cli/bot.js.map +1 -1
  37. package/dist/cli/hot.d.ts +7 -0
  38. package/dist/cli/hot.d.ts.map +1 -1
  39. package/dist/cli/hot.js +53 -3
  40. package/dist/cli/hot.js.map +1 -1
  41. package/dist/cli.d.ts +1 -1
  42. package/dist/cli.d.ts.map +1 -1
  43. package/dist/cli.js +8 -0
  44. package/dist/cli.js.map +1 -1
  45. package/dist/connectors/telegram/bindPicker.d.ts +64 -0
  46. package/dist/connectors/telegram/bindPicker.d.ts.map +1 -0
  47. package/dist/connectors/telegram/bindPicker.js +97 -0
  48. package/dist/connectors/telegram/bindPicker.js.map +1 -0
  49. package/dist/connectors/telegram/commands/selfUpdate.d.ts +16 -0
  50. package/dist/connectors/telegram/commands/selfUpdate.d.ts.map +1 -0
  51. package/dist/connectors/telegram/commands/selfUpdate.js +210 -0
  52. package/dist/connectors/telegram/commands/selfUpdate.js.map +1 -0
  53. package/dist/connectors/telegram/commands/stt.d.ts +1 -0
  54. package/dist/connectors/telegram/commands/stt.d.ts.map +1 -1
  55. package/dist/connectors/telegram/commands/stt.js +5 -0
  56. package/dist/connectors/telegram/commands/stt.js.map +1 -1
  57. package/dist/connectors/telegram/commands/topicCommand.d.ts +75 -0
  58. package/dist/connectors/telegram/commands/topicCommand.d.ts.map +1 -0
  59. package/dist/connectors/telegram/commands/topicCommand.js +391 -0
  60. package/dist/connectors/telegram/commands/topicCommand.js.map +1 -0
  61. package/dist/i18n/de.d.ts.map +1 -1
  62. package/dist/i18n/de.js +109 -3
  63. package/dist/i18n/de.js.map +1 -1
  64. package/dist/i18n/en.d.ts.map +1 -1
  65. package/dist/i18n/en.js +109 -3
  66. package/dist/i18n/en.js.map +1 -1
  67. package/dist/i18n/es.d.ts.map +1 -1
  68. package/dist/i18n/es.js +109 -3
  69. package/dist/i18n/es.js.map +1 -1
  70. package/dist/i18n/fr.d.ts.map +1 -1
  71. package/dist/i18n/fr.js +109 -3
  72. package/dist/i18n/fr.js.map +1 -1
  73. package/dist/i18n/hi.d.ts.map +1 -1
  74. package/dist/i18n/hi.js +109 -3
  75. package/dist/i18n/hi.js.map +1 -1
  76. package/dist/i18n/ja.d.ts.map +1 -1
  77. package/dist/i18n/ja.js +109 -3
  78. package/dist/i18n/ja.js.map +1 -1
  79. package/dist/i18n/ka.d.ts.map +1 -1
  80. package/dist/i18n/ka.js +109 -3
  81. package/dist/i18n/ka.js.map +1 -1
  82. package/dist/i18n/pt.d.ts.map +1 -1
  83. package/dist/i18n/pt.js +109 -3
  84. package/dist/i18n/pt.js.map +1 -1
  85. package/dist/i18n/ru.d.ts.map +1 -1
  86. package/dist/i18n/ru.js +109 -3
  87. package/dist/i18n/ru.js.map +1 -1
  88. package/dist/i18n/uk.d.ts.map +1 -1
  89. package/dist/i18n/uk.js +109 -3
  90. package/dist/i18n/uk.js.map +1 -1
  91. package/dist/i18n/uz.d.ts.map +1 -1
  92. package/dist/i18n/uz.js +109 -3
  93. package/dist/i18n/uz.js.map +1 -1
  94. package/dist/i18n/zh.d.ts.map +1 -1
  95. package/dist/i18n/zh.js +109 -3
  96. package/dist/i18n/zh.js.map +1 -1
  97. package/dist/installManager.d.ts +28 -0
  98. package/dist/installManager.d.ts.map +1 -1
  99. package/dist/installManager.js +85 -11
  100. package/dist/installManager.js.map +1 -1
  101. package/dist/instanceSettings.d.ts +12 -1
  102. package/dist/instanceSettings.d.ts.map +1 -1
  103. package/dist/instanceSettings.js +40 -4
  104. package/dist/instanceSettings.js.map +1 -1
  105. package/dist/selfUpdate/bootRollback.d.ts +22 -0
  106. package/dist/selfUpdate/bootRollback.d.ts.map +1 -0
  107. package/dist/selfUpdate/bootRollback.js +79 -0
  108. package/dist/selfUpdate/bootRollback.js.map +1 -0
  109. package/dist/selfUpdate/commandRunner.d.ts +21 -0
  110. package/dist/selfUpdate/commandRunner.d.ts.map +1 -0
  111. package/dist/selfUpdate/commandRunner.js +32 -0
  112. package/dist/selfUpdate/commandRunner.js.map +1 -0
  113. package/dist/selfUpdate/constants.d.ts +26 -0
  114. package/dist/selfUpdate/constants.d.ts.map +1 -0
  115. package/dist/selfUpdate/constants.js +31 -0
  116. package/dist/selfUpdate/constants.js.map +1 -0
  117. package/dist/selfUpdate/gitSource.d.ts +58 -0
  118. package/dist/selfUpdate/gitSource.d.ts.map +1 -0
  119. package/dist/selfUpdate/gitSource.js +183 -0
  120. package/dist/selfUpdate/gitSource.js.map +1 -0
  121. package/dist/selfUpdate/hostLock.d.ts +16 -0
  122. package/dist/selfUpdate/hostLock.d.ts.map +1 -0
  123. package/dist/selfUpdate/hostLock.js +101 -0
  124. package/dist/selfUpdate/hostLock.js.map +1 -0
  125. package/dist/selfUpdate/hotSupervisor.d.ts +47 -0
  126. package/dist/selfUpdate/hotSupervisor.d.ts.map +1 -0
  127. package/dist/selfUpdate/hotSupervisor.js +125 -0
  128. package/dist/selfUpdate/hotSupervisor.js.map +1 -0
  129. package/dist/selfUpdate/installKind.d.ts +45 -0
  130. package/dist/selfUpdate/installKind.d.ts.map +1 -0
  131. package/dist/selfUpdate/installKind.js +99 -0
  132. package/dist/selfUpdate/installKind.js.map +1 -0
  133. package/dist/selfUpdate/launchEnvironment.d.ts +3 -0
  134. package/dist/selfUpdate/launchEnvironment.d.ts.map +1 -0
  135. package/dist/selfUpdate/launchEnvironment.js +16 -0
  136. package/dist/selfUpdate/launchEnvironment.js.map +1 -0
  137. package/dist/selfUpdate/npmSource.d.ts +34 -0
  138. package/dist/selfUpdate/npmSource.d.ts.map +1 -0
  139. package/dist/selfUpdate/npmSource.js +107 -0
  140. package/dist/selfUpdate/npmSource.js.map +1 -0
  141. package/dist/selfUpdate/releaseNotes.d.ts +33 -0
  142. package/dist/selfUpdate/releaseNotes.d.ts.map +1 -0
  143. package/dist/selfUpdate/releaseNotes.js +115 -0
  144. package/dist/selfUpdate/releaseNotes.js.map +1 -0
  145. package/dist/selfUpdate/restart.d.ts +33 -0
  146. package/dist/selfUpdate/restart.d.ts.map +1 -0
  147. package/dist/selfUpdate/restart.js +94 -0
  148. package/dist/selfUpdate/restart.js.map +1 -0
  149. package/dist/selfUpdate/selfCheck.d.ts +20 -0
  150. package/dist/selfUpdate/selfCheck.d.ts.map +1 -0
  151. package/dist/selfUpdate/selfCheck.js +126 -0
  152. package/dist/selfUpdate/selfCheck.js.map +1 -0
  153. package/dist/selfUpdate/semver.d.ts +24 -0
  154. package/dist/selfUpdate/semver.d.ts.map +1 -0
  155. package/dist/selfUpdate/semver.js +165 -0
  156. package/dist/selfUpdate/semver.js.map +1 -0
  157. package/dist/selfUpdate/types.d.ts +51 -0
  158. package/dist/selfUpdate/types.d.ts.map +1 -0
  159. package/dist/selfUpdate/types.js +3 -0
  160. package/dist/selfUpdate/types.js.map +1 -0
  161. package/dist/selfUpdate/updateEngine.d.ts +110 -0
  162. package/dist/selfUpdate/updateEngine.d.ts.map +1 -0
  163. package/dist/selfUpdate/updateEngine.js +727 -0
  164. package/dist/selfUpdate/updateEngine.js.map +1 -0
  165. package/dist/selfUpdate/updateMessages.d.ts +84 -0
  166. package/dist/selfUpdate/updateMessages.d.ts.map +1 -0
  167. package/dist/selfUpdate/updateMessages.js +115 -0
  168. package/dist/selfUpdate/updateMessages.js.map +1 -0
  169. package/dist/selfUpdate/updateModes.d.ts +17 -0
  170. package/dist/selfUpdate/updateModes.d.ts.map +1 -0
  171. package/dist/selfUpdate/updateModes.js +14 -0
  172. package/dist/selfUpdate/updateModes.js.map +1 -0
  173. package/dist/selfUpdate/updatePending.d.ts +76 -0
  174. package/dist/selfUpdate/updatePending.d.ts.map +1 -0
  175. package/dist/selfUpdate/updatePending.js +131 -0
  176. package/dist/selfUpdate/updatePending.js.map +1 -0
  177. package/dist/selfUpdate/updatePolicy.d.ts +115 -0
  178. package/dist/selfUpdate/updatePolicy.d.ts.map +1 -0
  179. package/dist/selfUpdate/updatePolicy.js +83 -0
  180. package/dist/selfUpdate/updatePolicy.js.map +1 -0
  181. package/dist/selfUpdate/updateRuntime.d.ts +22 -0
  182. package/dist/selfUpdate/updateRuntime.d.ts.map +1 -0
  183. package/dist/selfUpdate/updateRuntime.js +148 -0
  184. package/dist/selfUpdate/updateRuntime.js.map +1 -0
  185. package/dist/startupPromptBuffer.d.ts +2 -0
  186. package/dist/startupPromptBuffer.d.ts.map +1 -1
  187. package/dist/startupPromptBuffer.js +4 -0
  188. package/dist/startupPromptBuffer.js.map +1 -1
  189. package/dist/state.d.ts +12 -0
  190. package/dist/state.d.ts.map +1 -1
  191. package/dist/state.js +18 -0
  192. package/dist/state.js.map +1 -1
  193. package/dist/types.d.ts +4 -0
  194. package/dist/types.d.ts.map +1 -1
  195. package/dist/utils/promptDelivery.d.ts +10 -4
  196. package/dist/utils/promptDelivery.d.ts.map +1 -1
  197. package/dist/utils/promptDelivery.js +6 -3
  198. package/dist/utils/promptDelivery.js.map +1 -1
  199. package/dist/utils/updateScreenPlan.d.ts +38 -0
  200. package/dist/utils/updateScreenPlan.d.ts.map +1 -0
  201. package/dist/utils/updateScreenPlan.js +143 -0
  202. package/dist/utils/updateScreenPlan.js.map +1 -0
  203. package/package.json +3 -1
@@ -0,0 +1,391 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.topicCancelCallbackRe = exports.buildTopicCancelCallback = exports.topicCreateFolderCallbackRe = exports.buildTopicCreateFolderCallback = exports.topicPageCallbackRe = exports.buildTopicPageCallback = exports.topicFolderCallbackRe = exports.buildTopicFolderCallback = exports.topicOtherFolderCallbackRe = exports.buildTopicOtherFolderCallback = exports.topicSameFolderCallbackRe = exports.buildTopicSameFolderCallback = exports.topicNameMaxLength = void 0;
4
+ exports.buildTopicPickerCallbacks = buildTopicPickerCallbacks;
5
+ exports.normaliseTopicName = normaliseTopicName;
6
+ exports.buildTopicLink = buildTopicLink;
7
+ exports.checkIsMissingTopicRightsError = checkIsMissingTopicRightsError;
8
+ exports.getPublicChatUsername = getPublicChatUsername;
9
+ exports.createTopicCommand = createTopicCommand;
10
+ /**
11
+ * `/topic` — open another forum topic on a folder: the name, the folder, then the topic. See README.md in this folder.
12
+ */
13
+ const node_crypto_1 = require("node:crypto");
14
+ const telegraf_1 = require("telegraf");
15
+ const sessionKey_1 = require("../../../sessionKey");
16
+ const i18n_1 = require("../../../i18n");
17
+ const sendErrorClassifier_1 = require("../../../sendErrorClassifier");
18
+ const sessionKeyCodec_1 = require("../sessionKeyCodec");
19
+ const bindPicker_1 = require("../bindPicker");
20
+ const callbackMessage_1 = require("./callbackMessage");
21
+ /** The Bot API accepts a topic name of 1–128 characters (`createForumTopic`). */
22
+ exports.topicNameMaxLength = 128;
23
+ /** In-flight wizards kept in memory, the newest; an older one's keyboard answers «out of date». */
24
+ const topicWizardLimit = 20;
25
+ /** How long a wizard stays tappable. Memory only: a restart drops every wizard, so its old keyboards expire anyway. */
26
+ const topicWizardTtlMs = 30 * 60 * 1000;
27
+ /** Bytes of randomness in a wizard id (rendered as hex, so twice as many characters in a callback). */
28
+ const topicWizardIdBytes = 3;
29
+ /** The id a private supergroup carries in the Bot API (`-100` + the id the t.me/c/ links use). */
30
+ const privateSupergroupIdPrefix = '-100';
31
+ // ── callback data: `topic_<action>_<wizard id>[_<n>]`, every id baked in, well under the 64-byte cap ──
32
+ const wizardIdPattern = '([0-9a-f]+)';
33
+ const buildTopicSameFolderCallback = (wizardId) => `topic_here_${wizardId}`;
34
+ exports.buildTopicSameFolderCallback = buildTopicSameFolderCallback;
35
+ exports.topicSameFolderCallbackRe = new RegExp(`^topic_here_${wizardIdPattern}$`);
36
+ const buildTopicOtherFolderCallback = (wizardId) => `topic_other_${wizardId}`;
37
+ exports.buildTopicOtherFolderCallback = buildTopicOtherFolderCallback;
38
+ exports.topicOtherFolderCallbackRe = new RegExp(`^topic_other_${wizardIdPattern}$`);
39
+ const buildTopicFolderCallback = (wizardId, index) => `topic_folder_${wizardId}_${index}`;
40
+ exports.buildTopicFolderCallback = buildTopicFolderCallback;
41
+ exports.topicFolderCallbackRe = new RegExp(`^topic_folder_${wizardIdPattern}_(\\d+)$`);
42
+ const buildTopicPageCallback = (wizardId, page) => `topic_page_${wizardId}_${page}`;
43
+ exports.buildTopicPageCallback = buildTopicPageCallback;
44
+ exports.topicPageCallbackRe = new RegExp(`^topic_page_${wizardIdPattern}_(\\d+)$`);
45
+ const buildTopicCreateFolderCallback = (wizardId) => `topic_create_${wizardId}`;
46
+ exports.buildTopicCreateFolderCallback = buildTopicCreateFolderCallback;
47
+ exports.topicCreateFolderCallbackRe = new RegExp(`^topic_create_${wizardIdPattern}$`);
48
+ const buildTopicCancelCallback = (wizardId) => `topic_cancel_${wizardId}`;
49
+ exports.buildTopicCancelCallback = buildTopicCancelCallback;
50
+ exports.topicCancelCallbackRe = new RegExp(`^topic_cancel_${wizardIdPattern}$`);
51
+ /** The wizard's «cancel» row, the last one of the folder question and of the picker. */
52
+ const buildTopicCancelButton = (wizardId) => ({
53
+ label: (0, i18n_1.t)('topic.cancelButton'),
54
+ callback: (0, exports.buildTopicCancelCallback)(wizardId),
55
+ });
56
+ /** @description The picker's buttons pointing at the wizard `wizardId` instead of at the topic the keyboard sits in. */
57
+ function buildTopicPickerCallbacks(wizardId) {
58
+ return {
59
+ getFolderCallback: (_subdir, index) => (0, exports.buildTopicFolderCallback)(wizardId, index),
60
+ getPageCallback: (page) => (0, exports.buildTopicPageCallback)(wizardId, page),
61
+ createFolderCallback: (0, exports.buildTopicCreateFolderCallback)(wizardId),
62
+ cancelButton: buildTopicCancelButton(wizardId),
63
+ };
64
+ }
65
+ /** @description A typed topic name as the Bot API gets it: whitespace runs collapsed, the ends trimmed. */
66
+ function normaliseTopicName(rawName) {
67
+ return rawName.replace(/\s+/g, ' ').trim();
68
+ }
69
+ /**
70
+ * @description The link that opens a forum topic: `https://t.me/<username>/<topic id>` for a public group,
71
+ * `https://t.me/c/<chat id without -100>/<topic id>` for a private one. The topic id is the id of the topic's creation
72
+ * service message, so the link is the message link to it, which a client opens as the topic
73
+ * (https://core.telegram.org/api/links, «Forum topic links»). `null` for a chat id that is no supergroup's.
74
+ */
75
+ function buildTopicLink(chat, threadId) {
76
+ if (chat.username)
77
+ return `https://t.me/${chat.username}/${threadId}`;
78
+ const chatIdText = chat.chatId.toString();
79
+ if (!chatIdText.startsWith(privateSupergroupIdPrefix))
80
+ return null;
81
+ return `https://t.me/c/${chatIdText.slice(privateSupergroupIdPrefix.length)}/${threadId}`;
82
+ }
83
+ /** @description Whether `createForumTopic` was refused for want of the `can_manage_topics` admin right. */
84
+ function checkIsMissingTopicRightsError(error) {
85
+ return (0, sendErrorClassifier_1.checkIsApiError)(error) && /not enough rights|CHAT_ADMIN_REQUIRED|administrator/i.test((0, sendErrorClassifier_1.getErrorDescription)(error));
86
+ }
87
+ /** @description The public username of the chat an update came from, `null` for a private group (or no chat). */
88
+ function getPublicChatUsername(chat) {
89
+ return chat && 'username' in chat && chat.username ? chat.username : null;
90
+ }
91
+ /**
92
+ * @description Build the `/topic` feature over its ports: the command, its six buttons, and the capture of the topic
93
+ * name and the new folder's name (the text handler asks `checkIsAwaitingTopicInput` / `submitTopicInput`; any other
94
+ * command ends it through `cancelTopicInput`). `/esc` ends the wizard at ANY step through `cancelTopicWizard`, as the
95
+ * «cancel» button does.
96
+ */
97
+ function createTopicCommand(ports) {
98
+ const { bot, command, getState, replyToThread, editThreadMessage, authoriseContext, checkIsDmKey, disarmFolderCreation, listAvailableSubdirs, createWorkFolder, bindNewTopic, } = ports;
99
+ const wizards = new Map();
100
+ /** Per origin topic, the one wizard whose next plain message is an answer. */
101
+ const captures = new Map();
102
+ function getWizard(wizardId) {
103
+ const wizard = wizards.get(wizardId);
104
+ if (!wizard)
105
+ return null;
106
+ if (Date.now() - wizard.createdAtMs > topicWizardTtlMs) {
107
+ forgetWizard(wizard);
108
+ return null;
109
+ }
110
+ return wizard;
111
+ }
112
+ function forgetWizard(wizard) {
113
+ wizards.delete(wizard.id);
114
+ const originKeyText = (0, sessionKey_1.keyToString)(wizard.originKey);
115
+ if (captures.get(originKeyText)?.wizardId === wizard.id)
116
+ captures.delete(originKeyText);
117
+ }
118
+ function createWizard(originKey, ctx) {
119
+ let id = (0, node_crypto_1.randomBytes)(topicWizardIdBytes).toString('hex');
120
+ while (wizards.has(id))
121
+ id = (0, node_crypto_1.randomBytes)(topicWizardIdBytes).toString('hex');
122
+ const wizard = {
123
+ id, originKey, chatUsername: getPublicChatUsername(ctx.chat), name: null, currentSubdir: null, folders: [],
124
+ messageId: null, isCreating: false, createdAtMs: Date.now(),
125
+ };
126
+ wizards.set(id, wizard);
127
+ while (wizards.size > topicWizardLimit) {
128
+ const oldest = wizards.values().next().value;
129
+ if (oldest === undefined)
130
+ break;
131
+ forgetWizard(oldest);
132
+ }
133
+ return wizard;
134
+ }
135
+ function armCapture(wizard, step) {
136
+ captures.set((0, sessionKey_1.keyToString)(wizard.originKey), { wizardId: wizard.id, step });
137
+ }
138
+ // ── the capture the text handler consults ──
139
+ function getCapture(key) {
140
+ const capture = captures.get((0, sessionKey_1.keyToString)(key));
141
+ if (!capture)
142
+ return null;
143
+ const wizard = getWizard(capture.wizardId);
144
+ if (!wizard) {
145
+ captures.delete((0, sessionKey_1.keyToString)(key));
146
+ return null;
147
+ }
148
+ return { wizard, step: capture.step };
149
+ }
150
+ /** Whether the topic's next plain message answers the wizard (the text handler asks before forwarding it to the agent). */
151
+ function checkIsAwaitingTopicInput(key) {
152
+ return getCapture(key) !== null;
153
+ }
154
+ /**
155
+ * End the topic's pending name question and its wizard, silently (any command but `/esc`, arming `/bind`'s own
156
+ * question). A wizard that waits for a tap is left alone: its keyboard is still a valid question. Returns whether one
157
+ * was pending.
158
+ */
159
+ function cancelTopicInput(key) {
160
+ const capture = getCapture(key);
161
+ if (!capture)
162
+ return false;
163
+ forgetWizard(capture.wizard);
164
+ return true;
165
+ }
166
+ /** The topic's newest wizard that can still be stopped: alive and not already creating its topic. */
167
+ function findCancellableWizard(key) {
168
+ const keyText = (0, sessionKey_1.keyToString)(key);
169
+ let newest = null;
170
+ for (const wizard of [...wizards.values()]) {
171
+ if ((0, sessionKey_1.keyToString)(wizard.originKey) === keyText && getWizard(wizard.id) !== null && !wizard.isCreating)
172
+ newest = wizard;
173
+ }
174
+ return newest;
175
+ }
176
+ /**
177
+ * `/esc`: end the topic's newest wizard at whatever step it waits — a name question or a keyboard — and say so (the
178
+ * wizard's message is consumed into the notice, else the notice is a new message). Returns whether there was one; if
179
+ * not, `/esc` is the interrupt of the agent again.
180
+ */
181
+ async function cancelTopicWizard(key) {
182
+ const wizard = findCancellableWizard(key);
183
+ if (!wizard)
184
+ return false;
185
+ forgetWizard(wizard);
186
+ await showAnswer(wizard, (0, i18n_1.t)('topic.cancelled'), null);
187
+ return true;
188
+ }
189
+ /** The captured answer: the topic's name, or the new folder's. */
190
+ async function submitTopicInput(key, text) {
191
+ const capture = getCapture(key);
192
+ if (!capture)
193
+ return;
194
+ if (capture.step === 'topicName')
195
+ await acceptTopicName(capture.wizard, text);
196
+ else
197
+ await acceptFolderName(capture.wizard, text);
198
+ }
199
+ // ── the steps ──
200
+ async function askTopicName(wizard, problem) {
201
+ armCapture(wizard, 'topicName');
202
+ const question = [problem, (0, i18n_1.t)('topic.askName'), (0, i18n_1.t)('login.esc_hint')].filter((line) => line !== null).join('\n');
203
+ await replyToThread(wizard.originKey, question);
204
+ }
205
+ async function acceptTopicName(wizard, rawName) {
206
+ const name = normaliseTopicName(rawName);
207
+ if (name.length > exports.topicNameMaxLength) {
208
+ await askTopicName(wizard, (0, i18n_1.t)('topic.nameTooLong', { max: exports.topicNameMaxLength }));
209
+ return;
210
+ }
211
+ if (name.length === 0) {
212
+ await askTopicName(wizard, null);
213
+ return;
214
+ }
215
+ wizard.name = name;
216
+ captures.delete((0, sessionKey_1.keyToString)(wizard.originKey));
217
+ await askFolder(wizard);
218
+ }
219
+ /** The folder question: «as here» or «other» in a bound topic, the picker at once in General or an unbound one. */
220
+ async function askFolder(wizard) {
221
+ const name = wizard.name ?? '';
222
+ wizard.currentSubdir = getState().getBinding(wizard.originKey)?.subdir ?? null;
223
+ if (wizard.currentSubdir === null) {
224
+ await showPicker(wizard);
225
+ return;
226
+ }
227
+ const cancelButton = buildTopicCancelButton(wizard.id);
228
+ const keyboard = telegraf_1.Markup.inlineKeyboard([
229
+ [telegraf_1.Markup.button.callback((0, i18n_1.t)('topic.sameFolderButton', { subdir: wizard.currentSubdir }), (0, exports.buildTopicSameFolderCallback)(wizard.id))],
230
+ [telegraf_1.Markup.button.callback((0, i18n_1.t)('topic.otherFolderButton'), (0, exports.buildTopicOtherFolderCallback)(wizard.id))],
231
+ [telegraf_1.Markup.button.callback(cancelButton.label, cancelButton.callback)],
232
+ ]);
233
+ wizard.messageId = await replyToThread(wizard.originKey, (0, i18n_1.t)('topic.askFolder', { name }), keyboard);
234
+ }
235
+ /** The `/bind` folder picker, pointing at the wizard: in place of the question when there is one, else as a new message. */
236
+ async function showPicker(wizard) {
237
+ wizard.folders = listAvailableSubdirs();
238
+ const keyboard = (0, bindPicker_1.buildBindKeyboard)(wizard.folders, 0, bindPicker_1.BIND_PAGE_SIZE, false, buildTopicPickerCallbacks(wizard.id));
239
+ const text = (0, i18n_1.t)('topic.pickFolder', { name: wizard.name ?? '' });
240
+ if (wizard.messageId !== null && await editThreadMessage(wizard.originKey, wizard.messageId, text, keyboard))
241
+ return;
242
+ wizard.messageId = await replyToThread(wizard.originKey, text, keyboard);
243
+ }
244
+ async function acceptFolderName(wizard, rawName) {
245
+ // Claimed before the folder is made: a second message meanwhile is not a second folder name.
246
+ captures.delete((0, sessionKey_1.keyToString)(wizard.originKey));
247
+ const folder = await createWorkFolder(wizard.originKey, rawName);
248
+ // A refused name keeps the question open (the refusal was told); a failed mkdir ends the wizard.
249
+ if (folder.outcome === 'invalid') {
250
+ armCapture(wizard, 'folderName');
251
+ return;
252
+ }
253
+ if (folder.outcome === 'failed') {
254
+ forgetWizard(wizard);
255
+ return;
256
+ }
257
+ await createTopic(wizard, folder.subdir);
258
+ }
259
+ /** Create the topic, bind it, greet it, and turn the wizard's message into the answer with the link to the new topic. */
260
+ async function createTopic(wizard, subdir) {
261
+ wizard.isCreating = true;
262
+ const name = wizard.name ?? '';
263
+ const chatId = (0, sessionKeyCodec_1.getTelegramChatId)(wizard.originKey);
264
+ let threadId;
265
+ try {
266
+ threadId = (await bot.telegram.createForumTopic(chatId, name)).message_thread_id;
267
+ }
268
+ catch (error) {
269
+ forgetWizard(wizard);
270
+ const reason = checkIsMissingTopicRightsError(error)
271
+ ? (0, i18n_1.t)('error.tg.perm.manage_topics')
272
+ : (0, i18n_1.t)('topic.createFailed', { reason: (0, sendErrorClassifier_1.checkIsApiError)(error) ? (0, sendErrorClassifier_1.getErrorDescription)(error) : String(error) });
273
+ console.warn(`[topic] createForumTopic failed for ${(0, sessionKey_1.keyToString)(wizard.originKey)}:`, error instanceof Error ? error.message : error);
274
+ await showAnswer(wizard, reason, null, { parse_mode: 'Markdown' });
275
+ return;
276
+ }
277
+ forgetWizard(wizard);
278
+ const bindFailure = await bindNewTopic((0, sessionKeyCodec_1.makeTelegramKey)(chatId, threadId), subdir, name);
279
+ const text = bindFailure === null ? (0, i18n_1.t)('topic.created', { name, subdir }) : (0, i18n_1.t)('topic.createdNotBound', { name, reason: bindFailure });
280
+ const link = buildTopicLink({ chatId, username: wizard.chatUsername }, threadId);
281
+ const keyboard = link === null ? null : telegraf_1.Markup.inlineKeyboard([[telegraf_1.Markup.button.url((0, i18n_1.t)('topic.openButton'), link)]]);
282
+ await showAnswer(wizard, text, keyboard);
283
+ }
284
+ /** The answer takes the wizard's message (consuming its keyboard); a message that cannot be edited any more gets a new one. */
285
+ async function showAnswer(wizard, text, keyboard, extra = {}) {
286
+ const options = { ...extra, ...(keyboard ?? {}) };
287
+ if (wizard.messageId !== null && await editThreadMessage(wizard.originKey, wizard.messageId, text, options))
288
+ return;
289
+ await replyToThread(wizard.originKey, text, options);
290
+ }
291
+ // ── the command and the buttons ──
292
+ function registerTopicCommand() {
293
+ command('topic', async (ctx, key, parsed) => {
294
+ if (checkIsDmKey(key)) {
295
+ await replyToThread(key, (0, i18n_1.t)('topic.dmUnsupported'));
296
+ return;
297
+ }
298
+ const wizard = createWizard(key, ctx);
299
+ const rawName = parsed.args.join(' ');
300
+ if (rawName.trim() === '') {
301
+ await askTopicName(wizard, null);
302
+ return;
303
+ }
304
+ await acceptTopicName(wizard, rawName);
305
+ });
306
+ }
307
+ /**
308
+ * Gate one tap: an authorised admin, a wizard that is still alive and not creating its topic yet, on the keyboard's
309
+ * own message. The toast says what is wrong, otherwise the tap is answered (empty, or `toast`) before the work
310
+ * starts. `null` when the tap is refused.
311
+ */
312
+ async function takeWizardTap(ctx, wizardId, options = {}) {
313
+ const key = await authoriseContext(ctx);
314
+ if (!key) {
315
+ await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
316
+ return null;
317
+ }
318
+ const wizard = getWizard(wizardId);
319
+ if (!wizard || (0, callbackMessage_1.getCallbackMessageId)(ctx) !== wizard.messageId) {
320
+ await ctx.answerCbQuery((0, i18n_1.t)('topic.staleChoice'));
321
+ return null;
322
+ }
323
+ // A second tap of the same keyboard while the topic is being created: the first one is answering it.
324
+ if (wizard.isCreating) {
325
+ await ctx.answerCbQuery();
326
+ return null;
327
+ }
328
+ // Claimed before the next await, so two taps in flight cannot both pass the check above.
329
+ if (options.startsCreating)
330
+ wizard.isCreating = true;
331
+ await ctx.answerCbQuery(options.toast);
332
+ return wizard;
333
+ }
334
+ function registerTopicCallbacks() {
335
+ bot.action(exports.topicSameFolderCallbackRe, async (ctx) => {
336
+ const wizard = await takeWizardTap(ctx, ctx.match[1], { toast: (0, i18n_1.t)('topic.creatingToast'), startsCreating: true });
337
+ if (!wizard || wizard.currentSubdir === null)
338
+ return;
339
+ await createTopic(wizard, wizard.currentSubdir);
340
+ });
341
+ bot.action(exports.topicOtherFolderCallbackRe, async (ctx) => {
342
+ const wizard = await takeWizardTap(ctx, ctx.match[1]);
343
+ if (wizard)
344
+ await showPicker(wizard);
345
+ });
346
+ bot.action(exports.topicFolderCallbackRe, async (ctx) => {
347
+ const subdirIndex = Number(ctx.match[2]);
348
+ const wizard = await takeWizardTap(ctx, ctx.match[1], { toast: (0, i18n_1.t)('topic.creatingToast'), startsCreating: true });
349
+ if (!wizard)
350
+ return;
351
+ const subdir = wizard.folders[subdirIndex];
352
+ if (subdir === undefined) {
353
+ wizard.isCreating = false;
354
+ return;
355
+ }
356
+ await createTopic(wizard, subdir);
357
+ });
358
+ bot.action(exports.topicPageCallbackRe, async (ctx) => {
359
+ const wizard = await takeWizardTap(ctx, ctx.match[1]);
360
+ if (!wizard)
361
+ return;
362
+ const keyboard = (0, bindPicker_1.buildBindKeyboard)(wizard.folders, Number(ctx.match[2]), bindPicker_1.BIND_PAGE_SIZE, false, buildTopicPickerCallbacks(wizard.id));
363
+ try {
364
+ await ctx.editMessageReplyMarkup(keyboard.reply_markup);
365
+ }
366
+ catch (error) {
367
+ const description = (0, sendErrorClassifier_1.checkIsApiError)(error) ? (0, sendErrorClassifier_1.getErrorDescription)(error) : '';
368
+ if (!/message is not modified/i.test(description))
369
+ console.warn('[topic] picker page edit failed:', description || error);
370
+ }
371
+ });
372
+ bot.action(exports.topicCreateFolderCallbackRe, async (ctx) => {
373
+ const wizard = await takeWizardTap(ctx, ctx.match[1], { toast: (0, i18n_1.t)('bind.create_cb') });
374
+ if (!wizard || wizard.messageId === null)
375
+ return;
376
+ armCapture(wizard, 'folderName');
377
+ disarmFolderCreation(wizard.originKey);
378
+ // The picker is consumed: the message becomes the question for the folder's name.
379
+ await editThreadMessage(wizard.originKey, wizard.messageId, `${(0, i18n_1.t)('topic.createFolderPrompt', { name: wizard.name ?? '' })}\n${(0, i18n_1.t)('login.esc_hint')}`);
380
+ });
381
+ bot.action(exports.topicCancelCallbackRe, async (ctx) => {
382
+ const wizard = await takeWizardTap(ctx, ctx.match[1]);
383
+ if (!wizard)
384
+ return;
385
+ forgetWizard(wizard);
386
+ await showAnswer(wizard, (0, i18n_1.t)('topic.cancelled'), null);
387
+ });
388
+ }
389
+ return { registerTopicCommand, registerTopicCallbacks, checkIsAwaitingTopicInput, submitTopicInput, cancelTopicInput, cancelTopicWizard };
390
+ }
391
+ //# sourceMappingURL=topicCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topicCommand.js","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/topicCommand.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"de.d.ts","sourceRoot":"","sources":["../../src/i18n/de.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAu5BzC,CAAC"}
1
+ {"version":3,"file":"de.d.ts","sourceRoot":"","sources":["../../src/i18n/de.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkgCzC,CAAC"}
package/dist/i18n/de.js CHANGED
@@ -33,6 +33,22 @@ exports.deDict = {
33
33
  'bind.create_invalid_chars': '❌ Ordnername darf keine Steuerzeichen enthalten.',
34
34
  'bind.create_exists': '📁 Ordner `{subdir}` existiert bereits — verknüpfe damit.',
35
35
  'bind.create_failed': '❌ Ordner konnte nicht erstellt werden: {error}',
36
+ 'topic.askName': '🆕 Wie soll der neue Thread heißen? Sende den Namen.',
37
+ 'topic.nameTooLong': '❌ Ein Thread-Name hat höchstens {max} Zeichen. Sende einen kürzeren.',
38
+ 'topic.askFolder': '📁 In welchem Ordner soll «{name}» arbeiten?',
39
+ 'topic.sameFolderButton': '📁 {subdir} (wie hier)',
40
+ 'topic.otherFolderButton': '📂 Anderer Ordner',
41
+ 'topic.pickFolder': '📂 Wähle den Ordner für «{name}»:',
42
+ 'topic.createFolderPrompt': '✏️ Sende den Namen des neuen Ordners — er wird unter WORK_ROOT erstellt und «{name}» arbeitet darin.',
43
+ 'topic.creatingToast': 'Thread wird erstellt…',
44
+ 'topic.created': '✅ Thread «{name}» ist bereit, an {subdir} gebunden.',
45
+ 'topic.createdNotBound': '⚠️ Thread «{name}» wurde erstellt, aber das Binden schlug fehl: {reason}',
46
+ 'topic.openButton': 'Thread öffnen →',
47
+ 'topic.createFailed': '❌ Der Thread konnte nicht erstellt werden: {reason}',
48
+ 'topic.cancelled': '✖ Abgebrochen — es wurde kein Thread erstellt.',
49
+ 'topic.dmUnsupported': '🧵 Threads gibt es in einer Gruppe mit aktivierten Themen — führe /topic dort aus. Dieser Chat hat keine.',
50
+ 'topic.staleChoice': 'Diese Auswahl ist veraltet — führe /topic erneut aus.',
51
+ 'topic.cancelButton': '✖️ Abbrechen',
36
52
  'ls.header': '📁 Unterordner von `{workRoot}`:',
37
53
  'ls.empty': '📁 Keine verknüpfbaren Unterordner unter `WORK_ROOT`.',
38
54
  'list.header': '🧵 Thread-Verknüpfungen ({count}):',
@@ -46,6 +62,8 @@ exports.deDict = {
46
62
  '/status — Status aller Threads\n' +
47
63
  '/quitall — jeden laufenden Agent beenden\n' +
48
64
  '/stt — Spracherkennung einstellen\n' +
65
+ '/update — Bot-Updates: automatisch, nur benachrichtigen, aus\n' +
66
+ '/topic — weiteren Thread auf einem Ordner öffnen\n' +
49
67
  '/whoami /version — Debug\n\n' +
50
68
  'Um mit einem Agent zu sprechen — öffne einen thematischen Thread.',
51
69
  'help.thread_unbound': '*Thread ist nicht mit einem Ordner verknüpft.*\n' +
@@ -65,8 +83,10 @@ exports.deDict = {
65
83
  '/limits_autoswitch — automatischer Modellwechsel bei Nutzungslimit (Ersatzliste, Wechsel, Warten)\n' +
66
84
  '/accounts — Claude-Konten und OpenCode-Provider (wechseln, hinzufügen, neu anmelden, entfernen, verbinden, trennen)\n' +
67
85
  '/clear — Thread-Nachrichten löschen\n' +
68
- '/c /y /n /enter /up /down /tab /esc — TUI-Tasten (Claude)\n' +
69
- '/bind — Verknüpfung verwalten',
86
+ '/interrupt (/esc) — laufende Arbeit des Agenten stoppen; die nächste Nachricht steuert ihn um\n' +
87
+ '/c /y /n /enter /up /down /tab — TUI-Tasten (Claude)\n' +
88
+ '/bind — Verknüpfung verwalten\n' +
89
+ '/topic — weiteren Thread auf einem Ordner öffnen',
70
90
  'doctor.header': '🔍 *Charness Doctor*',
71
91
  'doctor.ok': '✅ {label}',
72
92
  'doctor.warn': '⚠️ {label} — {hint}',
@@ -195,6 +215,92 @@ exports.deDict = {
195
215
  'effort.general.choose': '⚙️ Standard-Effort für alle Themen: {current}\nJedes Thema ohne eigenen Effort läuft auf dieser Stufe; Themen mit eigenem Effort behalten ihn.',
196
216
  'effort.general.setConfirmation': '✅ Standard-Effort für alle Themen: {level}\nThemen mit eigenem Effort behalten ihn. Gilt ab dem nächsten Sitzungsstart oder Aufwecken jedes Themas — laufende Sitzungen werden nicht neu gestartet.',
197
217
  'effort.general.writeFailedNotice': '⚠️ Der Standard-Effort konnte nicht gespeichert werden: {path} ist nicht beschreibbar ({code}). Das Verzeichnis beschreibbar machen.',
218
+ 'update.updated.heading': '🔄 Charness aktualisiert: {from} → {to}',
219
+ 'update.updatedCommits.heading': '🔄 Charness aktualisiert: {from} → {to} ({count} Commits)',
220
+ 'update.nowRunning.heading': '🔄 Charness ist jetzt {to} (vorher {from})',
221
+ 'update.notes.todoLabel': 'Zu tun:',
222
+ 'update.notes.moreLine': '…und {count} weitere — CHANGELOG: {url}',
223
+ 'update.updateButton': '⬆️ Auf {version} aktualisieren',
224
+ 'update.notify': '⬆️ Charness {version} ist erschienen (du nutzt {running}).',
225
+ 'update.notifyManual': '⬆️ Charness {version} ist erschienen (du nutzt {running}).\nVon Hand aktualisieren: {command}',
226
+ 'update.offerMajor': '⚠️ Charness {version} ist eine Hauptversion — wird nicht von selbst installiert. Lies zuerst die Release Notes: {url}',
227
+ 'update.offerBreaking': '⚠️ Das Update auf {to} (du nutzt {from}) bringt eine Migrationsanleitung mit — wird nicht von selbst übernommen. Lies sie zuerst: {guides}',
228
+ 'update.needsNode': 'ℹ️ Charness {version} braucht Node {required}; diese Instanz läuft mit Node {running}, deshalb wird sie nicht installiert.',
229
+ 'update.installFailed': '⚠️ Automatisches Update auf {target} fehlgeschlagen: {reason}. Es läuft weiter {running}.\nVon Hand aktualisieren: {command}',
230
+ 'update.rollbackFailed': '🛑 Automatisches Update auf {target} fehlgeschlagen ({reason}) und auch der Weg zurück zur vorherigen Version scheiterte — der nächste Neustart startet womöglich nicht. Installation von Hand reparieren: {command}',
231
+ 'update.failed.install': 'die Installation wurde nicht abgeschlossen',
232
+ 'update.failed.start': 'die neue Version ist nicht gestartet',
233
+ 'update.failed.build': 'die neue Version ließ sich nicht bauen',
234
+ 'update.failed.boot': 'die neue Version scheiterte immer wieder beim Start',
235
+ 'update.checkFailing': '⚠️ Die Suche nach einer neuen Version schlägt fehl: {reason}. Ich versuche es stündlich weiter.',
236
+ 'update.featureAnnounced.on': 'ℹ️ Automatische Updates sind an — /update zum Ändern.',
237
+ 'update.featureAnnounced.notify': 'ℹ️ Charness meldet dir, wenn eine neue Version erscheint — /update zum Ändern.',
238
+ 'update.restartSupervisor': 'ℹ️ Dieses Update ändert den Supervisor selbst: starte `charness hot` einmal neu (Docker: `charness-restart-bot`), um es abzuschließen.',
239
+ 'update.screen.install.npm': 'Charness {version} · npm ({prefix})',
240
+ 'update.screen.install.git': 'Charness {version} · git @ {commit}',
241
+ 'update.screen.install.gitHot': 'Charness {version} · git @ {commit} · hot',
242
+ 'update.screen.install.ephemeral': 'Charness {version} · npx — nichts zu aktualisieren',
243
+ 'update.screen.install.notifyOnly.readOnlyPrefix': 'Charness {version} · npm, schreibgeschützter Ordner — kann nur benachrichtigen',
244
+ 'update.screen.install.notifyOnly.readOnlyCheckout': 'Charness {version} · git @ {commit}, schreibgeschützter Ordner — wird von Hand aktualisiert',
245
+ 'update.screen.install.notifyOnly.packageManager': 'Charness {version} · von einem anderen Paketmanager installiert — kann nur benachrichtigen',
246
+ 'update.screen.install.notifyOnly.localInstall': 'Charness {version} · projektlokale Installation — kann nur benachrichtigen',
247
+ 'update.screen.install.notifyOnly.noExecve': 'Charness {version} · dieses Node kann den Bot nicht an Ort und Stelle neu starten (braucht 22.15+, nicht Windows) — kann nur benachrichtigen',
248
+ 'update.screen.mode.on': 'Automatische Updates: AN — eine neue Version wird von selbst installiert, wenn der Bot frei ist; eine Hauptversion wird hier angeboten.',
249
+ 'update.screen.mode.notify': 'Automatische Updates: NUR BENACHRICHTIGEN — ich sage Bescheid, wenn eine neue Version da ist; du installierst sie per Tipp.',
250
+ 'update.screen.mode.off': 'Automatische Updates: AUS — ich prüfe nichts von selbst.',
251
+ 'update.screen.mode.onNotifyOnly': 'Automatische Updates: AN — aber diese Installation kann nur benachrichtigen.',
252
+ 'update.screen.whatsNew.on': 'Was ist neu nach einem Update: wird gezeigt',
253
+ 'update.screen.whatsNew.off': 'Was ist neu nach einem Update: wird nicht gezeigt',
254
+ 'update.screen.neverChecked': 'Noch nicht geprüft.',
255
+ 'update.screen.checked': 'Geprüft {ago} · {detail}',
256
+ 'update.screen.checkFailed': 'Prüfung fehlgeschlagen {ago}: {reason}',
257
+ 'update.screen.upToDate': 'aktuell',
258
+ 'update.screen.ago.justNow': 'gerade eben',
259
+ 'update.screen.ago.minutes': 'vor {count} Min.',
260
+ 'update.screen.ago.hours': 'vor {count} Std.',
261
+ 'update.screen.ago.days': 'vor {count} Tg.',
262
+ 'update.screen.offer.waitHoldAuto': '{version} ist da — wird von selbst ~{time} installiert, wenn der Bot frei ist',
263
+ 'update.screen.offer.waitHoldNotice': '{version} ist da — ich sage ~{time} Bescheid',
264
+ 'update.screen.offer.installWhenIdle': '{version} ist da — wird installiert, sobald der Bot frei ist',
265
+ 'update.screen.offer.notify': '{version} ist da',
266
+ 'update.screen.offer.notifyManual': '{version} ist da — von Hand aktualisieren',
267
+ 'update.screen.offer.major': '{version} ist eine Hauptversion — wird nicht von selbst installiert',
268
+ 'update.screen.offer.breaking': '{version} bringt eine Migrationsanleitung mit — wird nicht von selbst übernommen',
269
+ 'update.screen.offer.needsNode': '{version} braucht Node {required} (hier läuft {running})',
270
+ 'update.screen.skipped': 'übersprungen: {reason}',
271
+ 'update.screen.skip.dirty': 'lokale Änderungen im Checkout',
272
+ 'update.screen.skip.diverged': 'der Checkout hat eigene Commits',
273
+ 'update.screen.skip.noUpstream': 'der Branch folgt keinem Upstream',
274
+ 'update.screen.skip.inProgress': 'ein Merge oder Rebase läuft',
275
+ 'update.screen.skip.other': 'der Checkout bleibt unangetastet',
276
+ 'update.screen.phase.installing': 'Installiere {version}…',
277
+ 'update.screen.phase.restartPending': '{version} ist installiert — Neustart, sobald die laufenden Turns enden',
278
+ 'update.screen.phase.waitingForIdle': 'Warte, bis die laufenden Turns enden, dann wird {version} installiert',
279
+ 'update.screen.manual': 'Von Hand aktualisieren: {command}',
280
+ 'update.screen.changeInGeneral': 'Ändern: in General.',
281
+ 'update.screen.button.modeOn': 'Automatisch',
282
+ 'update.screen.button.modeNotify': 'Nur benachrichtigen',
283
+ 'update.screen.button.modeOff': 'Aus',
284
+ 'update.screen.button.whatsNewOn': '📰 Was ist neu: AN',
285
+ 'update.screen.button.whatsNewOff': '📰 Was ist neu: AUS',
286
+ 'update.screen.button.check': '🔄 Jetzt prüfen',
287
+ 'update.screen.button.updateNow': '⬆️ Jetzt auf {version} aktualisieren',
288
+ 'update.cmd.usage': 'Verwendung: /update — der Bildschirm; /update on|notify|off; /update whatsnew on|off; /update check; /update now.',
289
+ 'update.cmd.generalOnly': 'ℹ️ Ändern: in General.',
290
+ 'update.cmd.notReady': 'ℹ️ Der Updater startet noch — gleich nochmal versuchen.',
291
+ 'update.cmd.modeSet.on': '✅ Automatische Updates: an.',
292
+ 'update.cmd.modeSet.notify': '✅ Automatische Updates: nur benachrichtigen.',
293
+ 'update.cmd.modeSet.off': '✅ Automatische Updates: aus.',
294
+ 'update.cmd.whatsNewSet.on': '✅ Was ist neu nach einem Update: wird gezeigt.',
295
+ 'update.cmd.whatsNewSet.off': '✅ Was ist neu nach einem Update: wird nicht gezeigt.',
296
+ 'update.cmd.writeFailed': '⚠️ Die Einstellung konnte nicht gespeichert werden: {path} ist nicht beschreibbar ({code}). Mach das Verzeichnis beschreibbar.',
297
+ 'update.cmd.installStarted': '⬆️ Aktualisiere auf {version} — wird installiert, sobald kein Agent arbeitet.',
298
+ 'update.cmd.upToDate': 'ℹ️ Schon auf dem neuesten Stand.',
299
+ 'update.cmd.blocked': 'ℹ️ Nichts wurde aktualisiert — {reason}',
300
+ 'update.cmd.busy': 'ℹ️ Ein Update läuft bereits.',
301
+ 'update.cmd.cannotInstall': 'ℹ️ Diese Installation kann sich nicht selbst aktualisieren — von Hand aktualisieren (siehe /update).',
302
+ 'update.cmd.checking': 'Prüfe …',
303
+ 'version.updateAvailable': '⬆️ Update verfügbar: {version} — /update',
198
304
  'effort.set_success': '✅ Effort: {level}',
199
305
  'effort.current_hint': '⚙️ Effort: {effort}\nMit /effort änderbar',
200
306
  'effort.invalid_level': '⚠️ Stufe `{level}` ist ungültig. Verfügbar: {valid}.',
@@ -629,7 +735,7 @@ exports.deDict = {
629
735
  'apiRetry.resuming': '↻ Fortsetzen…',
630
736
  'apiRetry.conversationTailNotice': '↻ Der Anbieter hat den letzten Schritt abgelehnt — es geht weiter…',
631
737
  'apiRetry.limitResetResuming': '✅ Das Limit-Fenster wurde zurückgesetzt — ich setze die Arbeit in diesem Thema fort.',
632
- 'apiRetry.giveUp': '⚠️ Konnte nach {attempts} Versuchen nicht fortsetzen. Schreibe mir, wann ich weitermachen soll.',
738
+ 'apiRetry.giveUp': '⚠️ Konnte nicht fortsetzen (Versuche: {attempts}). Schreibe mir, wann ich weitermachen soll.',
633
739
  'apiRetry.continueNudge': 'Fahre von dort fort, wo du aufgehört hast.',
634
740
  'apiRetry.loggedOutClaude': '⚠️ Claude ist abgemeldet — führe /login aus, um fortzufahren.',
635
741
  'apiRetry.loggedOutOpenCode': '⚠️ OpenCode: ungültige Anmeldedaten — starte den opencode-Server neu.',