codeam-cli 2.15.6 → 2.15.8

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,15 @@ 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.15.6] — 2026-05-20
8
+
9
+ ### Added
10
+
11
+ - **cli:** Send current git branch on pair
12
+ - **vsc-plugin:** Emit file-change + review-hunk events from Path B (direct claude)
13
+ - **jetbrains-plugin:** Emit file-change + review-hunk events from Path B
14
+ - **cli:** Epic C — emit streaming chunks + subscribe to answer channel
15
+
7
16
  ## [2.15.5] — 2026-05-20
8
17
 
9
18
  ### Added
package/README.md CHANGED
@@ -111,7 +111,7 @@ Adding more cloud backends (Gitpod, Coder, your own SSH host, …) is a single n
111
111
 
112
112
  | Variable | Default | Effect |
113
113
  |---|---|---|
114
- | `CODEAM_API_URL` | `https://codeagent-mobile-api.vercel.app` | Override the backend relay URL. Useful for hitting a staging environment or self-hosted backend. |
114
+ | `CODEAM_API_URL` | `https://api.codeagent-mobile.com` | Override the backend relay URL. Useful for hitting a staging environment or self-hosted backend. |
115
115
  | `CODEAM_DISABLE_UPDATE_CHECK` | unset | Set to `1` to suppress the "update available" banner. The check also auto-skips on non-TTY stdout, when `CI=true`, and during tests. |
116
116
  | `CODEAM_AUTO_TOKEN` | unset | One-shot pairing token consumed by `codeam pair-auto`. Used by the `codeam deploy` bootstrap; see *Advanced / scripted pairing* below. |
117
117
 
package/dist/index.js CHANGED
@@ -284,6 +284,9 @@ function isKnownAgentId(id) {
284
284
  return id === "claude" || id === "codex" || id === "copilot";
285
285
  }
286
286
 
287
+ // ../../packages/shared/src/api-url.ts
288
+ var DEFAULT_API_BASE_URL = "https://api.codeagent-mobile.com";
289
+
287
290
  // src/config.ts
288
291
  var fs = __toESM(require("fs"));
289
292
  var os = __toESM(require("os"));
@@ -386,7 +389,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
386
389
  // package.json
387
390
  var package_default = {
388
391
  name: "codeam-cli",
389
- version: "2.15.6",
392
+ version: "2.15.8",
390
393
  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.",
391
394
  type: "commonjs",
392
395
  main: "dist/index.js",
@@ -490,21 +493,30 @@ function showError(msg) {
490
493
  function showInfo(msg) {
491
494
  console.log(` ${import_picocolors.default.dim("\xB7")} ${msg}`);
492
495
  }
493
- function showPairingCode(code, expiresAt) {
494
- const secs = Math.max(0, Math.floor((expiresAt - Date.now()) / 1e3));
495
- const timer = `${Math.floor(secs / 60)}:${String(secs % 60).padStart(2, "0")}`;
496
- console.log(" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510");
497
- const codePad = " ".repeat(Math.max(0, 19 - code.length));
498
- const timerPad = " ".repeat(Math.max(0, 15 - timer.length));
499
- console.log(` \u2502 Code: ${import_picocolors.default.bold(import_picocolors.default.yellow(code))}${codePad}\u2502`);
500
- console.log(` \u2502 Expires in: ${import_picocolors.default.dim(timer)}${timerPad}\u2502`);
501
- console.log(" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518");
496
+ var BOX_INTERIOR = 30;
497
+ var BOX_BORDER_TOP = ` \u250C${"\u2500".repeat(BOX_INTERIOR)}\u2510`;
498
+ var BOX_BORDER_BOT = ` \u2514${"\u2500".repeat(BOX_INTERIOR)}\u2518`;
499
+ function boxRow(content, visibleLength) {
500
+ const pad = " ".repeat(Math.max(0, BOX_INTERIOR - visibleLength));
501
+ return ` \u2502${content}${pad}\u2502`;
502
+ }
503
+ function showPairingCode(code) {
504
+ console.log(BOX_BORDER_TOP);
505
+ const codeVisible = ` Code: ${code}`.length;
506
+ console.log(
507
+ boxRow(` Code: ${import_picocolors.default.bold(import_picocolors.default.yellow(code))}`, codeVisible)
508
+ );
509
+ console.log(BOX_BORDER_BOT);
502
510
  console.log("");
503
511
  import_qrcode_terminal.default.generate(code, { small: true }, (qr) => {
504
512
  qr.split("\n").forEach((line) => console.log(" " + line));
505
513
  });
506
514
  console.log("");
507
515
  }
516
+ function formatRemaining(expiresAt) {
517
+ const secs = Math.max(0, Math.floor((expiresAt - Date.now()) / 1e3));
518
+ return `${Math.floor(secs / 60)}:${String(secs % 60).padStart(2, "0")}`;
519
+ }
508
520
 
509
521
  // src/services/command-relay.service.ts
510
522
  var https2 = __toESM(require("https"));
@@ -558,7 +570,7 @@ function computePollDelay({ baseMs, failures }) {
558
570
  }
559
571
 
560
572
  // src/services/pairing.service.ts
561
- var API_BASE = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
573
+ var API_BASE = process.env.CODEAM_API_URL ?? DEFAULT_API_BASE_URL;
562
574
  async function requestCode(pluginId) {
563
575
  try {
564
576
  const runtime = process.env.CODESPACES === "true" ? "github-codespaces" : "local";
@@ -778,7 +790,7 @@ var log = {
778
790
  };
779
791
 
780
792
  // src/services/command-relay.service.ts
781
- var API_BASE2 = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
793
+ var API_BASE2 = process.env.CODEAM_API_URL ?? DEFAULT_API_BASE_URL;
782
794
  var CommandRelayService = class {
783
795
  constructor(pluginId, onCommand, agentMeta) {
784
796
  this.pluginId = pluginId;
@@ -5194,7 +5206,7 @@ var ChromeStepTracker = class {
5194
5206
  // src/services/output/chunk-emitter.ts
5195
5207
  var https3 = __toESM(require("https"));
5196
5208
  var http3 = __toESM(require("http"));
5197
- var API_BASE3 = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
5209
+ var API_BASE3 = process.env.CODEAM_API_URL ?? DEFAULT_API_BASE_URL;
5198
5210
  var ChunkEmitter = class {
5199
5211
  constructor(opts) {
5200
5212
  this.opts = opts;
@@ -5683,7 +5695,7 @@ var historyRecordSchema = import_zod.z.object({
5683
5695
  content: import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.unknown())]).optional()
5684
5696
  }).passthrough().optional()
5685
5697
  }).passthrough();
5686
- var API_BASE4 = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
5698
+ var API_BASE4 = process.env.CODEAM_API_URL ?? DEFAULT_API_BASE_URL;
5687
5699
  function extractText2(content) {
5688
5700
  if (typeof content === "string") return content;
5689
5701
  if (Array.isArray(content)) {
@@ -6289,7 +6301,7 @@ function _post2(url, headers, payload) {
6289
6301
  }
6290
6302
 
6291
6303
  // src/services/file-watcher.service.ts
6292
- var API_BASE5 = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
6304
+ var API_BASE5 = process.env.CODEAM_API_URL ?? DEFAULT_API_BASE_URL;
6293
6305
  var DEBOUNCE_MS = 250;
6294
6306
  var MAX_RETRIES = 2;
6295
6307
  var RETRY_BACKOFF_MS = 300;
@@ -6704,7 +6716,7 @@ function _get(url, headers) {
6704
6716
  }
6705
6717
 
6706
6718
  // src/services/streaming-emitter.service.ts
6707
- var API_BASE6 = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
6719
+ var API_BASE6 = process.env.CODEAM_API_URL ?? DEFAULT_API_BASE_URL;
6708
6720
  var TICK_MS = 50;
6709
6721
  var ANSWER_POLL_MS = 1500;
6710
6722
  var SELECTOR_STABLE_MS = 800;
@@ -8439,14 +8451,20 @@ async function pair(args2 = []) {
8439
8451
  process.exit(1);
8440
8452
  }
8441
8453
  spin.stop("Got pairing code");
8442
- showPairingCode(result.code, result.expiresAt);
8454
+ showPairingCode(result.code);
8443
8455
  console.log(import_picocolors3.default.dim(" Scan the QR code or enter the code in CodeAgent Mobile."));
8444
8456
  console.log("");
8445
8457
  const waitSpin = dist_exports.spinner();
8446
- waitSpin.start("Waiting for mobile app...");
8458
+ const waitMessage = () => `Waiting for mobile app... \xB7 expires in ${formatRemaining(result.expiresAt)}`;
8459
+ waitSpin.start(waitMessage());
8460
+ const countdownInterval = setInterval(() => {
8461
+ waitSpin.message(waitMessage());
8462
+ }, 1e3);
8463
+ countdownInterval.unref?.();
8447
8464
  await new Promise((resolve2) => {
8448
8465
  let stopPolling = null;
8449
8466
  function sigintHandler() {
8467
+ clearInterval(countdownInterval);
8450
8468
  stopPolling?.();
8451
8469
  console.log("");
8452
8470
  process.exit(0);
@@ -8455,6 +8473,7 @@ async function pair(args2 = []) {
8455
8473
  pluginId,
8456
8474
  (info) => {
8457
8475
  process.removeListener("SIGINT", sigintHandler);
8476
+ clearInterval(countdownInterval);
8458
8477
  waitSpin.stop("Paired!");
8459
8478
  addSession({
8460
8479
  id: info.sessionId,
@@ -8472,6 +8491,7 @@ async function pair(args2 = []) {
8472
8491
  resolve2();
8473
8492
  },
8474
8493
  () => {
8494
+ clearInterval(countdownInterval);
8475
8495
  waitSpin.stop("Timed out");
8476
8496
  showError("Pairing timed out after 5 minutes. Run codeam pair to try again.");
8477
8497
  process.exit(1);
@@ -8486,7 +8506,7 @@ async function pair(args2 = []) {
8486
8506
  var fs15 = __toESM(require("fs"));
8487
8507
  var os14 = __toESM(require("os"));
8488
8508
  var import_crypto5 = require("crypto");
8489
- var API_BASE7 = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
8509
+ var API_BASE7 = process.env.CODEAM_API_URL ?? DEFAULT_API_BASE_URL;
8490
8510
  function fail(msg) {
8491
8511
  console.error(`
8492
8512
  ${msg}
@@ -10621,7 +10641,7 @@ async function stopWorkspaceFromLocal(target) {
10621
10641
  // src/commands/version.ts
10622
10642
  var import_picocolors11 = __toESM(require("picocolors"));
10623
10643
  function version() {
10624
- const v = true ? "2.15.6" : "unknown";
10644
+ const v = true ? "2.15.8" : "unknown";
10625
10645
  console.log(`${import_picocolors11.default.bold("codeam-cli")} ${import_picocolors11.default.cyan(v)}`);
10626
10646
  }
10627
10647
 
@@ -10760,7 +10780,7 @@ function checkForUpdates() {
10760
10780
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
10761
10781
  if (process.env.CI) return;
10762
10782
  if (!process.stdout.isTTY) return;
10763
- const current = true ? "2.15.6" : null;
10783
+ const current = true ? "2.15.8" : null;
10764
10784
  if (!current) return;
10765
10785
  const cache = readCache();
10766
10786
  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.15.6",
3
+ "version": "2.15.8",
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",