codeam-cli 2.23.28 → 2.23.30

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,24 @@ 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.29] — 2026-05-30
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** DetectInputSuggestion skips Claude TUI box borders
12
+
13
+ ## [2.23.28] — 2026-05-30
14
+
15
+ ### Changed
16
+
17
+ - **cli:** Gate idle-suggestion seed on per-agent opt-in
18
+
19
+ ## [2.23.27] — 2026-05-30
20
+
21
+ ### Fixed
22
+
23
+ - **cli:** Seed idle-suggestion detector with the established screen
24
+
7
25
  ## [2.23.26] — 2026-05-30
8
26
 
9
27
  ### Chore
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.28",
444
+ version: "2.23.30",
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.28" : "0.0.0-dev",
5777
+ cliVersion: true ? "2.23.30" : "0.0.0-dev",
5778
5778
  nodeVersion: process.version,
5779
5779
  platform: process.platform,
5780
5780
  arch: process.arch,
@@ -9697,10 +9697,11 @@ function detectInputSuggestion(lines) {
9697
9697
  }
9698
9698
  if (hintIdx === -1) return null;
9699
9699
  if (lines.some((l) => /^[❯>]\s*\d+\./.test(l.trim()))) return null;
9700
- const windowStart = Math.max(0, hintIdx - 3);
9700
+ const windowStart = Math.max(0, hintIdx - 5);
9701
9701
  for (let i = hintIdx - 1; i >= windowStart; i--) {
9702
9702
  const t2 = lines[i].trim();
9703
9703
  if (!t2) continue;
9704
+ if (/^[─━═│┌┐└┘├┤┬┴┼]+$/u.test(t2)) continue;
9704
9705
  const m = t2.match(/^[❯>]\s+(\S.*)$/);
9705
9706
  if (!m) return null;
9706
9707
  if (/^\d+\.\s/.test(m[1])) return null;
@@ -15892,10 +15893,19 @@ var requestLinkCredentialsH = (ctx, _cmd, parsed) => {
15892
15893
  })();
15893
15894
  };
15894
15895
  var requestAiSummaryH = (ctx, _cmd, parsed) => {
15895
- if (!ctx.pluginAuthToken) return;
15896
- if (typeof ctx.runtime.generateOneShot !== "function") return;
15896
+ if (!ctx.pluginAuthToken) {
15897
+ log.info("ai-summary", "no pluginAuthToken \u2014 skipping");
15898
+ return;
15899
+ }
15900
+ if (typeof ctx.runtime.generateOneShot !== "function") {
15901
+ log.info("ai-summary", `runtime ${ctx.runtime.id} has no generateOneShot \u2014 skipping`);
15902
+ return;
15903
+ }
15897
15904
  if (!parsed.prompt || !parsed.turnId || !parsed.stats) {
15898
- log.trace("ai-summary", "missing prompt/turnId/stats \u2014 skipping");
15905
+ log.info(
15906
+ "ai-summary",
15907
+ `missing fields \u2014 prompt=${!!parsed.prompt} turnId=${!!parsed.turnId} stats=${!!parsed.stats}`
15908
+ );
15899
15909
  return;
15900
15910
  }
15901
15911
  const prompt = parsed.prompt;
@@ -15903,12 +15913,19 @@ var requestAiSummaryH = (ctx, _cmd, parsed) => {
15903
15913
  const stats = parsed.stats;
15904
15914
  const pluginAuthToken = ctx.pluginAuthToken;
15905
15915
  void (async () => {
15916
+ log.info("ai-summary", `generateOneShot start turnId=${turnId} promptLen=${prompt.length}`);
15917
+ const startedAt = Date.now();
15906
15918
  const text = await ctx.runtime.generateOneShot(prompt).catch((err) => {
15907
- log.trace("ai-summary", "generateOneShot threw", err);
15919
+ log.info("ai-summary", `generateOneShot threw: ${String(err)}`);
15908
15920
  return null;
15909
15921
  });
15910
- if (!text) return;
15911
- await postAiResult({
15922
+ const tookMs = Date.now() - startedAt;
15923
+ if (!text) {
15924
+ log.info("ai-summary", `generateOneShot returned null after ${tookMs}ms \u2014 skipping POST`);
15925
+ return;
15926
+ }
15927
+ log.info("ai-summary", `generateOneShot ok turnId=${turnId} took=${tookMs}ms textLen=${text.length}`);
15928
+ const result = await postAiResult({
15912
15929
  sessionId: ctx.sessionId,
15913
15930
  pluginId: ctx.pluginId,
15914
15931
  pluginAuthToken,
@@ -15917,26 +15934,47 @@ var requestAiSummaryH = (ctx, _cmd, parsed) => {
15917
15934
  summary: text,
15918
15935
  stats
15919
15936
  });
15937
+ if (result.ok) {
15938
+ log.info("ai-summary", `postAiResult ok turnId=${turnId}`);
15939
+ } else {
15940
+ log.info("ai-summary", `postAiResult failed status=${result.status} msg=${result.message}`);
15941
+ }
15920
15942
  })();
15921
15943
  };
15922
15944
  var requestAiInsightH = (ctx, _cmd, parsed) => {
15923
- if (!ctx.pluginAuthToken) return;
15924
- if (typeof ctx.runtime.generateOneShot !== "function") return;
15945
+ if (!ctx.pluginAuthToken) {
15946
+ log.info("ai-insight", "no pluginAuthToken \u2014 skipping");
15947
+ return;
15948
+ }
15949
+ if (typeof ctx.runtime.generateOneShot !== "function") {
15950
+ log.info("ai-insight", `runtime ${ctx.runtime.id} has no generateOneShot \u2014 skipping`);
15951
+ return;
15952
+ }
15925
15953
  if (!parsed.prompt || !parsed.fileChangeId) {
15926
- log.trace("ai-insight", "missing prompt/fileChangeId \u2014 skipping");
15954
+ log.info(
15955
+ "ai-insight",
15956
+ `missing fields \u2014 prompt=${!!parsed.prompt} fileChangeId=${!!parsed.fileChangeId}`
15957
+ );
15927
15958
  return;
15928
15959
  }
15929
15960
  const prompt = parsed.prompt;
15930
15961
  const fileChangeId = parsed.fileChangeId;
15931
15962
  const pluginAuthToken = ctx.pluginAuthToken;
15932
15963
  void (async () => {
15964
+ log.info("ai-insight", `generateOneShot start fileChangeId=${fileChangeId} promptLen=${prompt.length}`);
15965
+ const startedAt = Date.now();
15933
15966
  const text = await ctx.runtime.generateOneShot(prompt).catch((err) => {
15934
- log.trace("ai-insight", "generateOneShot threw", err);
15967
+ log.info("ai-insight", `generateOneShot threw: ${String(err)}`);
15935
15968
  return null;
15936
15969
  });
15937
- if (!text) return;
15970
+ const tookMs = Date.now() - startedAt;
15971
+ if (!text) {
15972
+ log.info("ai-insight", `generateOneShot returned null after ${tookMs}ms \u2014 skipping POST`);
15973
+ return;
15974
+ }
15975
+ log.info("ai-insight", `generateOneShot ok fileChangeId=${fileChangeId} took=${tookMs}ms textLen=${text.length}`);
15938
15976
  const { summary, reasoning, securityNote } = parseInsightText(text);
15939
- await postAiResult({
15977
+ const result = await postAiResult({
15940
15978
  sessionId: ctx.sessionId,
15941
15979
  pluginId: ctx.pluginId,
15942
15980
  pluginAuthToken,
@@ -15946,6 +15984,11 @@ var requestAiInsightH = (ctx, _cmd, parsed) => {
15946
15984
  reasoning,
15947
15985
  securityNote
15948
15986
  });
15987
+ if (result.ok) {
15988
+ log.info("ai-insight", `postAiResult ok fileChangeId=${fileChangeId}`);
15989
+ } else {
15990
+ log.info("ai-insight", `postAiResult failed status=${result.status} msg=${result.message}`);
15991
+ }
15949
15992
  })();
15950
15993
  };
15951
15994
  function parseInsightText(text) {
@@ -18916,7 +18959,7 @@ function checkChokidar() {
18916
18959
  }
18917
18960
  async function doctor(args2 = []) {
18918
18961
  const json = args2.includes("--json");
18919
- const cliVersion = true ? "2.23.28" : "0.0.0-dev";
18962
+ const cliVersion = true ? "2.23.30" : "0.0.0-dev";
18920
18963
  const apiBase = resolveApiBaseUrl();
18921
18964
  const diagnosticId = (0, import_node_crypto6.randomUUID)();
18922
18965
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -19115,7 +19158,7 @@ async function completion(args2) {
19115
19158
  // src/commands/version.ts
19116
19159
  var import_picocolors13 = __toESM(require("picocolors"));
19117
19160
  function version2() {
19118
- const v = true ? "2.23.28" : "unknown";
19161
+ const v = true ? "2.23.30" : "unknown";
19119
19162
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
19120
19163
  }
19121
19164
 
@@ -19343,7 +19386,7 @@ function checkForUpdates() {
19343
19386
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
19344
19387
  if (process.env.CI) return;
19345
19388
  if (!process.stdout.isTTY) return;
19346
- const current = true ? "2.23.28" : null;
19389
+ const current = true ? "2.23.30" : null;
19347
19390
  if (!current) return;
19348
19391
  const cache = readCache();
19349
19392
  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.28",
3
+ "version": "2.23.30",
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",