codeam-cli 2.23.35 → 2.23.37
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 +26 -0
- package/dist/index.js +53 -7
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,32 @@ 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.36] — 2026-05-31
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **cli:** Move bracketed-paste into Claude strategy + agent-leak hook
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **cli:** Suppress bogus terminal-turn from Claude's ghost-text
|
|
16
|
+
|
|
17
|
+
## [2.23.35] — 2026-05-31
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- **cli:** Move bracketed-paste into Claude strategy + agent-leak hook
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- **cli:** Wrap multi-line prompts in bracketed-paste so \r submits
|
|
26
|
+
|
|
27
|
+
## [2.23.34] — 2026-05-31
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- **cli:** Wrap multi-line prompts in bracketed-paste so \r submits
|
|
32
|
+
|
|
7
33
|
## [2.23.33] — 2026-05-31
|
|
8
34
|
|
|
9
35
|
### Performance
|
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.37",
|
|
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.37" : "0.0.0-dev",
|
|
5778
5778
|
nodeVersion: process.version,
|
|
5779
5779
|
platform: process.platform,
|
|
5780
5780
|
arch: process.arch,
|
|
@@ -11747,6 +11747,21 @@ var PtyBuffer = class {
|
|
|
11747
11747
|
this.raw = "";
|
|
11748
11748
|
this.lastPushAt = 0;
|
|
11749
11749
|
}
|
|
11750
|
+
/**
|
|
11751
|
+
* Re-arm the terminal-input detector without flipping `active`.
|
|
11752
|
+
* Called by the orchestrator when a pending terminal-turn signal
|
|
11753
|
+
* doesn't pan out — the JSONL polling timed out without finding a
|
|
11754
|
+
* new user message, so whatever produced the printable byte (most
|
|
11755
|
+
* commonly Claude's ghost-text completion painted ~300-500 ms after
|
|
11756
|
+
* the previous turn settled) was NOT a real user keystroke. We
|
|
11757
|
+
* need detection to fire again on the next legitimate keystroke,
|
|
11758
|
+
* otherwise the human's eventual CLI prompt is lost and only the
|
|
11759
|
+
* agent's reply lands on mobile (the duplicate-response /
|
|
11760
|
+
* missing-user-bubble class of bug the user reported).
|
|
11761
|
+
*/
|
|
11762
|
+
resetTerminalInputGate() {
|
|
11763
|
+
this.terminalInputPending = false;
|
|
11764
|
+
}
|
|
11750
11765
|
/**
|
|
11751
11766
|
* Ingest a raw PTY frame. Always accumulates so cold-startup
|
|
11752
11767
|
* frames aren't lost. Returns whether the buffer was active at
|
|
@@ -11931,6 +11946,22 @@ var OutputService = class _OutputService {
|
|
|
11931
11946
|
}
|
|
11932
11947
|
await this.send({ type: "new_turn", done: false }, { critical: true });
|
|
11933
11948
|
}
|
|
11949
|
+
/**
|
|
11950
|
+
* Re-arm the terminal-turn detection gate without opening a bogus
|
|
11951
|
+
* turn. Called by the orchestrator when `waitForNewUserMessage`
|
|
11952
|
+
* times out — Claude's ghost-text completion (painted between
|
|
11953
|
+
* turns) trips the printable-byte detector before the user has
|
|
11954
|
+
* actually typed anything. Calling `startTerminalTurn` here would
|
|
11955
|
+
* emit `clear` + `new_turn` to mobile and then `beginTurn` would
|
|
11956
|
+
* activate the PTY buffer; the tick poll would render the still-
|
|
11957
|
+
* visible previous response as fresh `text` chunks → a duplicate
|
|
11958
|
+
* agent bubble on mobile. Resetting the gates instead means the
|
|
11959
|
+
* next legitimate keystroke re-fires detection cleanly.
|
|
11960
|
+
*/
|
|
11961
|
+
resetTerminalTurnGate() {
|
|
11962
|
+
this.terminalTurnPending = false;
|
|
11963
|
+
this.pty.resetTerminalInputGate();
|
|
11964
|
+
}
|
|
11934
11965
|
/**
|
|
11935
11966
|
* Begin a turn after a `resume_session` request. Includes the
|
|
11936
11967
|
* `resumedSessionId` so the client wipes its history and
|
|
@@ -12418,7 +12449,7 @@ var HistoryService = class _HistoryService {
|
|
|
12418
12449
|
* Poll the JSONL until a new user message appears after previousCount entries.
|
|
12419
12450
|
* Returns the text of the new user message, or null if not found within timeoutMs.
|
|
12420
12451
|
*/
|
|
12421
|
-
async waitForNewUserMessage(previousCount, timeoutMs =
|
|
12452
|
+
async waitForNewUserMessage(previousCount, timeoutMs = 6e4) {
|
|
12422
12453
|
const deadline = Date.now() + timeoutMs;
|
|
12423
12454
|
while (Date.now() < deadline) {
|
|
12424
12455
|
if (!this.currentConversationId) return null;
|
|
@@ -12809,6 +12840,13 @@ function detectFileStatus(rawLines) {
|
|
|
12809
12840
|
return "modified";
|
|
12810
12841
|
}
|
|
12811
12842
|
|
|
12843
|
+
// src/services/file-watcher/ignored-paths.ts
|
|
12844
|
+
var IGNORED_PATH_PATTERN = /(^|[\\/])(?:\.git|\.next|\.expo|\.turbo|\.cache|\.parcel-cache|\.vercel|\.idea|\.vscode|node_modules|dist|build|out|coverage|target|__pycache__|\.gradle|Pods|DerivedData|\.dart_tool|venv|\.venv|\.tox|\.mypy_cache|\.pytest_cache|\.DS_Store|Thumbs\.db)([\\/]|$)/i;
|
|
12845
|
+
function isIgnoredFilePath(filePath) {
|
|
12846
|
+
if (!filePath || filePath.length === 0) return true;
|
|
12847
|
+
return IGNORED_PATH_PATTERN.test(filePath);
|
|
12848
|
+
}
|
|
12849
|
+
|
|
12812
12850
|
// src/services/file-watcher/transport.ts
|
|
12813
12851
|
var http5 = __toESM(require("http"));
|
|
12814
12852
|
var https5 = __toESM(require("https"));
|
|
@@ -13090,6 +13128,7 @@ var FileWatcherService = class {
|
|
|
13090
13128
|
*/
|
|
13091
13129
|
schedule(absPath, changeType) {
|
|
13092
13130
|
if (this.stopped) return;
|
|
13131
|
+
if (isIgnoredFilePath(absPath)) return;
|
|
13093
13132
|
const existing = this.pending.get(absPath);
|
|
13094
13133
|
if (existing) clearTimeout(existing.timer);
|
|
13095
13134
|
const timer = setTimeout(() => {
|
|
@@ -13485,6 +13524,7 @@ async function collectRepoChangeset(opts) {
|
|
|
13485
13524
|
const numstat = parseNumstat(numstatRaw ?? "");
|
|
13486
13525
|
const entries = [];
|
|
13487
13526
|
for (const row of parseStatus(status2)) {
|
|
13527
|
+
if (isIgnoredFilePath(row.filePath)) continue;
|
|
13488
13528
|
const stats = numstat.get(row.filePath) ?? { added: 0, removed: 0 };
|
|
13489
13529
|
entries.push({
|
|
13490
13530
|
filePath: row.filePath,
|
|
@@ -16363,7 +16403,13 @@ async function start(requestedAgent) {
|
|
|
16363
16403
|
},
|
|
16364
16404
|
() => {
|
|
16365
16405
|
const prevCount = historySvc.getCurrentMessageCount();
|
|
16366
|
-
historySvc.waitForNewUserMessage(prevCount).then((userText) =>
|
|
16406
|
+
historySvc.waitForNewUserMessage(prevCount).then((userText) => {
|
|
16407
|
+
if (userText) {
|
|
16408
|
+
void outputSvc.startTerminalTurn(userText);
|
|
16409
|
+
} else {
|
|
16410
|
+
outputSvc.resetTerminalTurnGate();
|
|
16411
|
+
}
|
|
16412
|
+
}).catch(() => outputSvc.resetTerminalTurnGate());
|
|
16367
16413
|
},
|
|
16368
16414
|
session.pluginAuthToken,
|
|
16369
16415
|
runtime
|
|
@@ -19207,7 +19253,7 @@ function checkChokidar() {
|
|
|
19207
19253
|
}
|
|
19208
19254
|
async function doctor(args2 = []) {
|
|
19209
19255
|
const json = args2.includes("--json");
|
|
19210
|
-
const cliVersion = true ? "2.23.
|
|
19256
|
+
const cliVersion = true ? "2.23.37" : "0.0.0-dev";
|
|
19211
19257
|
const apiBase = resolveApiBaseUrl();
|
|
19212
19258
|
const diagnosticId = (0, import_node_crypto6.randomUUID)();
|
|
19213
19259
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -19406,7 +19452,7 @@ async function completion(args2) {
|
|
|
19406
19452
|
// src/commands/version.ts
|
|
19407
19453
|
var import_picocolors13 = __toESM(require("picocolors"));
|
|
19408
19454
|
function version2() {
|
|
19409
|
-
const v = true ? "2.23.
|
|
19455
|
+
const v = true ? "2.23.37" : "unknown";
|
|
19410
19456
|
console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
|
|
19411
19457
|
}
|
|
19412
19458
|
|
|
@@ -19634,7 +19680,7 @@ function checkForUpdates() {
|
|
|
19634
19680
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
19635
19681
|
if (process.env.CI) return;
|
|
19636
19682
|
if (!process.stdout.isTTY) return;
|
|
19637
|
-
const current = true ? "2.23.
|
|
19683
|
+
const current = true ? "2.23.37" : null;
|
|
19638
19684
|
if (!current) return;
|
|
19639
19685
|
const cache = readCache();
|
|
19640
19686
|
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.37",
|
|
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",
|