@totalreclaw/totalreclaw 3.3.9-rc.2 → 3.3.9-rc.3

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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,20 @@ All notable changes to `@totalreclaw/totalreclaw` (the OpenClaw plugin) are docu
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [3.3.9-rc.3] — 2026-05-05
8
+
9
+ Patch release silencing the verbose Telegram streaming output Pedro reported during 3.3.9-rc.2 manual QA ("Krilling… 🔧 Exec: run openclaw skills" repeated 3-4× per shell command in the same chat bubble).
10
+
11
+ ### Fixed
12
+
13
+ - **Telegram chat noise during agent runs:** OpenClaw 2026.5.x defaults `channels.telegram.streaming.mode` to a verbose preview mode that prints every mid-task tool-progress chunk into chat. The plugin's `patchOpenClawConfig()` now adds a third idempotent fix: when `channels.telegram.enabled === true` and `streaming.mode` is unset, default it to `"off"`. Existing explicit values (`"partial"`, `"block"`, `"progress"`) are preserved — only first-run defaults are touched. Restart required for the new key to take effect (logged via `api.logger.warn`).
14
+
15
+ ### Implementation notes
16
+
17
+ - `patchOpenClawConfig()` extended in `fs-helpers.ts` with Fix #3. Fully namespaced to Telegram — does not touch Discord, Slack, or other channels' streaming defaults.
18
+ - New tests in `fs-helpers.test.ts` cover: telegram enabled+streaming-unset (patched), streaming-exists-but-mode-missing (patched), explicit mode preserved (unchanged), telegram disabled (unchanged), telegram absent entirely (unchanged). 71/71 green.
19
+ - The same warn message that fired for slot/hooks now also covers streaming.mode in the `'patched'` path, so users see one restart prompt per first install.
20
+
7
21
  ## [3.3.9-rc.2] — 2026-05-02
8
22
 
9
23
  Patch release fixing the two OpenClaw 2026.5.x compatibility blockers discovered during 3.3.9-rc.1 auto-QA ([umbrella #224](https://github.com/p-diogo/totalreclaw-internal/issues/224)).
package/SKILL.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: totalreclaw
3
3
  description: "Install + set up TotalReclaw encrypted memory for OpenClaw, then use tr CLI for remember / recall. Trigger on 'install TotalReclaw', 'set up TotalReclaw', 'restore my recovery phrase', or any remember / recall request."
4
- version: 3.3.9-rc.2
4
+ version: 3.3.9-rc.3
5
5
  author: TotalReclaw Team
6
6
  license: MIT
7
7
  homepage: https://totalreclaw.xyz
@@ -930,8 +930,8 @@ export function resolveOnboardingState(credentialsPath, statePath) {
930
930
  return next;
931
931
  }
932
932
  /**
933
- * Auto-patch `~/.openclaw/openclaw.json` with the two entries required by
934
- * OpenClaw 2026.5.x for `kind: memory` plugins (issues #225 + #226):
933
+ * Auto-patch `~/.openclaw/openclaw.json` with the entries required by
934
+ * OpenClaw 2026.5.x for clean operation (issues #225 + #226 + verbosity):
935
935
  *
936
936
  * 1. `plugins.slots.memory = "totalreclaw"`
937
937
  * Claim the memory slot so the plugin loads instead of deferring to
@@ -943,6 +943,12 @@ export function resolveOnboardingState(credentialsPath, statePath) {
943
943
  * hooks for non-bundled plugins, disabling auto-extraction and
944
944
  * recall injection.
945
945
  *
946
+ * 3. `channels.telegram.streaming.mode = "off"` (only if unset)
947
+ * OpenClaw 2026.5.x defaults to a verbose streaming mode that prints
948
+ * every mid-task tool-progress preview into Telegram chat. Default
949
+ * this to "off" on first run for a clean UX. Existing explicit values
950
+ * ("partial", "block", "progress") are preserved.
951
+ *
946
952
  * Design constraints
947
953
  * ------------------
948
954
  * - SYNCHRONOUS — called during register() which must be sync.
@@ -1001,6 +1007,34 @@ export function patchOpenClawConfig(configPath) {
1001
1007
  cfg.plugins.entries.totalreclaw.hooks.allowConversationAccess = true;
1002
1008
  mutated = true;
1003
1009
  }
1010
+ // --- Fix #3: channels.telegram.streaming.mode = "off" (3.3.10-rc.1) ---
1011
+ //
1012
+ // OpenClaw 2026.5.x defaults to a verbose streaming mode that prints every
1013
+ // mid-task tool-progress preview into Telegram chat ("Krilling... 🔧 Exec:
1014
+ // run openclaw skills" repeated 3-4× per command). Pedro reported this on
1015
+ // 2026-05-05 with screenshots showing extreme noise during agent install.
1016
+ //
1017
+ // Fix: when the key is COMPLETELY UNSET, default it to "off". Power users
1018
+ // who explicitly chose "partial" / "progress" / "block" keep their setting
1019
+ // — we only intervene on first-run defaults.
1020
+ //
1021
+ // This is namespaced to telegram only; other channels (Discord, Slack)
1022
+ // keep their own defaults. We touch the Telegram subtree only if it's
1023
+ // already enabled (so we don't accidentally configure a channel the user
1024
+ // never set up).
1025
+ if (typeof cfg.channels === 'object' && cfg.channels !== null) {
1026
+ const tg = cfg.channels.telegram;
1027
+ if (typeof tg === 'object' && tg !== null && tg.enabled === true) {
1028
+ if (typeof tg.streaming !== 'object' || tg.streaming === null) {
1029
+ tg.streaming = { mode: 'off' };
1030
+ mutated = true;
1031
+ }
1032
+ else if (tg.streaming.mode === undefined) {
1033
+ tg.streaming.mode = 'off';
1034
+ mutated = true;
1035
+ }
1036
+ }
1037
+ }
1004
1038
  if (!mutated)
1005
1039
  return 'unchanged';
1006
1040
  // Write back with 2-space indent to match OpenClaw's own write style.
package/dist/index.js CHANGED
@@ -2546,7 +2546,13 @@ const plugin = {
2546
2546
  // agent_end and before_agent_start hooks. Without it, auto-
2547
2547
  // extraction and recall injection are silently disabled. #226.
2548
2548
  //
2549
- // The patch is idempotent if both keys are already correct the
2549
+ // 3. channels.telegram.streaming.mode = "off" (only if unset)
2550
+ // OpenClaw 2026.5.x defaults Telegram to a verbose streaming
2551
+ // mode that prints every mid-task tool-progress preview into
2552
+ // chat. Default this to "off" on first run for a clean UX.
2553
+ // Existing explicit values are preserved (3.3.10-rc.1).
2554
+ //
2555
+ // The patch is idempotent — if all keys are already correct the
2550
2556
  // file is not touched. When the file IS mutated a restart is
2551
2557
  // required for the new keys to take effect (OpenClaw reads
2552
2558
  // openclaw.json at startup, not dynamically). We emit a warn so
@@ -2555,7 +2561,8 @@ const plugin = {
2555
2561
  const patchResult = patchOpenClawConfig();
2556
2562
  if (patchResult === 'patched') {
2557
2563
  api.logger.warn('TotalReclaw: updated openclaw.json with required 2026.5.x keys ' +
2558
- '(plugins.slots.memory + hooks.allowConversationAccess). ' +
2564
+ '(plugins.slots.memory + hooks.allowConversationAccess + ' +
2565
+ 'channels.telegram.streaming.mode). ' +
2559
2566
  'Gateway restart required for the changes to take effect. ' +
2560
2567
  'Run `/totalreclaw-restart` or restart the gateway manually.');
2561
2568
  }
package/fs-helpers.ts CHANGED
@@ -1146,8 +1146,8 @@ export function resolveOnboardingState(
1146
1146
  export type OpenClawConfigPatchResult = 'patched' | 'unchanged' | 'skipped' | 'error';
1147
1147
 
1148
1148
  /**
1149
- * Auto-patch `~/.openclaw/openclaw.json` with the two entries required by
1150
- * OpenClaw 2026.5.x for `kind: memory` plugins (issues #225 + #226):
1149
+ * Auto-patch `~/.openclaw/openclaw.json` with the entries required by
1150
+ * OpenClaw 2026.5.x for clean operation (issues #225 + #226 + verbosity):
1151
1151
  *
1152
1152
  * 1. `plugins.slots.memory = "totalreclaw"`
1153
1153
  * Claim the memory slot so the plugin loads instead of deferring to
@@ -1159,6 +1159,12 @@ export type OpenClawConfigPatchResult = 'patched' | 'unchanged' | 'skipped' | 'e
1159
1159
  * hooks for non-bundled plugins, disabling auto-extraction and
1160
1160
  * recall injection.
1161
1161
  *
1162
+ * 3. `channels.telegram.streaming.mode = "off"` (only if unset)
1163
+ * OpenClaw 2026.5.x defaults to a verbose streaming mode that prints
1164
+ * every mid-task tool-progress preview into Telegram chat. Default
1165
+ * this to "off" on first run for a clean UX. Existing explicit values
1166
+ * ("partial", "block", "progress") are preserved.
1167
+ *
1162
1168
  * Design constraints
1163
1169
  * ------------------
1164
1170
  * - SYNCHRONOUS — called during register() which must be sync.
@@ -1225,6 +1231,34 @@ export function patchOpenClawConfig(
1225
1231
  mutated = true;
1226
1232
  }
1227
1233
 
1234
+ // --- Fix #3: channels.telegram.streaming.mode = "off" (3.3.10-rc.1) ---
1235
+ //
1236
+ // OpenClaw 2026.5.x defaults to a verbose streaming mode that prints every
1237
+ // mid-task tool-progress preview into Telegram chat ("Krilling... 🔧 Exec:
1238
+ // run openclaw skills" repeated 3-4× per command). Pedro reported this on
1239
+ // 2026-05-05 with screenshots showing extreme noise during agent install.
1240
+ //
1241
+ // Fix: when the key is COMPLETELY UNSET, default it to "off". Power users
1242
+ // who explicitly chose "partial" / "progress" / "block" keep their setting
1243
+ // — we only intervene on first-run defaults.
1244
+ //
1245
+ // This is namespaced to telegram only; other channels (Discord, Slack)
1246
+ // keep their own defaults. We touch the Telegram subtree only if it's
1247
+ // already enabled (so we don't accidentally configure a channel the user
1248
+ // never set up).
1249
+ if (typeof cfg.channels === 'object' && cfg.channels !== null) {
1250
+ const tg = cfg.channels.telegram;
1251
+ if (typeof tg === 'object' && tg !== null && tg.enabled === true) {
1252
+ if (typeof tg.streaming !== 'object' || tg.streaming === null) {
1253
+ tg.streaming = { mode: 'off' };
1254
+ mutated = true;
1255
+ } else if (tg.streaming.mode === undefined) {
1256
+ tg.streaming.mode = 'off';
1257
+ mutated = true;
1258
+ }
1259
+ }
1260
+ }
1261
+
1228
1262
  if (!mutated) return 'unchanged';
1229
1263
 
1230
1264
  // Write back with 2-space indent to match OpenClaw's own write style.
package/index.ts CHANGED
@@ -3125,7 +3125,13 @@ const plugin = {
3125
3125
  // agent_end and before_agent_start hooks. Without it, auto-
3126
3126
  // extraction and recall injection are silently disabled. #226.
3127
3127
  //
3128
- // The patch is idempotent if both keys are already correct the
3128
+ // 3. channels.telegram.streaming.mode = "off" (only if unset)
3129
+ // OpenClaw 2026.5.x defaults Telegram to a verbose streaming
3130
+ // mode that prints every mid-task tool-progress preview into
3131
+ // chat. Default this to "off" on first run for a clean UX.
3132
+ // Existing explicit values are preserved (3.3.10-rc.1).
3133
+ //
3134
+ // The patch is idempotent — if all keys are already correct the
3129
3135
  // file is not touched. When the file IS mutated a restart is
3130
3136
  // required for the new keys to take effect (OpenClaw reads
3131
3137
  // openclaw.json at startup, not dynamically). We emit a warn so
@@ -3135,7 +3141,8 @@ const plugin = {
3135
3141
  if (patchResult === 'patched') {
3136
3142
  api.logger.warn(
3137
3143
  'TotalReclaw: updated openclaw.json with required 2026.5.x keys ' +
3138
- '(plugins.slots.memory + hooks.allowConversationAccess). ' +
3144
+ '(plugins.slots.memory + hooks.allowConversationAccess + ' +
3145
+ 'channels.telegram.streaming.mode). ' +
3139
3146
  'Gateway restart required for the changes to take effect. ' +
3140
3147
  'Run `/totalreclaw-restart` or restart the gateway manually.',
3141
3148
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@totalreclaw/totalreclaw",
3
- "version": "3.3.9-rc.2",
3
+ "version": "3.3.9-rc.3",
4
4
  "description": "End-to-end encrypted, agent-portable memory for OpenClaw and any LLM-agent runtime. XChaCha20-Poly1305 with protobuf v4 + on-chain Memory Taxonomy v1 (claim / preference / directive / commitment / episode / summary).",
5
5
  "type": "module",
6
6
  "keywords": [
package/skill.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "totalreclaw",
3
- "version": "3.3.9-rc.2",
3
+ "version": "3.3.9-rc.3",
4
4
  "description": "End-to-end encrypted memory for AI agents — portable, yours forever. XChaCha20-Poly1305 E2EE: server never sees plaintext.",
5
5
  "author": "TotalReclaw Team",
6
6
  "license": "MIT",