codeam-cli 2.52.7 → 2.52.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,12 @@ 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.52.7] — 2026-07-03
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Wait for Claude native binary before spawning the agent in codespaces
12
+
7
13
  ## [2.52.6] — 2026-07-03
8
14
 
9
15
  ### Fixed
package/dist/index.js CHANGED
@@ -5397,7 +5397,7 @@ function readAnonId() {
5397
5397
  }
5398
5398
  function superProperties() {
5399
5399
  return {
5400
- cliVersion: true ? "2.52.7" : "0.0.0-dev",
5400
+ cliVersion: true ? "2.52.8" : "0.0.0-dev",
5401
5401
  nodeVersion: process.version,
5402
5402
  platform: process.platform,
5403
5403
  arch: process.arch,
@@ -5578,7 +5578,7 @@ var os4 = __toESM(require("os"));
5578
5578
  // package.json
5579
5579
  var package_default = {
5580
5580
  name: "codeam-cli",
5581
- version: "2.52.7",
5581
+ version: "2.52.8",
5582
5582
  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.",
5583
5583
  type: "commonjs",
5584
5584
  main: "dist/index.js",
@@ -14928,7 +14928,7 @@ async function autoUpgradeBeforeCriticalCommand() {
14928
14928
  if (process.env.NODE_ENV === "test") return;
14929
14929
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
14930
14930
  if (process.env.CI) return;
14931
- const current = true ? "2.52.7" : null;
14931
+ const current = true ? "2.52.8" : null;
14932
14932
  if (!current) return;
14933
14933
  const cache = readCache();
14934
14934
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -14945,7 +14945,7 @@ function checkForUpdates() {
14945
14945
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
14946
14946
  if (process.env.CI) return;
14947
14947
  if (!process.stdout.isTTY) return;
14948
- const current = true ? "2.52.7" : null;
14948
+ const current = true ? "2.52.8" : null;
14949
14949
  if (!current) return;
14950
14950
  const cache = readCache();
14951
14951
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -15647,7 +15647,7 @@ var defaultSpawner = (env, cwd, args2 = []) => (0, import_node_child_process15.s
15647
15647
  detached: false
15648
15648
  });
15649
15649
  function currentCliVersion() {
15650
- return true ? "2.52.7" : null;
15650
+ return true ? "2.52.8" : null;
15651
15651
  }
15652
15652
  function runCmd(cmd, args2, timeoutMs) {
15653
15653
  return new Promise((resolve7) => {
@@ -20997,19 +20997,98 @@ var AgentService = class _AgentService {
20997
20997
  };
20998
20998
 
20999
20999
  // src/agents/acp/adapters.ts
21000
- var path50 = __toESM(require("path"));
21000
+ var path51 = __toESM(require("path"));
21001
+
21002
+ // src/agents/acp/agent-binary.ts
21003
+ var import_fs4 = __toESM(require("fs"));
21004
+ var import_path8 = __toESM(require("path"));
21005
+ var import_child_process23 = require("child_process");
21006
+ function currentPlatformKey() {
21007
+ return `${process.platform}-${process.arch}`;
21008
+ }
21009
+ function defaultSdkDir() {
21010
+ try {
21011
+ const manifest = require.resolve("@anthropic-ai/claude-agent-sdk/package.json");
21012
+ return import_path8.default.dirname(manifest);
21013
+ } catch {
21014
+ return null;
21015
+ }
21016
+ }
21017
+ function resolveClaudeNativeBinary(deps = {}) {
21018
+ const existsSync21 = deps.existsSync ?? import_fs4.default.existsSync;
21019
+ const platformKey = deps.platformKey ?? currentPlatformKey();
21020
+ const sdkDir = deps.sdkDir !== void 0 ? deps.sdkDir : defaultSdkDir();
21021
+ if (!sdkDir) return null;
21022
+ const scopeDir = import_path8.default.dirname(sdkDir);
21023
+ const binName = process.platform === "win32" ? "claude.exe" : "claude";
21024
+ const candidate = import_path8.default.join(scopeDir, `claude-agent-sdk-${platformKey}`, binName);
21025
+ return existsSync21(candidate) ? candidate : null;
21026
+ }
21027
+ var realSleep = (ms) => new Promise((resolve7) => setTimeout(resolve7, ms));
21028
+ async function waitForClaudeNativeBinary(opts = {}) {
21029
+ const timeoutMs = opts.timeoutMs ?? 18e4;
21030
+ const pollMs = opts.pollMs ?? 500;
21031
+ const now = opts.now ?? Date.now;
21032
+ const sleep3 = opts.sleep ?? realSleep;
21033
+ const deps = {
21034
+ sdkDir: opts.sdkDir,
21035
+ platformKey: opts.platformKey,
21036
+ existsSync: opts.existsSync
21037
+ };
21038
+ const deadline = now() + timeoutMs;
21039
+ let found = resolveClaudeNativeBinary(deps);
21040
+ if (found) return found;
21041
+ while (now() < deadline) {
21042
+ await sleep3(pollMs);
21043
+ found = resolveClaudeNativeBinary(deps);
21044
+ if (found) return found;
21045
+ }
21046
+ return resolveClaudeNativeBinary(deps);
21047
+ }
21048
+ function isCommandOnPath(cmd, probe = defaultWhich) {
21049
+ return probe(cmd);
21050
+ }
21051
+ function defaultWhich(cmd) {
21052
+ const finder = process.platform === "win32" ? "where" : "which";
21053
+ try {
21054
+ const res = (0, import_child_process23.spawnSync)(finder, [cmd], { stdio: "ignore" });
21055
+ return res.status === 0;
21056
+ } catch {
21057
+ return false;
21058
+ }
21059
+ }
21060
+ async function waitForCommandOnPath(cmd, opts = {}) {
21061
+ const timeoutMs = opts.timeoutMs ?? 18e4;
21062
+ const pollMs = opts.pollMs ?? 500;
21063
+ const now = opts.now ?? Date.now;
21064
+ const sleep3 = opts.sleep ?? realSleep;
21065
+ const probe = opts.probe;
21066
+ const check = () => isCommandOnPath(cmd, probe);
21067
+ const deadline = now() + timeoutMs;
21068
+ if (check()) return true;
21069
+ while (now() < deadline) {
21070
+ await sleep3(pollMs);
21071
+ if (check()) return true;
21072
+ }
21073
+ return check();
21074
+ }
21075
+
21076
+ // src/agents/acp/adapters.ts
21001
21077
  var require_ = require;
21078
+ function claudeBinaryWaiter(opts = {}) {
21079
+ return waitForClaudeNativeBinary(opts).then((p2) => p2 !== null);
21080
+ }
21002
21081
  function resolveBin(pkgName, binName) {
21003
21082
  try {
21004
21083
  const manifestPath = require_.resolve(`${pkgName}/package.json`);
21005
21084
  const manifest = require_(`${pkgName}/package.json`);
21006
- const pkgDir = path50.dirname(manifestPath);
21085
+ const pkgDir = path51.dirname(manifestPath);
21007
21086
  const bin = manifest.bin;
21008
21087
  if (!bin) return null;
21009
- if (typeof bin === "string") return path50.resolve(pkgDir, bin);
21088
+ if (typeof bin === "string") return path51.resolve(pkgDir, bin);
21010
21089
  const target = binName ?? Object.keys(bin)[0];
21011
21090
  if (!target || !bin[target]) return null;
21012
- return path50.resolve(pkgDir, bin[target]);
21091
+ return path51.resolve(pkgDir, bin[target]);
21013
21092
  } catch {
21014
21093
  return null;
21015
21094
  }
@@ -21021,7 +21100,8 @@ var REGISTRY = {
21021
21100
  return {
21022
21101
  command: process.execPath,
21023
21102
  args: [bin],
21024
- requiresAgentBinary: "claude"
21103
+ requiresAgentBinary: "claude",
21104
+ waitForBinary: claudeBinaryWaiter
21025
21105
  };
21026
21106
  },
21027
21107
  codex: () => {
@@ -21030,7 +21110,9 @@ var REGISTRY = {
21030
21110
  return {
21031
21111
  command: process.execPath,
21032
21112
  args: [bin],
21033
- requiresAgentBinary: "codex"
21113
+ requiresAgentBinary: "codex",
21114
+ // codex ships via `npm install -g @openai/codex` → PATH binary.
21115
+ waitForBinary: (o) => waitForCommandOnPath("codex", o)
21034
21116
  };
21035
21117
  },
21036
21118
  // Cursor speaks ACP NATIVELY via `cursor-agent acp` ("Start the Cursor
@@ -21047,7 +21129,8 @@ var REGISTRY = {
21047
21129
  cursor: () => ({
21048
21130
  command: "cursor-agent",
21049
21131
  args: ["acp"],
21050
- requiresAgentBinary: "cursor-agent"
21132
+ requiresAgentBinary: "cursor-agent",
21133
+ waitForBinary: (o) => waitForCommandOnPath("cursor-agent", o)
21051
21134
  }),
21052
21135
  // Gemini speaks ACP natively via `gemini --acp` — no npm adapter
21053
21136
  // package, just the user-installed `gemini` binary on PATH. Same
@@ -21064,7 +21147,8 @@ var REGISTRY = {
21064
21147
  // cleaner because it survives whatever shell env the parent
21065
21148
  // codeam was launched from.
21066
21149
  args: ["--skip-trust", "--acp"],
21067
- requiresAgentBinary: "gemini"
21150
+ requiresAgentBinary: "gemini",
21151
+ waitForBinary: (o) => waitForCommandOnPath("gemini", o)
21068
21152
  })
21069
21153
  };
21070
21154
  function getAcpAdapter(agent) {
@@ -21075,52 +21159,6 @@ function requiresAcp(agent) {
21075
21159
  return getAcpAdapter(agent) !== null;
21076
21160
  }
21077
21161
 
21078
- // src/agents/acp/claude-binary.ts
21079
- var import_fs4 = __toESM(require("fs"));
21080
- var import_path8 = __toESM(require("path"));
21081
- function currentPlatformKey() {
21082
- return `${process.platform}-${process.arch}`;
21083
- }
21084
- function defaultSdkDir() {
21085
- try {
21086
- const manifest = require.resolve("@anthropic-ai/claude-agent-sdk/package.json");
21087
- return import_path8.default.dirname(manifest);
21088
- } catch {
21089
- return null;
21090
- }
21091
- }
21092
- function resolveClaudeNativeBinary(deps = {}) {
21093
- const existsSync21 = deps.existsSync ?? import_fs4.default.existsSync;
21094
- const platformKey = deps.platformKey ?? currentPlatformKey();
21095
- const sdkDir = deps.sdkDir !== void 0 ? deps.sdkDir : defaultSdkDir();
21096
- if (!sdkDir) return null;
21097
- const scopeDir = import_path8.default.dirname(sdkDir);
21098
- const binName = process.platform === "win32" ? "claude.exe" : "claude";
21099
- const candidate = import_path8.default.join(scopeDir, `claude-agent-sdk-${platformKey}`, binName);
21100
- return existsSync21(candidate) ? candidate : null;
21101
- }
21102
- var realSleep = (ms) => new Promise((resolve7) => setTimeout(resolve7, ms));
21103
- async function waitForClaudeNativeBinary(opts = {}) {
21104
- const timeoutMs = opts.timeoutMs ?? 18e4;
21105
- const pollMs = opts.pollMs ?? 500;
21106
- const now = opts.now ?? Date.now;
21107
- const sleep3 = opts.sleep ?? realSleep;
21108
- const deps = {
21109
- sdkDir: opts.sdkDir,
21110
- platformKey: opts.platformKey,
21111
- existsSync: opts.existsSync
21112
- };
21113
- const deadline = now() + timeoutMs;
21114
- let found = resolveClaudeNativeBinary(deps);
21115
- if (found) return found;
21116
- while (now() < deadline) {
21117
- await sleep3(pollMs);
21118
- found = resolveClaudeNativeBinary(deps);
21119
- if (found) return found;
21120
- }
21121
- return resolveClaudeNativeBinary(deps);
21122
- }
21123
-
21124
21162
  // src/agents/acp/runner.ts
21125
21163
  var import_node_crypto7 = require("crypto");
21126
21164
 
@@ -25160,7 +25198,7 @@ function commonPrefixLength(a, b) {
25160
25198
  }
25161
25199
 
25162
25200
  // src/agents/acp/onboarding.ts
25163
- var import_child_process23 = require("child_process");
25201
+ var import_child_process24 = require("child_process");
25164
25202
  var fs48 = __toESM(require("fs"));
25165
25203
  var os40 = __toESM(require("os"));
25166
25204
  var path54 = __toESM(require("path"));
@@ -25181,7 +25219,7 @@ var _onboardingSeam = {
25181
25219
  */
25182
25220
  gitRemoteUrl: (cwd) => {
25183
25221
  try {
25184
- return (0, import_child_process23.execFileSync)("git", ["-C", cwd, "remote", "get-url", "origin"], {
25222
+ return (0, import_child_process24.execFileSync)("git", ["-C", cwd, "remote", "get-url", "origin"], {
25185
25223
  encoding: "utf8",
25186
25224
  stdio: ["ignore", "pipe", "ignore"],
25187
25225
  timeout: 2e3
@@ -25483,7 +25521,7 @@ function extractSelectPrompt(text) {
25483
25521
  var import_crypto5 = require("crypto");
25484
25522
 
25485
25523
  // src/services/turn-files/git-changeset.ts
25486
- var import_child_process24 = require("child_process");
25524
+ var import_child_process25 = require("child_process");
25487
25525
  var fs49 = __toESM(require("fs/promises"));
25488
25526
  var path55 = __toESM(require("path"));
25489
25527
  async function collectRepoChangeset(opts) {
@@ -25598,7 +25636,7 @@ function defaultRunGit(cwd, args2) {
25598
25636
  return new Promise((resolve7) => {
25599
25637
  let proc;
25600
25638
  try {
25601
- proc = (0, import_child_process24.spawn)("git", args2, { cwd, env: process.env });
25639
+ proc = (0, import_child_process25.spawn)("git", args2, { cwd, env: process.env });
25602
25640
  } catch {
25603
25641
  resolve7(null);
25604
25642
  return;
@@ -28574,10 +28612,10 @@ async function start(requestedAgent) {
28574
28612
  const depsReady = process.env.CODESPACES === "true" ? provisionProjectDependencies(cwd).catch(() => void 0) : Promise.resolve();
28575
28613
  if (process.env.CODESPACES === "true") {
28576
28614
  const GATE_TIMEOUT_MS = 24e4;
28577
- const claudeBinaryReady = session.agent === "claude" ? waitForClaudeNativeBinary({ timeoutMs: GATE_TIMEOUT_MS }).catch(() => null) : Promise.resolve();
28615
+ const agentBinaryReady = getAcpAdapter(session.agent)?.waitForBinary({ timeoutMs: GATE_TIMEOUT_MS }).catch(() => false) ?? Promise.resolve(true);
28578
28616
  let gateTimer;
28579
28617
  await Promise.race([
28580
- Promise.all([beadsReady.catch(() => null), depsReady, claudeBinaryReady]),
28618
+ Promise.all([beadsReady.catch(() => null), depsReady, agentBinaryReady]),
28581
28619
  new Promise((resolve7) => {
28582
28620
  gateTimer = setTimeout(resolve7, GATE_TIMEOUT_MS);
28583
28621
  })
@@ -29118,11 +29156,11 @@ async function logout() {
29118
29156
  var import_picocolors11 = __toESM(require("picocolors"));
29119
29157
 
29120
29158
  // src/services/providers/github-codespaces.ts
29121
- var import_child_process25 = require("child_process");
29159
+ var import_child_process26 = require("child_process");
29122
29160
  var import_util4 = require("util");
29123
29161
  var import_picocolors9 = __toESM(require("picocolors"));
29124
29162
  var path58 = __toESM(require("path"));
29125
- var execFileP6 = (0, import_util4.promisify)(import_child_process25.execFile);
29163
+ var execFileP6 = (0, import_util4.promisify)(import_child_process26.execFile);
29126
29164
  var MAX_BUFFER = 8 * 1024 * 1024;
29127
29165
  function resetStdinForChild() {
29128
29166
  if (process.stdin.isTTY) {
@@ -29166,7 +29204,7 @@ var GitHubCodespacesProvider = class {
29166
29204
  if (!isAuthed) {
29167
29205
  resetStdinForChild();
29168
29206
  await new Promise((resolve7, reject) => {
29169
- const proc = (0, import_child_process25.spawn)("gh", ["auth", "login", "-s", "codespace,repo,read:user"], {
29207
+ const proc = (0, import_child_process26.spawn)("gh", ["auth", "login", "-s", "codespace,repo,read:user"], {
29170
29208
  stdio: "inherit"
29171
29209
  });
29172
29210
  proc.on("exit", (code) => {
@@ -29200,7 +29238,7 @@ var GitHubCodespacesProvider = class {
29200
29238
  wt(noteLines.join("\n"), "One more permission needed");
29201
29239
  resetStdinForChild();
29202
29240
  const refreshCode = await new Promise((resolve7, reject) => {
29203
- const proc = (0, import_child_process25.spawn)(
29241
+ const proc = (0, import_child_process26.spawn)(
29204
29242
  "gh",
29205
29243
  ["auth", "refresh", "-h", "github.com", "-s", "codespace"],
29206
29244
  { stdio: "inherit" }
@@ -29350,7 +29388,7 @@ var GitHubCodespacesProvider = class {
29350
29388
  O2.step(`Installing gh via ${installCmd.describe}\u2026`);
29351
29389
  resetStdinForChild();
29352
29390
  const ok = await new Promise((resolve7) => {
29353
- const proc = (0, import_child_process25.spawn)(installCmd.exe, installCmd.args, { stdio: "inherit" });
29391
+ const proc = (0, import_child_process26.spawn)(installCmd.exe, installCmd.args, { stdio: "inherit" });
29354
29392
  proc.on("exit", (code) => resolve7(code === 0));
29355
29393
  proc.on("error", () => resolve7(false));
29356
29394
  });
@@ -29377,7 +29415,7 @@ var GitHubCodespacesProvider = class {
29377
29415
  );
29378
29416
  resetStdinForChild();
29379
29417
  await new Promise((resolve7, reject) => {
29380
- const proc = (0, import_child_process25.spawn)(
29418
+ const proc = (0, import_child_process26.spawn)(
29381
29419
  "gh",
29382
29420
  ["auth", "refresh", "-h", "github.com", "-s", "repo,read:org"],
29383
29421
  { stdio: "inherit" }
@@ -29555,7 +29593,7 @@ var GitHubCodespacesProvider = class {
29555
29593
  async streamCommand(workspaceId, command2) {
29556
29594
  resetStdinForChild();
29557
29595
  return new Promise((resolve7, reject) => {
29558
- const proc = (0, import_child_process25.spawn)(
29596
+ const proc = (0, import_child_process26.spawn)(
29559
29597
  "gh",
29560
29598
  ["codespace", "ssh", "-c", workspaceId, "--", "-tt", command2],
29561
29599
  { stdio: "inherit" }
@@ -29582,11 +29620,11 @@ var GitHubCodespacesProvider = class {
29582
29620
  `mkdir -p ${shellQuote(remoteDir)} && tar -xzf - -C ${shellQuote(remoteDir)}`
29583
29621
  ];
29584
29622
  await new Promise((resolve7, reject) => {
29585
- const tar = (0, import_child_process25.spawn)("tar", tarArgs, {
29623
+ const tar = (0, import_child_process26.spawn)("tar", tarArgs, {
29586
29624
  stdio: ["ignore", "pipe", "pipe"],
29587
29625
  env: tarEnv
29588
29626
  });
29589
- const ssh = (0, import_child_process25.spawn)("gh", sshArgs, {
29627
+ const ssh = (0, import_child_process26.spawn)("gh", sshArgs, {
29590
29628
  stdio: [tar.stdout, "pipe", "pipe"]
29591
29629
  });
29592
29630
  let tarErr = "";
@@ -29620,7 +29658,7 @@ var GitHubCodespacesProvider = class {
29620
29658
  }
29621
29659
  const cmd = parts.join(" && ");
29622
29660
  await new Promise((resolve7, reject) => {
29623
- const proc = (0, import_child_process25.spawn)(
29661
+ const proc = (0, import_child_process26.spawn)(
29624
29662
  "gh",
29625
29663
  ["codespace", "ssh", "-c", workspaceId, "--", cmd],
29626
29664
  { stdio: ["pipe", "pipe", "pipe"] }
@@ -29678,11 +29716,11 @@ function shellQuote(s) {
29678
29716
  }
29679
29717
 
29680
29718
  // src/services/providers/gitpod.ts
29681
- var import_child_process26 = require("child_process");
29719
+ var import_child_process27 = require("child_process");
29682
29720
  var import_util5 = require("util");
29683
29721
  var path59 = __toESM(require("path"));
29684
29722
  var import_picocolors10 = __toESM(require("picocolors"));
29685
- var execFileP7 = (0, import_util5.promisify)(import_child_process26.execFile);
29723
+ var execFileP7 = (0, import_util5.promisify)(import_child_process27.execFile);
29686
29724
  var MAX_BUFFER2 = 8 * 1024 * 1024;
29687
29725
  function resetStdinForChild2() {
29688
29726
  if (process.stdin.isTTY) {
@@ -29722,7 +29760,7 @@ var GitpodProvider = class {
29722
29760
  );
29723
29761
  resetStdinForChild2();
29724
29762
  await new Promise((resolve7, reject) => {
29725
- const proc = (0, import_child_process26.spawn)("gitpod", ["login"], { stdio: "inherit" });
29763
+ const proc = (0, import_child_process27.spawn)("gitpod", ["login"], { stdio: "inherit" });
29726
29764
  proc.on("exit", (code) => {
29727
29765
  if (code === 0) resolve7();
29728
29766
  else reject(new Error("gitpod login failed."));
@@ -29874,7 +29912,7 @@ var GitpodProvider = class {
29874
29912
  async streamCommand(workspaceId, command2) {
29875
29913
  resetStdinForChild2();
29876
29914
  return new Promise((resolve7, reject) => {
29877
- const proc = (0, import_child_process26.spawn)(
29915
+ const proc = (0, import_child_process27.spawn)(
29878
29916
  "gitpod",
29879
29917
  ["workspace", "ssh", workspaceId, "--", "-tt", command2],
29880
29918
  { stdio: "inherit" }
@@ -29894,11 +29932,11 @@ var GitpodProvider = class {
29894
29932
  const tarEnv = { ...process.env, COPYFILE_DISABLE: "1" };
29895
29933
  const remoteCmd = `mkdir -p ${shellQuote2(remoteDir)} && tar -xzf - -C ${shellQuote2(remoteDir)}`;
29896
29934
  await new Promise((resolve7, reject) => {
29897
- const tar = (0, import_child_process26.spawn)("tar", tarArgs, {
29935
+ const tar = (0, import_child_process27.spawn)("tar", tarArgs, {
29898
29936
  stdio: ["ignore", "pipe", "pipe"],
29899
29937
  env: tarEnv
29900
29938
  });
29901
- const ssh = (0, import_child_process26.spawn)(
29939
+ const ssh = (0, import_child_process27.spawn)(
29902
29940
  "gitpod",
29903
29941
  ["workspace", "ssh", workspaceId, "--", remoteCmd],
29904
29942
  { stdio: [tar.stdout, "pipe", "pipe"] }
@@ -29930,7 +29968,7 @@ var GitpodProvider = class {
29930
29968
  }
29931
29969
  const cmd = parts.join(" && ");
29932
29970
  await new Promise((resolve7, reject) => {
29933
- const proc = (0, import_child_process26.spawn)(
29971
+ const proc = (0, import_child_process27.spawn)(
29934
29972
  "gitpod",
29935
29973
  ["workspace", "ssh", workspaceId, "--", cmd],
29936
29974
  { stdio: ["pipe", "pipe", "pipe"] }
@@ -29954,10 +29992,10 @@ function shellQuote2(s) {
29954
29992
  }
29955
29993
 
29956
29994
  // src/services/providers/gitlab-workspaces.ts
29957
- var import_child_process27 = require("child_process");
29995
+ var import_child_process28 = require("child_process");
29958
29996
  var import_util6 = require("util");
29959
29997
  var path60 = __toESM(require("path"));
29960
- var execFileP8 = (0, import_util6.promisify)(import_child_process27.execFile);
29998
+ var execFileP8 = (0, import_util6.promisify)(import_child_process28.execFile);
29961
29999
  var MAX_BUFFER3 = 8 * 1024 * 1024;
29962
30000
  var GITLAB_API_BASE = process.env.CODEAM_GITLAB_API_URL ?? "https://gitlab.com/api/v4";
29963
30001
  function resetStdinForChild3() {
@@ -29999,7 +30037,7 @@ var GitLabWorkspacesProvider = class {
29999
30037
  );
30000
30038
  resetStdinForChild3();
30001
30039
  await new Promise((resolve7, reject) => {
30002
- const proc = (0, import_child_process27.spawn)(
30040
+ const proc = (0, import_child_process28.spawn)(
30003
30041
  "glab",
30004
30042
  ["auth", "login", "--scopes", "api,read_user,read_repository"],
30005
30043
  { stdio: "inherit" }
@@ -30171,7 +30209,7 @@ Docs: https://docs.gitlab.com/ee/user/workspace/configuration.html`
30171
30209
  const sshHost = process.env.CODEAM_GITLAB_SSH_HOST ?? "workspaces.gitlab.com";
30172
30210
  resetStdinForChild3();
30173
30211
  return new Promise((resolve7, reject) => {
30174
- const proc = (0, import_child_process27.spawn)(
30212
+ const proc = (0, import_child_process28.spawn)(
30175
30213
  "ssh",
30176
30214
  ["-tt", "-o", "StrictHostKeyChecking=accept-new", `${workspaceId}@${sshHost}`, command2],
30177
30215
  { stdio: "inherit" }
@@ -30192,8 +30230,8 @@ Docs: https://docs.gitlab.com/ee/user/workspace/configuration.html`
30192
30230
  const tarEnv = { ...process.env, COPYFILE_DISABLE: "1" };
30193
30231
  const remoteCmd = `mkdir -p ${shellQuote3(remoteDir)} && tar -xzf - -C ${shellQuote3(remoteDir)}`;
30194
30232
  await new Promise((resolve7, reject) => {
30195
- const tar = (0, import_child_process27.spawn)("tar", tarArgs, { stdio: ["ignore", "pipe", "pipe"], env: tarEnv });
30196
- const ssh = (0, import_child_process27.spawn)(
30233
+ const tar = (0, import_child_process28.spawn)("tar", tarArgs, { stdio: ["ignore", "pipe", "pipe"], env: tarEnv });
30234
+ const ssh = (0, import_child_process28.spawn)(
30197
30235
  "ssh",
30198
30236
  ["-o", "StrictHostKeyChecking=accept-new", `${workspaceId}@${sshHost}`, remoteCmd],
30199
30237
  { stdio: [tar.stdout, "pipe", "pipe"] }
@@ -30223,7 +30261,7 @@ Docs: https://docs.gitlab.com/ee/user/workspace/configuration.html`
30223
30261
  }
30224
30262
  const cmd = parts.join(" && ");
30225
30263
  await new Promise((resolve7, reject) => {
30226
- const proc = (0, import_child_process27.spawn)(
30264
+ const proc = (0, import_child_process28.spawn)(
30227
30265
  "ssh",
30228
30266
  ["-o", "StrictHostKeyChecking=accept-new", `${workspaceId}@${sshHost}`, cmd],
30229
30267
  { stdio: ["pipe", "pipe", "pipe"] }
@@ -30282,10 +30320,10 @@ function shellQuote3(s) {
30282
30320
  }
30283
30321
 
30284
30322
  // src/services/providers/railway.ts
30285
- var import_child_process28 = require("child_process");
30323
+ var import_child_process29 = require("child_process");
30286
30324
  var import_util7 = require("util");
30287
30325
  var path61 = __toESM(require("path"));
30288
- var execFileP9 = (0, import_util7.promisify)(import_child_process28.execFile);
30326
+ var execFileP9 = (0, import_util7.promisify)(import_child_process29.execFile);
30289
30327
  var MAX_BUFFER4 = 8 * 1024 * 1024;
30290
30328
  function resetStdinForChild4() {
30291
30329
  if (process.stdin.isTTY) {
@@ -30326,7 +30364,7 @@ var RailwayProvider = class {
30326
30364
  );
30327
30365
  resetStdinForChild4();
30328
30366
  await new Promise((resolve7, reject) => {
30329
- const proc = (0, import_child_process28.spawn)("railway", ["login"], { stdio: "inherit" });
30367
+ const proc = (0, import_child_process29.spawn)("railway", ["login"], { stdio: "inherit" });
30330
30368
  proc.on("exit", (code) => {
30331
30369
  if (code === 0) resolve7();
30332
30370
  else reject(new Error("railway login failed."));
@@ -30469,7 +30507,7 @@ var RailwayProvider = class {
30469
30507
  }
30470
30508
  resetStdinForChild4();
30471
30509
  return new Promise((resolve7, reject) => {
30472
- const proc = (0, import_child_process28.spawn)(
30510
+ const proc = (0, import_child_process29.spawn)(
30473
30511
  "railway",
30474
30512
  ["shell", "--project", projectId, "--service", serviceId, "--command", command2],
30475
30513
  { stdio: "inherit" }
@@ -30493,8 +30531,8 @@ var RailwayProvider = class {
30493
30531
  const tarEnv = { ...process.env, COPYFILE_DISABLE: "1" };
30494
30532
  const remoteCmd = `mkdir -p ${shellQuote4(remoteDir)} && tar -xzf - -C ${shellQuote4(remoteDir)}`;
30495
30533
  await new Promise((resolve7, reject) => {
30496
- const tar = (0, import_child_process28.spawn)("tar", tarArgs, { stdio: ["ignore", "pipe", "pipe"], env: tarEnv });
30497
- const sh = (0, import_child_process28.spawn)(
30534
+ const tar = (0, import_child_process29.spawn)("tar", tarArgs, { stdio: ["ignore", "pipe", "pipe"], env: tarEnv });
30535
+ const sh = (0, import_child_process29.spawn)(
30498
30536
  "railway",
30499
30537
  ["shell", "--project", projectId, "--service", serviceId, "--command", remoteCmd],
30500
30538
  { stdio: [tar.stdout, "pipe", "pipe"] }
@@ -30527,7 +30565,7 @@ var RailwayProvider = class {
30527
30565
  }
30528
30566
  const cmd = parts.join(" && ");
30529
30567
  await new Promise((resolve7, reject) => {
30530
- const proc = (0, import_child_process28.spawn)(
30568
+ const proc = (0, import_child_process29.spawn)(
30531
30569
  "railway",
30532
30570
  ["shell", "--project", projectId, "--service", serviceId, "--command", cmd],
30533
30571
  { stdio: ["pipe", "pipe", "pipe"] }
@@ -31335,7 +31373,7 @@ function checkChokidar() {
31335
31373
  }
31336
31374
  async function doctor(args2 = []) {
31337
31375
  const json = args2.includes("--json");
31338
- const cliVersion = true ? "2.52.7" : "0.0.0-dev";
31376
+ const cliVersion = true ? "2.52.8" : "0.0.0-dev";
31339
31377
  const apiBase2 = resolveApiBaseUrl();
31340
31378
  const diagnosticId = (0, import_node_crypto8.randomUUID)();
31341
31379
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -31534,7 +31572,7 @@ async function completion(args2) {
31534
31572
  // src/commands/version.ts
31535
31573
  var import_picocolors15 = __toESM(require("picocolors"));
31536
31574
  function version2() {
31537
- const v = true ? "2.52.7" : "unknown";
31575
+ const v = true ? "2.52.8" : "unknown";
31538
31576
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
31539
31577
  }
31540
31578
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.52.7",
3
+ "version": "2.52.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",