codeam-cli 2.23.35 → 2.23.36

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,22 @@ 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.35] — 2026-05-31
8
+
9
+ ### Changed
10
+
11
+ - **cli:** Move bracketed-paste into Claude strategy + agent-leak hook
12
+
13
+ ### Fixed
14
+
15
+ - **cli:** Wrap multi-line prompts in bracketed-paste so \r submits
16
+
17
+ ## [2.23.34] — 2026-05-31
18
+
19
+ ### Fixed
20
+
21
+ - **cli:** Wrap multi-line prompts in bracketed-paste so \r submits
22
+
7
23
  ## [2.23.33] — 2026-05-31
8
24
 
9
25
  ### 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.35",
444
+ version: "2.23.36",
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.35" : "0.0.0-dev",
5777
+ cliVersion: true ? "2.23.36" : "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 = 4e3) {
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;
@@ -16363,7 +16394,13 @@ async function start(requestedAgent) {
16363
16394
  },
16364
16395
  () => {
16365
16396
  const prevCount = historySvc.getCurrentMessageCount();
16366
- historySvc.waitForNewUserMessage(prevCount).then((userText) => outputSvc.startTerminalTurn(userText ?? void 0)).catch(() => outputSvc.startTerminalTurn(void 0));
16397
+ historySvc.waitForNewUserMessage(prevCount).then((userText) => {
16398
+ if (userText) {
16399
+ void outputSvc.startTerminalTurn(userText);
16400
+ } else {
16401
+ outputSvc.resetTerminalTurnGate();
16402
+ }
16403
+ }).catch(() => outputSvc.resetTerminalTurnGate());
16367
16404
  },
16368
16405
  session.pluginAuthToken,
16369
16406
  runtime
@@ -19207,7 +19244,7 @@ function checkChokidar() {
19207
19244
  }
19208
19245
  async function doctor(args2 = []) {
19209
19246
  const json = args2.includes("--json");
19210
- const cliVersion = true ? "2.23.35" : "0.0.0-dev";
19247
+ const cliVersion = true ? "2.23.36" : "0.0.0-dev";
19211
19248
  const apiBase = resolveApiBaseUrl();
19212
19249
  const diagnosticId = (0, import_node_crypto6.randomUUID)();
19213
19250
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -19406,7 +19443,7 @@ async function completion(args2) {
19406
19443
  // src/commands/version.ts
19407
19444
  var import_picocolors13 = __toESM(require("picocolors"));
19408
19445
  function version2() {
19409
- const v = true ? "2.23.35" : "unknown";
19446
+ const v = true ? "2.23.36" : "unknown";
19410
19447
  console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
19411
19448
  }
19412
19449
 
@@ -19634,7 +19671,7 @@ function checkForUpdates() {
19634
19671
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
19635
19672
  if (process.env.CI) return;
19636
19673
  if (!process.stdout.isTTY) return;
19637
- const current = true ? "2.23.35" : null;
19674
+ const current = true ? "2.23.36" : null;
19638
19675
  if (!current) return;
19639
19676
  const cache = readCache();
19640
19677
  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.35",
3
+ "version": "2.23.36",
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",