codeam-cli 2.76.9 → 2.76.10

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.76.9] — 2026-10-01
8
+
9
+ ### Added
10
+
11
+ - **plugin:** OpenAI plugin package for ChatGPT and Codex (#885)
12
+
13
+ ### Documentation
14
+
15
+ - **plugin:** Submission sheet matches the review account's real setup (#886)
16
+ - **plugin:** Submission case for search_codeagent_help (#887)
17
+
18
+ ### Fixed
19
+
20
+ - **plugin:** Address directory review — no .app.json, 3 prompts, no brands or pricing (#888)
21
+ - **cli:** Scratch projects reach their first preview (#889)
22
+
7
23
  ## [2.76.8] — 2026-09-29
8
24
 
9
25
  ### Fixed
package/dist/index.js CHANGED
@@ -10579,7 +10579,7 @@ function readAnonId() {
10579
10579
  }
10580
10580
  function superProperties() {
10581
10581
  return {
10582
- cliVersion: true ? "2.76.9" : "0.0.0-dev",
10582
+ cliVersion: true ? "2.76.10" : "0.0.0-dev",
10583
10583
  nodeVersion: process.version,
10584
10584
  platform: process.platform,
10585
10585
  arch: process.arch,
@@ -10824,7 +10824,7 @@ var http = __toESM(require("http"));
10824
10824
  // package.json
10825
10825
  var package_default = {
10826
10826
  name: "codeam-cli",
10827
- version: "2.76.9",
10827
+ version: "2.76.10",
10828
10828
  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.",
10829
10829
  type: "commonjs",
10830
10830
  main: "dist/index.js",
@@ -12160,7 +12160,7 @@ var CommandRelayService = class _CommandRelayService {
12160
12160
  // fresh + clear the "CLI update available" banner after a self-update
12161
12161
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
12162
12162
  // pair/reconnect). Older backends ignore the extra field.
12163
- ..."2.76.9" ? { ideVersion: "2.76.9" } : {}
12163
+ ..."2.76.10" ? { ideVersion: "2.76.10" } : {}
12164
12164
  };
12165
12165
  try {
12166
12166
  const res = await _postJson(`${API_BASE2}/api/plugin/heartbeat`, body);
@@ -23621,9 +23621,9 @@ var healRestartCounts = /* @__PURE__ */ new Map();
23621
23621
  function resetBuildHealState(sessionId) {
23622
23622
  healRestartCounts.delete(sessionId);
23623
23623
  }
23624
- function readMarker2(markerPath4) {
23624
+ function readMarker2(markerPath5) {
23625
23625
  try {
23626
- return fs42.readFileSync(markerPath4, "utf8").trim();
23626
+ return fs42.readFileSync(markerPath5, "utf8").trim();
23627
23627
  } catch {
23628
23628
  return null;
23629
23629
  }
@@ -23633,12 +23633,12 @@ function watchForBuildClobber(deps) {
23633
23633
  const debounceMs = deps.debounceMs ?? DEFAULT_DEBOUNCE_MS;
23634
23634
  const maxRestarts = deps.maxRestarts ?? DEFAULT_MAX_RESTARTS;
23635
23635
  const nextDir = path49.join(deps.cwd, ".next");
23636
- const markerPath4 = path49.join(nextDir, BUILD_MARKER_NAME);
23636
+ const markerPath5 = path49.join(nextDir, BUILD_MARKER_NAME);
23637
23637
  let stopped = false;
23638
23638
  let debounceTimer = null;
23639
23639
  let dirUnwatch = null;
23640
23640
  let cwdUnwatch = null;
23641
- let lastKnownMarker = readMarker2(markerPath4);
23641
+ let lastKnownMarker = readMarker2(markerPath5);
23642
23642
  const stop = () => {
23643
23643
  if (stopped) return;
23644
23644
  stopped = true;
@@ -23653,7 +23653,7 @@ function watchForBuildClobber(deps) {
23653
23653
  };
23654
23654
  const onDebouncedClobber = () => {
23655
23655
  if (stopped) return;
23656
- const current2 = readMarker2(markerPath4);
23656
+ const current2 = readMarker2(markerPath5);
23657
23657
  if (current2 === lastKnownMarker) return;
23658
23658
  lastKnownMarker = current2;
23659
23659
  const count = (healRestartCounts.get(deps.sessionId) ?? 0) + 1;
@@ -23671,7 +23671,7 @@ function watchForBuildClobber(deps) {
23671
23671
  }
23672
23672
  log.info(
23673
23673
  "preview",
23674
- `build-heal: ${markerPath4} changed (a build likely ran) \u2014 restarting the dev server (${count}/${maxRestarts})`
23674
+ `build-heal: ${markerPath5} changed (a build likely ran) \u2014 restarting the dev server (${count}/${maxRestarts})`
23675
23675
  );
23676
23676
  deps.notify("Rebuilt \u2014 restarting preview");
23677
23677
  deps.restart();
@@ -23686,7 +23686,7 @@ function watchForBuildClobber(deps) {
23686
23686
  };
23687
23687
  const attachDirWatch = () => {
23688
23688
  if (dirUnwatch) return;
23689
- lastKnownMarker = readMarker2(markerPath4);
23689
+ lastKnownMarker = readMarker2(markerPath5);
23690
23690
  dirUnwatch = watchDir(nextDir, (filename) => {
23691
23691
  if (filename === null || filename === BUILD_MARKER_NAME) onMarkerTouched();
23692
23692
  });
@@ -25157,7 +25157,9 @@ function hasServableProject(cwd) {
25157
25157
  const entries2 = rootEntries(cwd);
25158
25158
  if (!entries2) return false;
25159
25159
  if (entries2.some((e) => SERVABLE_ROOT_FILES.has(e) || /\.html?$/i.test(e))) return true;
25160
- return ["public", "src"].some((dir) => import_node_fs14.default.existsSync(import_node_path12.default.join(cwd, dir, "index.html")));
25160
+ return ["public", "src", "dist", "build"].some(
25161
+ (dir) => import_node_fs14.default.existsSync(import_node_path12.default.join(cwd, dir, "index.html"))
25162
+ );
25161
25163
  }
25162
25164
  function isEmptyScratchProject(cwd) {
25163
25165
  if (!isScratchWorkspace(cwd)) return false;
@@ -25165,14 +25167,35 @@ function isEmptyScratchProject(cwd) {
25165
25167
  return entries2 !== null && entries2.every((e) => e.startsWith(".") || AGENT_NOTES.has(e));
25166
25168
  }
25167
25169
  var bringUps = /* @__PURE__ */ new Set();
25168
- function notePreviewBringUp(sessionId) {
25170
+ var AUTO_PREVIEW_MARKER = import_node_path12.default.join(".codeam", "auto-preview-state.json");
25171
+ function markerPath2(cwd) {
25172
+ return import_node_path12.default.join(cwd, AUTO_PREVIEW_MARKER);
25173
+ }
25174
+ function hasAttemptedMarker(cwd) {
25175
+ try {
25176
+ return import_node_fs14.default.existsSync(markerPath2(cwd));
25177
+ } catch {
25178
+ return false;
25179
+ }
25180
+ }
25181
+ function writeAttemptedMarker(cwd) {
25182
+ try {
25183
+ const file = markerPath2(cwd);
25184
+ import_node_fs14.default.mkdirSync(import_node_path12.default.dirname(file), { recursive: true });
25185
+ import_node_fs14.default.writeFileSync(file, '{"attempted":true}\n', "utf-8");
25186
+ } catch {
25187
+ }
25188
+ }
25189
+ function notePreviewBringUp(sessionId, cwd = process.cwd()) {
25169
25190
  bringUps.add(sessionId);
25191
+ if (isScratchWorkspace(cwd)) writeAttemptedMarker(cwd);
25170
25192
  }
25171
25193
  function maybeAutoOpenScratchPreview(sessionId, bridge, cwd = process.cwd()) {
25172
- if (!isScratchWorkspace(cwd) || bringUps.has(sessionId)) return false;
25194
+ if (!isScratchWorkspace(cwd) || bringUps.has(sessionId) || hasAttemptedMarker(cwd)) return false;
25173
25195
  if (bridge.status().status !== "idle") return false;
25174
25196
  if (!hasServableProject(cwd)) return false;
25175
25197
  bringUps.add(sessionId);
25198
+ writeAttemptedMarker(cwd);
25176
25199
  void bridge.start().catch(() => {
25177
25200
  });
25178
25201
  return true;
@@ -25183,13 +25206,13 @@ var import_node_crypto11 = require("crypto");
25183
25206
  var import_promises5 = __toESM(require("fs/promises"));
25184
25207
  var import_node_os7 = __toESM(require("os"));
25185
25208
  var import_node_path13 = __toESM(require("path"));
25186
- function markerPath2(cwd, homeDir2 = import_node_os7.default.homedir()) {
25209
+ function markerPath3(cwd, homeDir2 = import_node_os7.default.homedir()) {
25187
25210
  const key = (0, import_node_crypto11.createHash)("sha256").update(import_node_path13.default.resolve(cwd)).digest("hex").slice(0, 16);
25188
25211
  return import_node_path13.default.join(homeDir2, ".codeam", "preview-active", `${key}.json`);
25189
25212
  }
25190
25213
  async function writeActivePreviewMarker(cwd, detection, homeDir2) {
25191
25214
  try {
25192
- const file = markerPath2(cwd, homeDir2);
25215
+ const file = markerPath3(cwd, homeDir2);
25193
25216
  await import_promises5.default.mkdir(import_node_path13.default.dirname(file), { recursive: true });
25194
25217
  await import_promises5.default.writeFile(
25195
25218
  file,
@@ -25200,11 +25223,11 @@ async function writeActivePreviewMarker(cwd, detection, homeDir2) {
25200
25223
  }
25201
25224
  }
25202
25225
  async function clearActivePreviewMarker(cwd, homeDir2) {
25203
- await import_promises5.default.rm(markerPath2(cwd, homeDir2), { force: true }).catch(() => void 0);
25226
+ await import_promises5.default.rm(markerPath3(cwd, homeDir2), { force: true }).catch(() => void 0);
25204
25227
  }
25205
25228
  async function readActivePreviewMarker(cwd, homeDir2) {
25206
25229
  try {
25207
- const raw = await import_promises5.default.readFile(markerPath2(cwd, homeDir2), "utf8");
25230
+ const raw = await import_promises5.default.readFile(markerPath3(cwd, homeDir2), "utf8");
25208
25231
  const parsed = JSON.parse(raw);
25209
25232
  return parsed.detection && typeof parsed.detection.command === "string" ? parsed.detection : null;
25210
25233
  } catch {
@@ -25347,12 +25370,16 @@ function buildHouseProxyChildEnv(cfg) {
25347
25370
  };
25348
25371
  if (cfg.openRouter === true) {
25349
25372
  env.ANTHROPIC_API_KEY = "";
25350
- } else {
25351
- const model = typeof cfg.model === "string" && cfg.model ? cfg.model : "MiniMax-M3";
25352
- env.ANTHROPIC_MODEL = model;
25353
- env.ANTHROPIC_DEFAULT_SONNET_MODEL = model;
25354
- env.ANTHROPIC_DEFAULT_OPUS_MODEL = model;
25355
- env.ANTHROPIC_DEFAULT_HAIKU_MODEL = model;
25373
+ } else if (typeof cfg.model === "string" && cfg.model) {
25374
+ env.ANTHROPIC_MODEL = cfg.model;
25375
+ env.ANTHROPIC_DEFAULT_SONNET_MODEL = cfg.model;
25376
+ env.ANTHROPIC_DEFAULT_OPUS_MODEL = cfg.model;
25377
+ env.ANTHROPIC_DEFAULT_HAIKU_MODEL = cfg.model;
25378
+ } else if (!isManagedProviderId(cfg.managedAgentId)) {
25379
+ env.ANTHROPIC_MODEL = "MiniMax-M3";
25380
+ env.ANTHROPIC_DEFAULT_SONNET_MODEL = "MiniMax-M3";
25381
+ env.ANTHROPIC_DEFAULT_OPUS_MODEL = "MiniMax-M3";
25382
+ env.ANTHROPIC_DEFAULT_HAIKU_MODEL = "MiniMax-M3";
25356
25383
  }
25357
25384
  if (typeof cfg.claudeConfigDir === "string" && cfg.claudeConfigDir) {
25358
25385
  env.CLAUDE_CONFIG_DIR = cfg.claudeConfigDir;
@@ -39853,13 +39880,13 @@ var import_node_crypto13 = require("crypto");
39853
39880
  var import_promises6 = __toESM(require("fs/promises"));
39854
39881
  var import_node_os14 = __toESM(require("os"));
39855
39882
  var import_node_path20 = __toESM(require("path"));
39856
- function markerPath3(cwd, homeDir2 = import_node_os14.default.homedir()) {
39883
+ function markerPath4(cwd, homeDir2 = import_node_os14.default.homedir()) {
39857
39884
  const key = (0, import_node_crypto13.createHash)("sha256").update(import_node_path20.default.resolve(cwd)).digest("hex").slice(0, 16);
39858
39885
  return import_node_path20.default.join(homeDir2, ".codeam", "conversation-active", `${key}.json`);
39859
39886
  }
39860
39887
  async function writeActiveConversationMarker(cwd, conversationId, homeDir2) {
39861
39888
  try {
39862
- const file = markerPath3(cwd, homeDir2);
39889
+ const file = markerPath4(cwd, homeDir2);
39863
39890
  await import_promises6.default.mkdir(import_node_path20.default.dirname(file), { recursive: true });
39864
39891
  await import_promises6.default.writeFile(
39865
39892
  file,
@@ -39871,7 +39898,7 @@ async function writeActiveConversationMarker(cwd, conversationId, homeDir2) {
39871
39898
  }
39872
39899
  async function readActiveConversationMarker(cwd, homeDir2) {
39873
39900
  try {
39874
- const raw = await import_promises6.default.readFile(markerPath3(cwd, homeDir2), "utf8");
39901
+ const raw = await import_promises6.default.readFile(markerPath4(cwd, homeDir2), "utf8");
39875
39902
  const parsed = JSON.parse(raw);
39876
39903
  return typeof parsed.conversationId === "string" && parsed.conversationId ? parsed.conversationId : null;
39877
39904
  } catch {
@@ -50143,7 +50170,7 @@ async function autoUpgradeBeforeCriticalCommand() {
50143
50170
  if (process.env.NODE_ENV === "test") return;
50144
50171
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
50145
50172
  if (process.env.CI) return;
50146
- const current2 = true ? "2.76.9" : null;
50173
+ const current2 = true ? "2.76.10" : null;
50147
50174
  if (!current2) return;
50148
50175
  const cache = readCache();
50149
50176
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -50160,7 +50187,7 @@ function checkForUpdates() {
50160
50187
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
50161
50188
  if (process.env.CI) return;
50162
50189
  if (!process.stdout.isTTY) return;
50163
- const current2 = true ? "2.76.9" : null;
50190
+ const current2 = true ? "2.76.10" : null;
50164
50191
  if (!current2) return;
50165
50192
  const cache = readCache();
50166
50193
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -50183,7 +50210,7 @@ var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
50183
50210
  var SELF_UPDATE_LS_TIMEOUT_MS = 15e3;
50184
50211
  var SUDO_PREFLIGHT_TIMEOUT_MS = 5e3;
50185
50212
  function currentCliVersion() {
50186
- return true ? "2.76.9" : null;
50213
+ return true ? "2.76.10" : null;
50187
50214
  }
50188
50215
  async function installedVersion(deps) {
50189
50216
  const ls = await deps.run(
@@ -51351,8 +51378,14 @@ var HostAgentSupervisor = class {
51351
51378
  let extraArgs = [];
51352
51379
  if (payload.houseProxy) {
51353
51380
  const { baseUrl, token, agentKind, openRouter } = payload.houseProxy;
51381
+ const managedAgentId = isManagedProviderId(payload.agentId) ? payload.agentId : void 0;
51354
51382
  childEnv = {
51355
- ...buildHouseProxyChildEnv({ baseUrl, token, openRouter: openRouter === true }),
51383
+ ...buildHouseProxyChildEnv({
51384
+ baseUrl,
51385
+ token,
51386
+ openRouter: openRouter === true,
51387
+ ...managedAgentId ? { managedAgentId } : {}
51388
+ }),
51356
51389
  CODEAM_AUTO_TOKEN: payload.autoPairToken
51357
51390
  };
51358
51391
  const houseConfigDir = path105.join(
@@ -51371,7 +51404,8 @@ var HostAgentSupervisor = class {
51371
51404
  baseUrl,
51372
51405
  token,
51373
51406
  openRouter: !!openRouter,
51374
- claudeConfigDir: houseConfigDir
51407
+ claudeConfigDir: houseConfigDir,
51408
+ ...managedAgentId ? { managedAgentId } : {}
51375
51409
  }, payload.deployId);
51376
51410
  } else {
51377
51411
  const auth = await this.resolveAgentAuth(this.identity, payload.sealedAgentAuth);
@@ -52273,7 +52307,7 @@ function checkChokidar() {
52273
52307
  }
52274
52308
  async function doctor(args2 = []) {
52275
52309
  const json = args2.includes("--json");
52276
- const cliVersion = true ? "2.76.9" : "0.0.0-dev";
52310
+ const cliVersion = true ? "2.76.10" : "0.0.0-dev";
52277
52311
  const apiBase2 = resolveApiBaseUrl();
52278
52312
  const diagnosticId = (0, import_node_crypto17.randomUUID)();
52279
52313
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -52797,7 +52831,7 @@ async function mcpWarm(argv = [], opts = {}) {
52797
52831
  // src/commands/version.ts
52798
52832
  var import_picocolors15 = __toESM(require("picocolors"));
52799
52833
  function version2() {
52800
- const v = true ? "2.76.9" : "unknown";
52834
+ const v = true ? "2.76.10" : "unknown";
52801
52835
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
52802
52836
  }
52803
52837
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.76.9",
3
+ "version": "2.76.10",
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",