polygram 0.8.0-rc.26 → 0.8.0-rc.28

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://anthropic.com/claude-code/plugin.schema.json",
3
3
  "name": "polygram",
4
- "version": "0.8.0-rc.26",
4
+ "version": "0.8.0-rc.28",
5
5
  "description": "Telegram integration for Claude Code that preserves the OpenClaw per-chat session model. Migration target for OpenClaw users. Multi-bot, multi-chat, per-topic isolation; SQLite transcripts; inline-keyboard approvals. Bundles /polygram:status|logs|pair-code|approvals admin commands and a history skill.",
6
6
  "keywords": [
7
7
  "telegram",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "polygram",
3
- "version": "0.8.0-rc.26",
3
+ "version": "0.8.0-rc.28",
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": {
package/polygram.js CHANGED
@@ -3730,6 +3730,18 @@ async function main() {
3730
3730
  };
3731
3731
  process.on('SIGINT', shutdown);
3732
3732
  process.on('SIGTERM', shutdown);
3733
+ // rc.28: also catch SIGHUP. The shumabit deploy path runs polygram
3734
+ // inside `tmux new-session`; on `launchctl kickstart -k` the
3735
+ // shumabit-start launcher does `tmux kill-session -t polygram`
3736
+ // FIRST, then `pkill polygram --bot` 1s later. tmux kill-session
3737
+ // closes polygram's controlling pty → SIGHUP, not SIGTERM. Without
3738
+ // this listener, the shutdown drain never fires; in-flight rows
3739
+ // never flip to 'replay-pending'; boot-replay still picks them up
3740
+ // via the 'dispatched' status (3-min window), but anything that's
3741
+ // been mid-tool-use longer than the replayWindowMs gets silently
3742
+ // dropped. Surface symptom: bot stops responding after deploy on
3743
+ // long agent runs (the §7.4 incident).
3744
+ process.on('SIGHUP', shutdown);
3733
3745
 
3734
3746
  try {
3735
3747
  // Fresh per-boot secret, persisted 0600 for same-UID readers (cron
package/scripts/doctor.js CHANGED
@@ -238,8 +238,13 @@ function checkPendingOutbound(db) {
238
238
  function checkApprovals(db) {
239
239
  if (!db) return;
240
240
  try {
241
+ // Table is `pending_approvals` (migrations/004-approvals.sql).
242
+ // Pre-rc.27 this query was `FROM approvals` — a typo that caused
243
+ // every doctor run to silently land in the catch and emit
244
+ // "skipped: no such table: approvals" warnings instead of real
245
+ // pending counts.
241
246
  const row = db.prepare(`
242
- SELECT COUNT(*) AS n FROM approvals
247
+ SELECT COUNT(*) AS n FROM pending_approvals
243
248
  WHERE status = 'pending' AND bot_name = ?
244
249
  `).get(botName);
245
250
  if (row.n > 0) {