codeam-cli 2.23.14 → 2.23.15

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.13] — 2026-05-28
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Pair-auto stays alive in heartbeat-only mode on CODEAM_SKIP_AGENT_LAUNCH
12
+
7
13
  ## [2.23.12] — 2026-05-27
8
14
 
9
15
  ### Fixed
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.14",
444
+ version: "2.23.15",
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.14" : "0.0.0-dev",
5777
+ cliVersion: true ? "2.23.15" : "0.0.0-dev",
5778
5778
  nodeVersion: process.version,
5779
5779
  platform: process.platform,
5780
5780
  arch: process.arch,
@@ -10300,36 +10300,43 @@ function wrapCodexCodeBlocks(lines) {
10300
10300
  function parseCodexChrome(_line) {
10301
10301
  return null;
10302
10302
  }
10303
+ var CODEX_OPTION_RE = /^\s*([>›]\s+)?(\d+)\.\s+(.+)/;
10304
+ var CODEX_OPTION_START_RE = /^\s*(?:[>›]\s+)?\d+\.\s/;
10305
+ var CODEX_FOOTER_RE = /\bpress\s+enter\s+to\s+(?:confirm|continue|select)\b/i;
10303
10306
  function detectCodexSelector(lines) {
10304
- const hasConfirmTrailer = lines.some(
10305
- (l) => /press\s+enter\s+to\s+confirm/i.test(l)
10306
- );
10307
- if (!hasConfirmTrailer) return null;
10307
+ for (let i = lines.length - 1; i >= 0; i--) {
10308
+ const t2 = lines[i].trim();
10309
+ if (!t2) continue;
10310
+ if (/^[›>]\s*$/.test(t2) || /^▌\s*$/.test(t2)) return null;
10311
+ if (/^send:\s*⏎|^esc to interrupt/i.test(t2)) return null;
10312
+ break;
10313
+ }
10308
10314
  let optionStartIdx = -1;
10309
10315
  for (let i = 0; i < lines.length; i++) {
10310
- if (/^\s*(?:>\s+)?\d+\.\s/.test(lines[i])) {
10316
+ if (CODEX_OPTION_START_RE.test(lines[i])) {
10311
10317
  optionStartIdx = i;
10312
10318
  break;
10313
10319
  }
10314
10320
  }
10315
10321
  if (optionStartIdx === -1) return null;
10316
- const questionParts = [];
10317
- for (let i = 0; i < optionStartIdx; i++) {
10318
- const t2 = lines[i].trim();
10319
- if (!t2) continue;
10320
- if (/^[>›]\s*$/.test(t2)) continue;
10321
- questionParts.push(t2);
10322
- }
10323
- const question = questionParts.join("\n").trim();
10324
10322
  const optionLabels = /* @__PURE__ */ new Map();
10325
10323
  let cursorIndex = 0;
10326
10324
  let hasCursor = false;
10325
+ let footerAfterOptions = false;
10326
+ let lastOptionLineIdx = optionStartIdx;
10327
10327
  for (let i = optionStartIdx; i < lines.length; i++) {
10328
- const t2 = lines[i].trim();
10328
+ const raw = lines[i];
10329
+ const t2 = raw.trim();
10329
10330
  if (!t2) continue;
10330
- if (/^press\s+enter\s+to\s+confirm/i.test(t2)) break;
10331
- const m = t2.match(/^(>\s+)?(\d+)\.\s+(.+)/);
10332
- if (!m) continue;
10331
+ if (CODEX_FOOTER_RE.test(t2)) {
10332
+ footerAfterOptions = true;
10333
+ break;
10334
+ }
10335
+ const m = t2.match(CODEX_OPTION_RE);
10336
+ if (!m) {
10337
+ if (i - lastOptionLineIdx > 2) break;
10338
+ continue;
10339
+ }
10333
10340
  const num = parseInt(m[2], 10);
10334
10341
  if (!optionLabels.has(num)) {
10335
10342
  optionLabels.set(num, m[3].trim());
@@ -10338,9 +10345,22 @@ function detectCodexSelector(lines) {
10338
10345
  hasCursor = true;
10339
10346
  }
10340
10347
  }
10348
+ lastOptionLineIdx = i;
10341
10349
  }
10342
10350
  const keys = [...optionLabels.keys()].sort((a, b) => a - b);
10343
10351
  if (keys.length < 2 || keys[0] !== 1) return null;
10352
+ const questionParts = [];
10353
+ for (let i = 0; i < optionStartIdx; i++) {
10354
+ const t2 = lines[i].trim();
10355
+ if (!t2) continue;
10356
+ if (/^[>›]\s*$/.test(t2)) continue;
10357
+ questionParts.push(t2);
10358
+ }
10359
+ const question = questionParts.join("\n").trim();
10360
+ const questionEndsWithQuery = /\?\s*$/.test(question);
10361
+ if (!hasCursor && !(questionEndsWithQuery && footerAfterOptions)) {
10362
+ return null;
10363
+ }
10344
10364
  return {
10345
10365
  question,
10346
10366
  options: keys.map((k2) => optionLabels.get(k2)),
@@ -18720,7 +18740,7 @@ function checkChokidar() {
18720
18740
  }
18721
18741
  async function doctor(args2 = []) {
18722
18742
  const json = args2.includes("--json");
18723
- const cliVersion = true ? "2.23.14" : "0.0.0-dev";
18743
+ const cliVersion = true ? "2.23.15" : "0.0.0-dev";
18724
18744
  const apiBase = resolveApiBaseUrl();
18725
18745
  const diagnosticId = (0, import_node_crypto5.randomUUID)();
18726
18746
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -18919,7 +18939,7 @@ async function completion(args2) {
18919
18939
  // src/commands/version.ts
18920
18940
  var import_picocolors13 = __toESM(require("picocolors"));
18921
18941
  function version2() {
18922
- const v = true ? "2.23.14" : "unknown";
18942
+ const v = true ? "2.23.15" : "unknown";
18923
18943
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
18924
18944
  }
18925
18945
 
@@ -19147,7 +19167,7 @@ function checkForUpdates() {
19147
19167
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
19148
19168
  if (process.env.CI) return;
19149
19169
  if (!process.stdout.isTTY) return;
19150
- const current = true ? "2.23.14" : null;
19170
+ const current = true ? "2.23.15" : null;
19151
19171
  if (!current) return;
19152
19172
  const cache = readCache();
19153
19173
  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.14",
3
+ "version": "2.23.15",
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",