polygram 0.12.2 → 0.12.4

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.
@@ -763,19 +763,28 @@ class CliProcess extends Process {
763
763
  'DROPPED — it gets re-sent to you or flagged as a lost message. When unsure,',
764
764
  'include the id.',
765
765
  '',
766
- '### Staying responsive on a long task',
766
+ '### Staying responsive on a long task — show progress, never go silent',
767
767
  '',
768
- 'The user cannot see you working — no live typing reaches them. For any task',
769
- 'that takes more than a few seconds, send a SHORT status first via `reply`',
770
- '(it returns a `message_id`), then call `mcp__polygram-bridge__edit_message`',
771
- 'with that `message_id` to update the SAME bubble as you make progress,',
772
- 'finishing with the result. One evolving message beats silence or a flood of',
773
- 'new ones.',
768
+ 'The user sees NOTHING while you work — no inline text, no tool output reaches',
769
+ 'them. A turn that runs long with no reply looks BROKEN (they see only silence)',
770
+ 'and can hit the turn time-cap before you answer.',
774
771
  '',
775
- 'Write status in PLAIN, friendly language about what you are doing FOR THE',
776
- 'USER never tool names or mechanics. Say "Checking your config now…", not',
777
- '"Running Bash" or "Calling Read". If the final answer is long, send it as a',
778
- 'fresh `reply` rather than an edit (an edit is one single message bubble).',
772
+ 'So once you are clearly into multi-step work you have run a couple of tool',
773
+ 'calls without replying, or the request plainly needs research / several steps ',
774
+ 'send a SHORT one-line status via `reply` (it returns a `message_id`), then use',
775
+ '`mcp__polygram-bridge__edit_message` on that SAME `message_id` to update the',
776
+ 'bubble as you progress. `edit_message` is for INTERIM status ONLY.',
777
+ '',
778
+ 'Deliver the FINAL answer as a fresh `reply`, never as an edit: a fresh reply',
779
+ 'notifies the user and carries `consumed_turn_ids`; an edit does neither. If you',
780
+ 'no longer have the status bubble\'s message_id, just send a fresh `reply` —',
781
+ 'never guess an id.',
782
+ '',
783
+ 'If you will finish in one or two tool calls, just answer — no status bubble.',
784
+ 'Status is for work that takes time, not for quick answers (do not spam it).',
785
+ '',
786
+ 'Write status in PLAIN language about what you are doing FOR THE USER — never',
787
+ 'tool names. Say "Checking your config now…", not "Running Bash".',
779
788
  '',
780
789
  // TEMPORARY mitigation (2026-06-08 Shumabit@UMI wedge): AskUserQuestion opens
781
790
  // a blocking TUI selection widget the channel can't answer → the session
@@ -2132,6 +2141,22 @@ class CliProcess extends Process {
2132
2141
  backend: this.backend,
2133
2142
  });
2134
2143
  this._logEvent('turn-timeout', { turnTimeoutMs, reason });
2144
+ // 0.12.3 wedge characterization (docs/0.13-turn-wedge-autorecovery-spec.md):
2145
+ // a zero-reply turn hit the ceiling = claude wedged (no hooks AND no
2146
+ // "esc to interrupt" the whole window). Capture the TUI pane tail + busy
2147
+ // flags to learn WHAT state claude is stuck in (a tool, an unrecognized
2148
+ // prompt, the idle ❯, blank). Fire-and-forget: never blocks or changes
2149
+ // the kill path; the tmux session is still alive at this point.
2150
+ this.probeBusyState().then((probe) => {
2151
+ this._logEvent('turn-timeout-pane', {
2152
+ reason,
2153
+ streaming: probe.streaming,
2154
+ background_shell: probe.backgroundShell,
2155
+ shell_count: probe.shellCount,
2156
+ captured: probe.captured,
2157
+ pane_tail: probe.paneTail,
2158
+ });
2159
+ }).catch(() => { /* telemetry best-effort — never throws into the kill path */ });
2135
2160
  this.emit('idle');
2136
2161
  const err = new Error(`turn timeout (${turnTimeoutMs}ms, reason=${reason})`);
2137
2162
  err.code = 'TURN_TIMEOUT';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "polygram",
3
- "version": "0.12.2",
3
+ "version": "0.12.4",
4
4
  "description": "Telegram daemon for Claude Code that preserves the OpenClaw per-chat session model. Migration path for OpenClaw users moving to Claude Code.",
5
5
  "main": "lib/ipc/client.js",
6
6
  "bin": {