codeam-cli 2.23.20 → 2.23.22
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 +54 -5
- 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.21] — 2026-05-30
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **cli:** Emit `input_suggestion` chunk for Claude ghost-text completions
|
|
12
|
+
|
|
13
|
+
## [2.23.20] — 2026-05-30
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **cli:** Claude selector — match `<n>.Label` (no space after the dot)
|
|
18
|
+
|
|
7
19
|
## [2.23.19] — 2026-05-30
|
|
8
20
|
|
|
9
21
|
### 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.
|
|
444
|
+
version: "2.23.22",
|
|
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.22" : "0.0.0-dev",
|
|
5778
5778
|
nodeVersion: process.version,
|
|
5779
5779
|
platform: process.platform,
|
|
5780
5780
|
arch: process.arch,
|
|
@@ -9674,6 +9674,30 @@ function detectSelector(lines) {
|
|
|
9674
9674
|
currentIndex: 0
|
|
9675
9675
|
};
|
|
9676
9676
|
}
|
|
9677
|
+
function detectInputSuggestion(lines) {
|
|
9678
|
+
let hintIdx = -1;
|
|
9679
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
9680
|
+
if (/\?\s+for\s+shortcuts/i.test(lines[i].trim())) {
|
|
9681
|
+
hintIdx = i;
|
|
9682
|
+
break;
|
|
9683
|
+
}
|
|
9684
|
+
}
|
|
9685
|
+
if (hintIdx === -1) return null;
|
|
9686
|
+
if (lines.some((l) => /^[❯>]\s*\d+\./.test(l.trim()))) return null;
|
|
9687
|
+
const windowStart = Math.max(0, hintIdx - 3);
|
|
9688
|
+
for (let i = hintIdx - 1; i >= windowStart; i--) {
|
|
9689
|
+
const t2 = lines[i].trim();
|
|
9690
|
+
if (!t2) continue;
|
|
9691
|
+
const m = t2.match(/^[❯>]\s+(\S.*)$/);
|
|
9692
|
+
if (!m) return null;
|
|
9693
|
+
if (/^\d+\.\s/.test(m[1])) return null;
|
|
9694
|
+
if (/^for\s/i.test(m[1])) return null;
|
|
9695
|
+
const text = m[1].trim();
|
|
9696
|
+
if (text.length === 0) return null;
|
|
9697
|
+
return text;
|
|
9698
|
+
}
|
|
9699
|
+
return null;
|
|
9700
|
+
}
|
|
9677
9701
|
function detectListSelector(lines) {
|
|
9678
9702
|
if (!lines.some((l) => /[↑↓].*navigate/i.test(l.trim()))) return null;
|
|
9679
9703
|
if (lines.some((l) => /^❯\s*\d+\./.test(l.trim()))) return null;
|
|
@@ -9837,6 +9861,9 @@ var ClaudeRuntimeStrategy = class {
|
|
|
9837
9861
|
detectStartupBanner(lines) {
|
|
9838
9862
|
return detectStartupBanner(lines);
|
|
9839
9863
|
}
|
|
9864
|
+
detectInputSuggestion(lines) {
|
|
9865
|
+
return detectInputSuggestion(lines);
|
|
9866
|
+
}
|
|
9840
9867
|
credentialLocator() {
|
|
9841
9868
|
return claudeCredentialLocator();
|
|
9842
9869
|
}
|
|
@@ -11710,6 +11737,15 @@ var OutputService = class _OutputService {
|
|
|
11710
11737
|
emitter;
|
|
11711
11738
|
runtime;
|
|
11712
11739
|
lastSentContent = "";
|
|
11740
|
+
/**
|
|
11741
|
+
* Tracks the most recent `input_suggestion` chunk we shipped so
|
|
11742
|
+
* we don't spam the backend with duplicate "ghost text" updates
|
|
11743
|
+
* on every tick. Claude redraws its prompt continuously while
|
|
11744
|
+
* idle, so without de-dup we'd push 10+ identical chunks per
|
|
11745
|
+
* second. Reset to `null` when the prompt area clears (the
|
|
11746
|
+
* suggestion was accepted / dismissed).
|
|
11747
|
+
*/
|
|
11748
|
+
lastSentSuggestion = null;
|
|
11713
11749
|
/**
|
|
11714
11750
|
* Per-session latch — emits the agent's startup banner as a typed
|
|
11715
11751
|
* `agent_banner` chunk exactly once, then strips the banner lines
|
|
@@ -12019,6 +12055,19 @@ var OutputService = class _OutputService {
|
|
|
12019
12055
|
});
|
|
12020
12056
|
}
|
|
12021
12057
|
const contentStableMs = this.lastContentChangeAt > 0 ? now - this.lastContentChangeAt : 0;
|
|
12058
|
+
const suggestion = this.runtime.detectInputSuggestion?.(lines) ?? null;
|
|
12059
|
+
if (suggestion !== this.lastSentSuggestion) {
|
|
12060
|
+
this.lastSentSuggestion = suggestion;
|
|
12061
|
+
this.send(
|
|
12062
|
+
{
|
|
12063
|
+
type: "input_suggestion",
|
|
12064
|
+
content: suggestion ?? "",
|
|
12065
|
+
done: true
|
|
12066
|
+
},
|
|
12067
|
+
{ critical: false }
|
|
12068
|
+
).catch(() => {
|
|
12069
|
+
});
|
|
12070
|
+
}
|
|
12022
12071
|
const readyPrompt = this.runtime.detectReadyPrompt?.(lines) ?? false;
|
|
12023
12072
|
log.trace(
|
|
12024
12073
|
"outputSvc",
|
|
@@ -18804,7 +18853,7 @@ function checkChokidar() {
|
|
|
18804
18853
|
}
|
|
18805
18854
|
async function doctor(args2 = []) {
|
|
18806
18855
|
const json = args2.includes("--json");
|
|
18807
|
-
const cliVersion = true ? "2.23.
|
|
18856
|
+
const cliVersion = true ? "2.23.22" : "0.0.0-dev";
|
|
18808
18857
|
const apiBase = resolveApiBaseUrl();
|
|
18809
18858
|
const diagnosticId = (0, import_node_crypto5.randomUUID)();
|
|
18810
18859
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -19003,7 +19052,7 @@ async function completion(args2) {
|
|
|
19003
19052
|
// src/commands/version.ts
|
|
19004
19053
|
var import_picocolors13 = __toESM(require("picocolors"));
|
|
19005
19054
|
function version2() {
|
|
19006
|
-
const v = true ? "2.23.
|
|
19055
|
+
const v = true ? "2.23.22" : "unknown";
|
|
19007
19056
|
console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
|
|
19008
19057
|
}
|
|
19009
19058
|
|
|
@@ -19231,7 +19280,7 @@ function checkForUpdates() {
|
|
|
19231
19280
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
19232
19281
|
if (process.env.CI) return;
|
|
19233
19282
|
if (!process.stdout.isTTY) return;
|
|
19234
|
-
const current = true ? "2.23.
|
|
19283
|
+
const current = true ? "2.23.22" : null;
|
|
19235
19284
|
if (!current) return;
|
|
19236
19285
|
const cache = readCache();
|
|
19237
19286
|
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.22",
|
|
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",
|