claude-threads 1.8.0 → 1.8.2

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
@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.8.2] - 2026-04-22
9
+
10
+ ### Breaking
11
+ - **Minimum Node.js bumped from 18 to 20.** Required by `@hono/node-server@2`. Node 18 has been past end-of-life since April 2025, so most installs are already on 20+. (#335)
12
+
13
+ ### Fixed
14
+ - **Plain reply could no longer resume a paused session after bot restart** — when the bot restarted more than 2× `sessionTimeoutMinutes` after a session's last activity, `cleanStale()` soft-deleted the paused record. The reply-resume path used `load()` (which hides soft-deleted sessions), so a user reply in the thread promised by the timeout message (`send a new message to continue`) fell through to the `Mention me with your request` branch and a subsequent @mention started a fresh session, losing thread context. The 🔄 reaction path never had this problem because it reads raw data via `findByPostId`. The two resume paths now share the same visibility into the 3-day history window. (#336, thanks @shaders)
15
+ - **Flaky `MAX_SESSIONS Limit` integration test** — the Mattermost docker container in CI throws transient 500s on `/posts` that trigger ~1.5s of retry backoff per call. Six sequential session starts under that overhead pushed at least one `waitForSessionActive` past its 10s deadline ~30-50% of runs. The test now uses a 20s per-step budget under `CI`. The race the test guards (`maxSessions` cap, fixed in v1.7.1 / #331) is unchanged. (#337)
16
+
17
+ ### Changed
18
+ - **Dependencies** — `@hono/node-server` 1.19.14 → 2.0.0 (#335), `eslint` 10.2.0 → 10.2.1, `prettier` 3.8.2 → 3.8.3, `typescript` 6.0.2 → 6.0.3, `typescript-eslint` 8.58.2 → 8.59.0 (#334).
19
+
20
+ ## [1.8.1] - 2026-04-21
21
+
22
+ ### Fixed
23
+ - **Interactive users silently demoted to headless when `autoUpdate` was enabled** — the auto-restart daemon runs the child as a bash background job (`&`), which leaves stdout piped and stdin detached. Ink can't render there, so the TUI dropped out without any error. Three prior patches (#287, #300, #317) each fixed the active crash mode inside the daemon path; none questioned whether interactive users should be routed through the daemon at all. The daemon is now skipped when `process.stdout.isTTY` and `--headless` isn't set. Unattended paths (explicit `--auto-restart`, `--headless`, or no TTY) still go through the daemon. (#333)
24
+
8
25
  ## [1.8.0] - 2026-04-21
9
26
 
10
27
  ### Added
package/dist/index.js CHANGED
@@ -53511,6 +53511,15 @@ class SessionStore {
53511
53511
  const data = this.loadRaw();
53512
53512
  return data.sessions[sessionId];
53513
53513
  }
53514
+ findByThreadIdAnyState(threadId) {
53515
+ const data = this.loadRaw();
53516
+ for (const session of Object.values(data.sessions)) {
53517
+ if (session.threadId === threadId) {
53518
+ return session;
53519
+ }
53520
+ }
53521
+ return;
53522
+ }
53514
53523
  findByPostId(platformId, postId) {
53515
53524
  const data = this.loadRaw();
53516
53525
  for (const session of Object.values(data.sessions)) {
@@ -68387,13 +68396,7 @@ class SessionRegistry {
68387
68396
  return this.sessionStore.findByThread(platformId, threadId);
68388
68397
  }
68389
68398
  getPersistedByThreadId(threadId) {
68390
- const all = this.sessionStore.load();
68391
- for (const session of all.values()) {
68392
- if (session.threadId === threadId) {
68393
- return session;
68394
- }
68395
- }
68396
- return;
68399
+ return this.sessionStore.findByThreadIdAnyState(threadId);
68397
68400
  }
68398
68401
  getSessionStore() {
68399
68402
  return this.sessionStore;
@@ -79900,6 +79903,8 @@ async function main() {
79900
79903
  return false;
79901
79904
  if (opts.autoRestart === true)
79902
79905
  return true;
79906
+ if (!isHeadless && process.stdout.isTTY)
79907
+ return false;
79903
79908
  if (await configExists()) {
79904
79909
  try {
79905
79910
  const config = loadConfigWithMigration();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-threads",
3
- "version": "1.8.0",
3
+ "version": "1.8.2",
4
4
  "description": "Share Claude Code sessions live in a Mattermost channel with interactive features",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -63,7 +63,7 @@
63
63
  "package.json"
64
64
  ],
65
65
  "dependencies": {
66
- "@hono/node-server": "^1.19.11",
66
+ "@hono/node-server": "^2.0.0",
67
67
  "@inkjs/ui": "^2.0.0",
68
68
  "@modelcontextprotocol/sdk": "^1.26.0",
69
69
  "@redactpii/node": "^1.0.16",
@@ -104,7 +104,7 @@
104
104
  "yazl": "^3.3.1"
105
105
  },
106
106
  "engines": {
107
- "node": ">=18.0.0",
107
+ "node": ">=20.0.0",
108
108
  "bun": ">=1.2.21"
109
109
  },
110
110
  "lint-staged": {