codeam-cli 2.23.25 → 2.23.26

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,12 @@ All notable changes to `codeam-cli` are documented here.
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
+ ## [2.23.25] — 2026-05-30
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Poll for input_suggestion after turn finalises
12
+
7
13
  ## [2.23.24] — 2026-05-30
8
14
 
9
15
  ### Added
package/dist/index.js CHANGED
@@ -441,7 +441,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
441
441
  // package.json
442
442
  var package_default = {
443
443
  name: "codeam-cli",
444
- version: "2.23.25",
444
+ version: "2.23.26",
445
445
  description: "Workflow-continuity bridge for AI coding agents. Wrap Claude Code or Codex in a PTY and supervise, approve, and redirect the session from any device \u2014 async. The terminal companion for CodeAgent Mobile.",
446
446
  type: "commonjs",
447
447
  main: "dist/index.js",
@@ -5774,7 +5774,7 @@ function readAnonId() {
5774
5774
  }
5775
5775
  function superProperties() {
5776
5776
  return {
5777
- cliVersion: true ? "2.23.25" : "0.0.0-dev",
5777
+ cliVersion: true ? "2.23.26" : "0.0.0-dev",
5778
5778
  nodeVersion: process.version,
5779
5779
  platform: process.platform,
5780
5780
  arch: process.arch,
@@ -11915,7 +11915,7 @@ var OutputService = class _OutputService {
11915
11915
  this.terminalTurnPending = true;
11916
11916
  this.onTerminalTurnDetected?.();
11917
11917
  }
11918
- log.trace("outputSvc", `push dropped (inactive, ${raw.length}B)`);
11918
+ this.detectIdleSuggestion(raw);
11919
11919
  return;
11920
11920
  }
11921
11921
  log.trace(
@@ -11925,6 +11925,36 @@ var OutputService = class _OutputService {
11925
11925
  this.tryExtractSessionId(raw);
11926
11926
  this.tryDetectRateLimit(raw);
11927
11927
  }
11928
+ /**
11929
+ * Idle-window accumulator. PtyBuffer wipes its `raw` on
11930
+ * `deactivate()` to keep next-turn renders clean, so the
11931
+ * post-finalize PTY redraw frames don't live in `this.pty.content`.
11932
+ * We mirror them here only for the suggestion detector — a tiny
11933
+ * window of trailing bytes is enough for renderToLines to surface
11934
+ * the last frame. Cleared on every `beginTurn()`.
11935
+ */
11936
+ idleBuffer = "";
11937
+ static IDLE_BUFFER_MAX = 32 * 1024;
11938
+ detectIdleSuggestion(raw) {
11939
+ if (!this.runtime.detectInputSuggestion) return;
11940
+ this.idleBuffer += raw;
11941
+ if (this.idleBuffer.length > _OutputService.IDLE_BUFFER_MAX) {
11942
+ this.idleBuffer = this.idleBuffer.slice(-_OutputService.IDLE_BUFFER_MAX);
11943
+ }
11944
+ const rendered = this.runtime.renderToLines?.(this.idleBuffer) ?? renderLines(this.idleBuffer);
11945
+ const suggestion = this.runtime.detectInputSuggestion(rendered);
11946
+ if (suggestion === this.lastSentSuggestion) return;
11947
+ this.lastSentSuggestion = suggestion;
11948
+ this.send(
11949
+ {
11950
+ type: "input_suggestion",
11951
+ content: suggestion ?? "",
11952
+ done: true
11953
+ },
11954
+ { critical: false }
11955
+ ).catch(() => {
11956
+ });
11957
+ }
11928
11958
  dispose() {
11929
11959
  this.stopPoll();
11930
11960
  this.pty.deactivate();
@@ -11936,6 +11966,7 @@ var OutputService = class _OutputService {
11936
11966
  this.steps.reset();
11937
11967
  this.lastSentContent = "";
11938
11968
  this.lastContentChangeAt = 0;
11969
+ this.idleBuffer = "";
11939
11970
  this.startTime = Date.now();
11940
11971
  this.pollTimer = setInterval(() => this.tick(), _OutputService.POLL_MS);
11941
11972
  }
@@ -12138,40 +12169,8 @@ var OutputService = class _OutputService {
12138
12169
  ).catch(() => {
12139
12170
  });
12140
12171
  this.onTurnComplete?.();
12141
- this.scheduleSuggestionPoll();
12142
12172
  }
12143
12173
  }
12144
- /**
12145
- * Poll for an `input_suggestion` chunk a few times after a
12146
- * turn finalises. The TUI takes a beat to render the ghost
12147
- * completion, so a single check at finalize-time would miss
12148
- * it. Three checks at 400/800/1500 ms cover the window
12149
- * without burning CPU when there's no suggestion (each tick
12150
- * is cheap — a regex over the rendered lines).
12151
- */
12152
- scheduleSuggestionPoll() {
12153
- if (!this.runtime.detectInputSuggestion) return;
12154
- const tryDetect = () => {
12155
- if (!this.runtime.detectInputSuggestion) return;
12156
- const rendered = this.runtime.renderToLines?.(this.pty.content) ?? renderLines(this.pty.content);
12157
- const suggestion = this.runtime.detectInputSuggestion(rendered);
12158
- if (suggestion !== this.lastSentSuggestion) {
12159
- this.lastSentSuggestion = suggestion;
12160
- this.send(
12161
- {
12162
- type: "input_suggestion",
12163
- content: suggestion ?? "",
12164
- done: true
12165
- },
12166
- { critical: false }
12167
- ).catch(() => {
12168
- });
12169
- }
12170
- };
12171
- setTimeout(tryDetect, 400);
12172
- setTimeout(tryDetect, 800);
12173
- setTimeout(tryDetect, 1500);
12174
- }
12175
12174
  // ─── Side-channel observation (session id + rate limit) ──────────
12176
12175
  tryExtractSessionId(text) {
12177
12176
  if (!this.onSessionIdDetected) return;
@@ -18908,7 +18907,7 @@ function checkChokidar() {
18908
18907
  }
18909
18908
  async function doctor(args2 = []) {
18910
18909
  const json = args2.includes("--json");
18911
- const cliVersion = true ? "2.23.25" : "0.0.0-dev";
18910
+ const cliVersion = true ? "2.23.26" : "0.0.0-dev";
18912
18911
  const apiBase = resolveApiBaseUrl();
18913
18912
  const diagnosticId = (0, import_node_crypto6.randomUUID)();
18914
18913
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -19107,7 +19106,7 @@ async function completion(args2) {
19107
19106
  // src/commands/version.ts
19108
19107
  var import_picocolors13 = __toESM(require("picocolors"));
19109
19108
  function version2() {
19110
- const v = true ? "2.23.25" : "unknown";
19109
+ const v = true ? "2.23.26" : "unknown";
19111
19110
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
19112
19111
  }
19113
19112
 
@@ -19335,7 +19334,7 @@ function checkForUpdates() {
19335
19334
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
19336
19335
  if (process.env.CI) return;
19337
19336
  if (!process.stdout.isTTY) return;
19338
- const current = true ? "2.23.25" : null;
19337
+ const current = true ? "2.23.26" : null;
19339
19338
  if (!current) return;
19340
19339
  const cache = readCache();
19341
19340
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.23.25",
3
+ "version": "2.23.26",
4
4
  "description": "Workflow-continuity bridge for AI coding agents. Wrap Claude Code or Codex in a PTY and supervise, approve, and redirect the session from any device — async. The terminal companion for CodeAgent Mobile.",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",