codeam-cli 2.76.24 → 2.76.25

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,16 @@ 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.76.24] — 2026-10-12
8
+
9
+ ### Added
10
+
11
+ - **shared:** PreviewDetection.cwd and a detect prompt that sees apps in a subfolder
12
+
13
+ ### Fixed
14
+
15
+ - **cli:** Start the preview dev server in the app's subfolder and name a missing command
16
+
7
17
  ## [2.76.23] — 2026-10-12
8
18
 
9
19
  ### Fixed
package/dist/index.js CHANGED
@@ -10627,7 +10627,7 @@ function readAnonId() {
10627
10627
  }
10628
10628
  function superProperties() {
10629
10629
  return {
10630
- cliVersion: true ? "2.76.24" : "0.0.0-dev",
10630
+ cliVersion: true ? "2.76.25" : "0.0.0-dev",
10631
10631
  nodeVersion: process.version,
10632
10632
  platform: process.platform,
10633
10633
  arch: process.arch,
@@ -10876,7 +10876,7 @@ var http = __toESM(require("http"));
10876
10876
  // package.json
10877
10877
  var package_default = {
10878
10878
  name: "codeam-cli",
10879
- version: "2.76.24",
10879
+ version: "2.76.25",
10880
10880
  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.",
10881
10881
  type: "commonjs",
10882
10882
  main: "dist/index.js",
@@ -12239,7 +12239,7 @@ var CommandRelayService = class _CommandRelayService {
12239
12239
  // fresh + clear the "CLI update available" banner after a self-update
12240
12240
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
12241
12241
  // pair/reconnect). Older backends ignore the extra field.
12242
- ..."2.76.24" ? { ideVersion: "2.76.24" } : {}
12242
+ ..."2.76.25" ? { ideVersion: "2.76.25" } : {}
12243
12243
  };
12244
12244
  try {
12245
12245
  const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body, this.pollSecretHeader());
@@ -50496,6 +50496,9 @@ var MetricsCollector = class {
50496
50496
  };
50497
50497
  }
50498
50498
  };
50499
+ function enrollTokenHash(token) {
50500
+ return (0, import_node_crypto16.createHash)("sha256").update(token).digest("hex");
50501
+ }
50499
50502
  function apiBase() {
50500
50503
  return process.env.CODEAM_API_URL ?? resolveApiBaseUrl();
50501
50504
  }
@@ -50521,7 +50524,8 @@ function loadHostIdentity() {
50521
50524
  hostToken: p2.hostToken,
50522
50525
  controlPluginId: p2.controlPluginId,
50523
50526
  // Optional — absent on identities sealed by a pre-secret CLI.
50524
- ...typeof p2.controlPollSecret === "string" ? { controlPollSecret: p2.controlPollSecret } : {}
50527
+ ...typeof p2.controlPollSecret === "string" ? { controlPollSecret: p2.controlPollSecret } : {},
50528
+ ...typeof p2.consumedEnrollTokenSha256 === "string" ? { consumedEnrollTokenSha256: p2.consumedEnrollTokenSha256 } : {}
50525
50529
  };
50526
50530
  }
50527
50531
  return null;
@@ -51336,7 +51340,7 @@ async function autoUpgradeBeforeCriticalCommand() {
51336
51340
  if (process.env.NODE_ENV === "test") return;
51337
51341
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
51338
51342
  if (process.env.CI) return;
51339
- const current2 = true ? "2.76.24" : null;
51343
+ const current2 = true ? "2.76.25" : null;
51340
51344
  if (!current2) return;
51341
51345
  const cache = readCache();
51342
51346
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -51353,7 +51357,7 @@ function checkForUpdates() {
51353
51357
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
51354
51358
  if (process.env.CI) return;
51355
51359
  if (!process.stdout.isTTY) return;
51356
- const current2 = true ? "2.76.24" : null;
51360
+ const current2 = true ? "2.76.25" : null;
51357
51361
  if (!current2) return;
51358
51362
  const cache = readCache();
51359
51363
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -51636,7 +51640,7 @@ var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
51636
51640
  var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
51637
51641
  var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
51638
51642
  function currentCliVersion() {
51639
- return true ? "2.76.24" : null;
51643
+ return true ? "2.76.25" : null;
51640
51644
  }
51641
51645
  async function installedVersion(deps) {
51642
51646
  const ls = await deps.run(
@@ -51847,7 +51851,7 @@ function signalHostReady(send = process.send?.bind(process)) {
51847
51851
  }
51848
51852
  function defaultDeps() {
51849
51853
  return {
51850
- ownVersion: true ? "2.76.24" : null,
51854
+ ownVersion: true ? "2.76.25" : null,
51851
51855
  root: cliVersionsRoot(),
51852
51856
  args: process.argv.slice(3),
51853
51857
  execPath: process.execPath,
@@ -54076,9 +54080,14 @@ var HostAgentSupervisor = class {
54076
54080
  async function resolveHostIdentity(enrollToken) {
54077
54081
  const existing = ensureControlPollSecret(loadHostIdentity());
54078
54082
  if (enrollToken) {
54083
+ const tokenHash = enrollTokenHash(enrollToken);
54084
+ if (existing?.consumedEnrollTokenSha256 === tokenHash) return existing;
54079
54085
  await reportProgress({ enrollToken }, "redeeming", "redeeming enrollment token\u2026");
54080
54086
  try {
54081
- const identity = await redeemEnrollToken(enrollToken);
54087
+ const identity = {
54088
+ ...await redeemEnrollToken(enrollToken),
54089
+ consumedEnrollTokenSha256: tokenHash
54090
+ };
54082
54091
  saveHostIdentity(identity);
54083
54092
  await reportProgress(
54084
54093
  { hostId: identity.hostId, hostToken: identity.hostToken },
@@ -54093,7 +54102,9 @@ async function resolveHostIdentity(enrollToken) {
54093
54102
  "host-agent",
54094
54103
  "enroll token terminally rejected (expired/replayed) but a sealed identity is present; resuming from it \u2014 likely a restart, not a re-enroll"
54095
54104
  );
54096
- return existing;
54105
+ const resumed = { ...existing, consumedEnrollTokenSha256: tokenHash };
54106
+ saveHostIdentity(resumed);
54107
+ return resumed;
54097
54108
  }
54098
54109
  throw new Error(
54099
54110
  "Enrollment token expired or invalid \u2014 generate a new one in the app (Settings \u203A Servers \u203A Add server). Tokens expire after 15 minutes and are single-use.",
@@ -54374,7 +54385,7 @@ function checkChokidar() {
54374
54385
  }
54375
54386
  async function doctor(args2 = []) {
54376
54387
  const json = args2.includes("--json");
54377
- const cliVersion = true ? "2.76.24" : "0.0.0-dev";
54388
+ const cliVersion = true ? "2.76.25" : "0.0.0-dev";
54378
54389
  const apiBase2 = resolveApiBaseUrl();
54379
54390
  const diagnosticId = (0, import_node_crypto17.randomUUID)();
54380
54391
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -54910,7 +54921,7 @@ async function mcpWarm(argv = [], opts = {}) {
54910
54921
  // src/commands/version.ts
54911
54922
  var import_picocolors15 = __toESM(require("picocolors"));
54912
54923
  function version2() {
54913
- const v = true ? "2.76.24" : "unknown";
54924
+ const v = true ? "2.76.25" : "unknown";
54914
54925
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
54915
54926
  }
54916
54927
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.76.24",
3
+ "version": "2.76.25",
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",