codeam-cli 2.12.11 → 2.12.12

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,14 @@ 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.12.11] — 2026-05-14
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Codex-specific renderer with DECSTBM scroll-region support — captures full multi-paragraph replies
12
+
13
+ ## [2.12.10] — 2026-05-14
14
+
7
15
  ## [2.12.9] — 2026-05-14
8
16
 
9
17
  ### Fixed
package/dist/index.js CHANGED
@@ -1682,7 +1682,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
1682
1682
  // package.json
1683
1683
  var package_default = {
1684
1684
  name: "codeam-cli",
1685
- version: "2.12.11",
1685
+ version: "2.12.12",
1686
1686
  description: "Remote control Claude Code (and other AI coding agents) from your mobile phone. Pair your device, send prompts, stream responses in real-time, and approve commands \u2014 from anywhere.",
1687
1687
  type: "commonjs",
1688
1688
  main: "dist/index.js",
@@ -5834,6 +5834,7 @@ function filterCodexChrome(lines) {
5834
5834
  }
5835
5835
  out.push(t2);
5836
5836
  }
5837
+ const wrapped = wrapCodexCodeBlocks(out);
5837
5838
  const hasRealInput = lines.some((l) => /\w/.test(l));
5838
5839
  if (out.length > 0 || hasRealInput) {
5839
5840
  const sampleIn = lines.slice(-50).map((l, i) => ` in[${i}] ${JSON.stringify(l)}`).join("\n");
@@ -5845,7 +5846,77 @@ ${sampleOut}`);
5845
5846
  } else {
5846
5847
  log.trace("codex-parse", `filterCodexChrome in=${lines.length} out=${out.length}`);
5847
5848
  }
5848
- return out;
5849
+ return wrapped;
5850
+ }
5851
+ var CODE_CHAR_RE = /[;{}]|=>|^\s*(?:import|public|private|static|class|function|interface|type|const|let|var|def|return|if|else|for|while)\b/;
5852
+ function inferLanguage(block) {
5853
+ const head = block.slice(0, 10).join("\n");
5854
+ if (/\bpublic\s+(?:static\s+)?(?:class|void|int|String)\b|System\.out\.println|\bjava\.util/.test(head)) return "java";
5855
+ if (/\b(?:interface|type)\s+\w+\s*=?\s*[{<]|\bas\s+(?:string|number|boolean)\b|\b(?:string|number|boolean)\s*[;,)\]]/.test(head)) return "typescript";
5856
+ if (/\bimport\s+\w+\s+from\s+['"]|=>\s*[{(]|\bconst\s+\w+\s*=\s*(?:async\s+)?\(/.test(head)) return "javascript";
5857
+ if (/^\s*def\s+\w+\(|^\s*from\s+\w+\s+import|print\(/m.test(head)) return "python";
5858
+ if (/^\s*package\s+\w+|^\s*func\s+\w+\(|\binterface\s*{/m.test(head)) return "go";
5859
+ if (/^\s*fn\s+\w+\(|^\s*use\s+\w+::|^\s*impl\s+/m.test(head)) return "rust";
5860
+ if (/#include\s*<|int\s+main\s*\(/.test(head)) return "cpp";
5861
+ return "";
5862
+ }
5863
+ function wrapCodexCodeBlocks(lines) {
5864
+ const result = [];
5865
+ let i = 0;
5866
+ while (i < lines.length) {
5867
+ const line = lines[i];
5868
+ if (!CODE_CHAR_RE.test(line)) {
5869
+ result.push(line);
5870
+ i++;
5871
+ continue;
5872
+ }
5873
+ const start2 = i;
5874
+ let end = i;
5875
+ let j2 = i + 1;
5876
+ while (j2 < lines.length) {
5877
+ const l = lines[j2];
5878
+ if (CODE_CHAR_RE.test(l)) {
5879
+ end = j2;
5880
+ j2++;
5881
+ continue;
5882
+ }
5883
+ if (l.trim() === "") {
5884
+ let k2 = j2 + 1;
5885
+ while (k2 < lines.length && lines[k2].trim() === "") k2++;
5886
+ if (k2 < lines.length && CODE_CHAR_RE.test(lines[k2])) {
5887
+ end = k2;
5888
+ j2 = k2 + 1;
5889
+ continue;
5890
+ }
5891
+ break;
5892
+ }
5893
+ if (/^\s{2,}\S/.test(l)) {
5894
+ end = j2;
5895
+ j2++;
5896
+ continue;
5897
+ }
5898
+ break;
5899
+ }
5900
+ const runLen = end - start2 + 1;
5901
+ const codeShapedCount = lines.slice(start2, end + 1).filter((l) => CODE_CHAR_RE.test(l)).length;
5902
+ if (codeShapedCount >= 3) {
5903
+ const body = lines.slice(start2, end + 1);
5904
+ const lang = inferLanguage(body);
5905
+ result.push("```" + lang);
5906
+ for (const l of body) result.push(l);
5907
+ while (result.length > 0 && result[result.length - 1].trim() === "") {
5908
+ result.pop();
5909
+ }
5910
+ result.push("```");
5911
+ i = end + 1;
5912
+ } else {
5913
+ for (let k2 = start2; k2 <= end && k2 < lines.length; k2++) result.push(lines[k2]);
5914
+ i = end + 1;
5915
+ if (i === start2) i++;
5916
+ }
5917
+ void runLen;
5918
+ }
5919
+ return result;
5849
5920
  }
5850
5921
  function parseCodexChrome(_line) {
5851
5922
  return null;
@@ -10314,7 +10385,7 @@ async function stopWorkspaceFromLocal(target) {
10314
10385
  // src/commands/version.ts
10315
10386
  var import_picocolors11 = __toESM(require("picocolors"));
10316
10387
  function version() {
10317
- const v = true ? "2.12.11" : "unknown";
10388
+ const v = true ? "2.12.12" : "unknown";
10318
10389
  console.log(`${import_picocolors11.default.bold("codeam-cli")} ${import_picocolors11.default.cyan(v)}`);
10319
10390
  }
10320
10391
 
@@ -10449,7 +10520,7 @@ function checkForUpdates() {
10449
10520
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
10450
10521
  if (process.env.CI) return;
10451
10522
  if (!process.stdout.isTTY) return;
10452
- const current = true ? "2.12.11" : null;
10523
+ const current = true ? "2.12.12" : null;
10453
10524
  if (!current) return;
10454
10525
  const cache = readCache();
10455
10526
  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.12.11",
3
+ "version": "2.12.12",
4
4
  "description": "Remote control Claude Code (and other AI coding agents) from your mobile phone. Pair your device, send prompts, stream responses in real-time, and approve commands — from anywhere.",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",