codeam-cli 2.12.3 → 2.12.5

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,25 @@ 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.12.4] — 2026-05-14
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Report the real agent id/name/icon to /api/plugin/agents
12
+
13
+ ## [2.12.3] — 2026-05-14
14
+
15
+ ### Fixed
16
+
17
+ - **cli:** Drop the Codex bottom status footer + accept · as agent-reply prefix
18
+
19
+ ## [2.12.2] — 2026-05-14
20
+
21
+ ### Changed
22
+
23
+ - **cli:** Per-agent TUI parsers — Codex uses • for replies (same glyph as Claude tool calls)
24
+ - **cli,shared,vsc-plugin:** Move Claude TUI parsers out of shared into the Claude strategy
25
+
7
26
  ## [2.12.1] — 2026-05-14
8
27
 
9
28
  ### Fixed
package/dist/index.js CHANGED
@@ -1682,7 +1682,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
1682
1682
  // package.json
1683
1683
  var package_default = {
1684
1684
  name: "codeam-cli",
1685
- version: "2.12.3",
1685
+ version: "2.12.5",
1686
1686
  description: "Remote control Claude Code (and other AI coding agents) from your mobile phone. Pair your device, send prompts, stream responses in real-time, and approve commands \u2014 from anywhere.",
1687
1687
  type: "commonjs",
1688
1688
  main: "dist/index.js",
@@ -2037,12 +2037,14 @@ var log = {
2037
2037
  // src/services/command-relay.service.ts
2038
2038
  var API_BASE2 = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
2039
2039
  var CommandRelayService = class {
2040
- constructor(pluginId, onCommand) {
2040
+ constructor(pluginId, onCommand, agentMeta) {
2041
2041
  this.pluginId = pluginId;
2042
2042
  this.onCommand = onCommand;
2043
+ this.agentMeta = agentMeta;
2043
2044
  }
2044
2045
  pluginId;
2045
2046
  onCommand;
2047
+ agentMeta;
2046
2048
  _running = false;
2047
2049
  heartbeatTimer = null;
2048
2050
  agentsTimer = null;
@@ -2229,9 +2231,11 @@ var CommandRelayService = class {
2229
2231
  }).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
2230
2232
  }
2231
2233
  reportAgents() {
2234
+ const id = this.agentMeta?.id ?? "claude";
2235
+ const name = this.agentMeta?.displayName ?? "Claude Code";
2232
2236
  _postJson(`${API_BASE2}/api/plugin/agents`, {
2233
2237
  pluginId: this.pluginId,
2234
- agents: [{ id: "claude-code", name: "Claude Code", icon: "\u{1F916}", installed: true }]
2238
+ agents: [{ id, name, icon: id, installed: true }]
2235
2239
  }).then(() => {
2236
2240
  this.agentsRegistered = true;
2237
2241
  }).catch(() => {
@@ -5797,40 +5801,48 @@ function getCurrentUsage2(historyDir) {
5797
5801
 
5798
5802
  // src/agents/codex/parsing.ts
5799
5803
  var BOX_DRAW_RE = /^[╭─╮│╰╯]/u;
5804
+ var BULLET_CHARS = "\u2022\xB7\u2027\u2219\u22C5";
5805
+ var CODEX_AGENT_REPLY_RE = new RegExp(`^[${BULLET_CHARS}]\\s`, "u");
5806
+ var STRIP_BULLET_RE = new RegExp(`^(\\s*)[${BULLET_CHARS}]\\s`, "u");
5800
5807
  var CODEX_USER_ECHO_RE = /^[›>]\s+\S/u;
5801
- var CODEX_AGENT_REPLY_RE = /^[•·]\s/u;
5802
5808
  var TIP_RE = /^\s*Tip:\s/i;
5803
5809
  var LEARN_MORE_RE = /^\s*Learn more:\s/i;
5804
5810
  var CODEX_STATUS_FOOTER_RE = /\bdefault\s+[·•]\s+\S+/i;
5811
+ var CODEAM_BANNER_RES = [
5812
+ // Bullet-prefixed banner entries (any role / launch label).
5813
+ new RegExp(`^[${BULLET_CHARS}]\\s+(Launching|Edgar|PRO|FREE|ENTERPRISE)\\b`, "i"),
5814
+ /^Paired\b/,
5815
+ /^codeam\b\s+v\d/,
5816
+ /^✓\s+Paired/,
5817
+ /^◇\s+Paired/
5818
+ ];
5805
5819
  function filterCodexChrome(lines) {
5806
5820
  const out = [];
5807
- let skipEchoContinuation = false;
5808
5821
  for (const line of lines) {
5809
5822
  const t2 = line.trimEnd();
5810
5823
  const trimmed = t2.trimStart();
5811
- if (!trimmed) {
5812
- skipEchoContinuation = false;
5813
- continue;
5814
- }
5824
+ if (!trimmed) continue;
5815
5825
  if (BOX_DRAW_RE.test(trimmed)) continue;
5816
5826
  if (/^OpenAI Codex\b/i.test(trimmed) || /^>_\s+OpenAI Codex\b/i.test(trimmed) || /^model:\s/i.test(trimmed) || /^directory:\s/i.test(trimmed)) continue;
5817
5827
  if (TIP_RE.test(t2) || LEARN_MORE_RE.test(t2)) continue;
5818
- if (CODEX_STATUS_FOOTER_RE.test(trimmed)) {
5819
- skipEchoContinuation = false;
5820
- continue;
5821
- }
5828
+ if (CODEX_STATUS_FOOTER_RE.test(trimmed)) continue;
5829
+ if (CODEAM_BANNER_RES.some((re2) => re2.test(trimmed))) continue;
5830
+ if (CODEX_USER_ECHO_RE.test(trimmed)) continue;
5822
5831
  if (CODEX_AGENT_REPLY_RE.test(trimmed)) {
5823
- skipEchoContinuation = false;
5824
- out.push(t2.replace(/^(\s*)[•·]\s/, "$1"));
5825
- continue;
5826
- }
5827
- if (CODEX_USER_ECHO_RE.test(trimmed)) {
5828
- skipEchoContinuation = true;
5832
+ out.push(t2.replace(STRIP_BULLET_RE, "$1"));
5829
5833
  continue;
5830
5834
  }
5831
- if (skipEchoContinuation) continue;
5832
5835
  out.push(t2);
5833
5836
  }
5837
+ log.trace("codex-parse", `filterCodexChrome in=${lines.length} out=${out.length}`);
5838
+ if (process.env.CODEAM_DEBUG === "1") {
5839
+ const sampleIn = lines.slice(-40).map((l, i) => ` in[${i}] ${JSON.stringify(l)}`).join("\n");
5840
+ const sampleOut = out.map((l, i) => ` out[${i}] ${JSON.stringify(l)}`).join("\n");
5841
+ log.debug("codex-parse", `
5842
+ ${sampleIn}
5843
+ ---
5844
+ ${sampleOut}`);
5845
+ }
5834
5846
  return out;
5835
5847
  }
5836
5848
  function parseCodexChrome(_line) {
@@ -7852,7 +7864,7 @@ async function start() {
7852
7864
  };
7853
7865
  const relay = new CommandRelayService(pluginId, async (cmd) => {
7854
7866
  await dispatchCommand(ctx, cmd);
7855
- });
7867
+ }, runtime.meta);
7856
7868
  ctx.relay = relay;
7857
7869
  function sigintHandler() {
7858
7870
  claude.kill();
@@ -10123,7 +10135,7 @@ async function stopWorkspaceFromLocal(target) {
10123
10135
  // src/commands/version.ts
10124
10136
  var import_picocolors11 = __toESM(require("picocolors"));
10125
10137
  function version() {
10126
- const v = true ? "2.12.3" : "unknown";
10138
+ const v = true ? "2.12.5" : "unknown";
10127
10139
  console.log(`${import_picocolors11.default.bold("codeam-cli")} ${import_picocolors11.default.cyan(v)}`);
10128
10140
  }
10129
10141
 
@@ -10258,7 +10270,7 @@ function checkForUpdates() {
10258
10270
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
10259
10271
  if (process.env.CI) return;
10260
10272
  if (!process.stdout.isTTY) return;
10261
- const current = true ? "2.12.3" : null;
10273
+ const current = true ? "2.12.5" : null;
10262
10274
  if (!current) return;
10263
10275
  const cache = readCache();
10264
10276
  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.12.3",
3
+ "version": "2.12.5",
4
4
  "description": "Remote control Claude Code (and other AI coding agents) from your mobile phone. Pair your device, send prompts, stream responses in real-time, and approve commands — from anywhere.",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",