codeam-cli 2.23.19 → 2.23.21
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 +12 -0
- package/dist/index.js +50 -8
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,18 @@ 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.20] — 2026-05-30
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** Claude selector — match `<n>.Label` (no space after the dot)
|
|
12
|
+
|
|
13
|
+
## [2.23.19] — 2026-05-30
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **cli:** Serialise prompt submissions while agent is busy
|
|
18
|
+
|
|
7
19
|
## [2.23.18] — 2026-05-28
|
|
8
20
|
|
|
9
21
|
### CI
|
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.
|
|
444
|
+
version: "2.23.21",
|
|
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.
|
|
5777
|
+
cliVersion: true ? "2.23.21" : "0.0.0-dev",
|
|
5778
5778
|
nodeVersion: process.version,
|
|
5779
5779
|
platform: process.platform,
|
|
5780
5780
|
arch: process.arch,
|
|
@@ -9627,9 +9627,10 @@ function detectSelector(lines) {
|
|
|
9627
9627
|
(l) => /\b(?:trust\s+the\s+files|trust\s+this\s+folder|safety\s+check)\b/i.test(l)
|
|
9628
9628
|
);
|
|
9629
9629
|
if (!hasCursor && !looksLikeTrust) return null;
|
|
9630
|
+
const OPTION_RE = /^(?:[❯>]\s*)?(\d+)\.(\s+|(?=\D))(.+)/;
|
|
9630
9631
|
let optionStartIdx = -1;
|
|
9631
9632
|
for (let i = 0; i < clean.length; i++) {
|
|
9632
|
-
if (
|
|
9633
|
+
if (OPTION_RE.test(clean[i].trim())) {
|
|
9633
9634
|
optionStartIdx = i;
|
|
9634
9635
|
break;
|
|
9635
9636
|
}
|
|
@@ -9652,11 +9653,11 @@ function detectSelector(lines) {
|
|
|
9652
9653
|
for (let i = optionStartIdx; i < clean.length; i++) {
|
|
9653
9654
|
const t2 = clean[i].trim();
|
|
9654
9655
|
if (!t2) continue;
|
|
9655
|
-
const m = t2.match(
|
|
9656
|
+
const m = t2.match(OPTION_RE);
|
|
9656
9657
|
if (m) {
|
|
9657
9658
|
const num = parseInt(m[1], 10);
|
|
9658
9659
|
if (!optionLabels.has(num)) {
|
|
9659
|
-
optionLabels.set(num, m[
|
|
9660
|
+
optionLabels.set(num, m[3].trim());
|
|
9660
9661
|
optionDescs.set(num, []);
|
|
9661
9662
|
}
|
|
9662
9663
|
currentNum = num;
|
|
@@ -9673,6 +9674,22 @@ function detectSelector(lines) {
|
|
|
9673
9674
|
currentIndex: 0
|
|
9674
9675
|
};
|
|
9675
9676
|
}
|
|
9677
|
+
function detectInputSuggestion(lines) {
|
|
9678
|
+
const hasIdleHint = lines.some((l) => /\?\s+for\s+shortcuts/i.test(l.trim()));
|
|
9679
|
+
if (!hasIdleHint) return null;
|
|
9680
|
+
if (lines.some((l) => /^[❯>]\s*\d+\./.test(l.trim()))) return null;
|
|
9681
|
+
for (const line of lines) {
|
|
9682
|
+
const t2 = line.trim();
|
|
9683
|
+
const m = t2.match(/^[❯>]\s+(\S.*)$/);
|
|
9684
|
+
if (!m) continue;
|
|
9685
|
+
if (/^\d+\.\s/.test(m[1])) continue;
|
|
9686
|
+
if (/^for\s/i.test(m[1])) continue;
|
|
9687
|
+
const text = m[1].trim();
|
|
9688
|
+
if (text.length === 0) return null;
|
|
9689
|
+
return text;
|
|
9690
|
+
}
|
|
9691
|
+
return null;
|
|
9692
|
+
}
|
|
9676
9693
|
function detectListSelector(lines) {
|
|
9677
9694
|
if (!lines.some((l) => /[↑↓].*navigate/i.test(l.trim()))) return null;
|
|
9678
9695
|
if (lines.some((l) => /^❯\s*\d+\./.test(l.trim()))) return null;
|
|
@@ -9836,6 +9853,9 @@ var ClaudeRuntimeStrategy = class {
|
|
|
9836
9853
|
detectStartupBanner(lines) {
|
|
9837
9854
|
return detectStartupBanner(lines);
|
|
9838
9855
|
}
|
|
9856
|
+
detectInputSuggestion(lines) {
|
|
9857
|
+
return detectInputSuggestion(lines);
|
|
9858
|
+
}
|
|
9839
9859
|
credentialLocator() {
|
|
9840
9860
|
return claudeCredentialLocator();
|
|
9841
9861
|
}
|
|
@@ -11709,6 +11729,15 @@ var OutputService = class _OutputService {
|
|
|
11709
11729
|
emitter;
|
|
11710
11730
|
runtime;
|
|
11711
11731
|
lastSentContent = "";
|
|
11732
|
+
/**
|
|
11733
|
+
* Tracks the most recent `input_suggestion` chunk we shipped so
|
|
11734
|
+
* we don't spam the backend with duplicate "ghost text" updates
|
|
11735
|
+
* on every tick. Claude redraws its prompt continuously while
|
|
11736
|
+
* idle, so without de-dup we'd push 10+ identical chunks per
|
|
11737
|
+
* second. Reset to `null` when the prompt area clears (the
|
|
11738
|
+
* suggestion was accepted / dismissed).
|
|
11739
|
+
*/
|
|
11740
|
+
lastSentSuggestion = null;
|
|
11712
11741
|
/**
|
|
11713
11742
|
* Per-session latch — emits the agent's startup banner as a typed
|
|
11714
11743
|
* `agent_banner` chunk exactly once, then strips the banner lines
|
|
@@ -12018,6 +12047,19 @@ var OutputService = class _OutputService {
|
|
|
12018
12047
|
});
|
|
12019
12048
|
}
|
|
12020
12049
|
const contentStableMs = this.lastContentChangeAt > 0 ? now - this.lastContentChangeAt : 0;
|
|
12050
|
+
const suggestion = this.runtime.detectInputSuggestion?.(lines) ?? null;
|
|
12051
|
+
if (suggestion !== this.lastSentSuggestion) {
|
|
12052
|
+
this.lastSentSuggestion = suggestion;
|
|
12053
|
+
this.send(
|
|
12054
|
+
{
|
|
12055
|
+
type: "input_suggestion",
|
|
12056
|
+
content: suggestion ?? "",
|
|
12057
|
+
done: true
|
|
12058
|
+
},
|
|
12059
|
+
{ critical: false }
|
|
12060
|
+
).catch(() => {
|
|
12061
|
+
});
|
|
12062
|
+
}
|
|
12021
12063
|
const readyPrompt = this.runtime.detectReadyPrompt?.(lines) ?? false;
|
|
12022
12064
|
log.trace(
|
|
12023
12065
|
"outputSvc",
|
|
@@ -18803,7 +18845,7 @@ function checkChokidar() {
|
|
|
18803
18845
|
}
|
|
18804
18846
|
async function doctor(args2 = []) {
|
|
18805
18847
|
const json = args2.includes("--json");
|
|
18806
|
-
const cliVersion = true ? "2.23.
|
|
18848
|
+
const cliVersion = true ? "2.23.21" : "0.0.0-dev";
|
|
18807
18849
|
const apiBase = resolveApiBaseUrl();
|
|
18808
18850
|
const diagnosticId = (0, import_node_crypto5.randomUUID)();
|
|
18809
18851
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -19002,7 +19044,7 @@ async function completion(args2) {
|
|
|
19002
19044
|
// src/commands/version.ts
|
|
19003
19045
|
var import_picocolors13 = __toESM(require("picocolors"));
|
|
19004
19046
|
function version2() {
|
|
19005
|
-
const v = true ? "2.23.
|
|
19047
|
+
const v = true ? "2.23.21" : "unknown";
|
|
19006
19048
|
console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
|
|
19007
19049
|
}
|
|
19008
19050
|
|
|
@@ -19230,7 +19272,7 @@ function checkForUpdates() {
|
|
|
19230
19272
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
19231
19273
|
if (process.env.CI) return;
|
|
19232
19274
|
if (!process.stdout.isTTY) return;
|
|
19233
|
-
const current = true ? "2.23.
|
|
19275
|
+
const current = true ? "2.23.21" : null;
|
|
19234
19276
|
if (!current) return;
|
|
19235
19277
|
const cache = readCache();
|
|
19236
19278
|
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.
|
|
3
|
+
"version": "2.23.21",
|
|
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",
|