codeam-cli 2.43.6 → 2.44.0

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,18 @@ 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.43.7] — 2026-06-25
8
+
9
+ ### Fixed
10
+
11
+ - **cli:** Surface ACP agent startup failures in-app instead of stuck loading/offline
12
+
13
+ ## [2.43.6] — 2026-06-25
14
+
15
+ ### Fixed
16
+
17
+ - **cli:** ACP newSession no longer hangs forever on a fatal startup error
18
+
7
19
  ## [2.43.5] — 2026-06-25
8
20
 
9
21
  ### Added
package/README.md CHANGED
@@ -55,6 +55,7 @@ That's it. Open the [CodeAgent Mobile app](https://codeagent-mobile.com), enter
55
55
  | `codeam sessions switch` | Choose which paired session the next `codeam` invocation will use |
56
56
  | `codeam sessions delete <session-id>` | Forget a specific paired session (leaves the others intact) |
57
57
  | `codeam status` | Show connection status |
58
+ | `codeam invite` | Print your referral link — share it to earn PRO for you and the devs you bring |
58
59
  | `codeam doctor` | run environment, install, and pairing diagnostics (`--json` for machine-readable output) |
59
60
  | `codeam logout` | Remove all paired sessions |
60
61
  | `codeam deploy` | Provision a cloud workspace (GitHub Codespaces) and pair it to your phone |
@@ -68,6 +69,20 @@ That's it. Open the [CodeAgent Mobile app](https://codeagent-mobile.com), enter
68
69
 
69
70
  ---
70
71
 
72
+ ## `codeam invite` — share your referral link
73
+
74
+ Once you're paired, run:
75
+
76
+ ```bash
77
+ codeam invite
78
+ ```
79
+
80
+ The CLI fetches your personal referral link from the backend and prints it. Share it with teammates: every developer who signs up through your link and pairs their first session earns **both of you 14 days of PRO** — at no extra cost.
81
+
82
+ > Requires an active paired session (`codeam pair` first).
83
+
84
+ ---
85
+
71
86
  ## `codeam deploy` — drive a cloud workspace from your phone
72
87
 
73
88
  Don't want to keep your laptop running while you control Claude from the train? `codeam deploy` spins up a fresh **GitHub Codespace** for any of your repos, installs Claude Code + `codeam-cli` inside it, copies your local Claude credentials so you skip the re-auth (or runs `claude login` interactively if you don't have a local config yet), supervises the agent with **PM2** so the session survives even after you close your laptop, and gives you a QR/code to pair your phone — straight from your local terminal.
package/dist/index.js CHANGED
@@ -5397,7 +5397,7 @@ function readAnonId() {
5397
5397
  }
5398
5398
  function superProperties() {
5399
5399
  return {
5400
- cliVersion: true ? "2.43.6" : "0.0.0-dev",
5400
+ cliVersion: true ? "2.44.0" : "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.43.6",
5581
+ version: "2.44.0",
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",
@@ -17899,7 +17899,7 @@ async function autoUpgradeBeforeCriticalCommand() {
17899
17899
  if (process.env.NODE_ENV === "test") return;
17900
17900
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
17901
17901
  if (process.env.CI) return;
17902
- const current = true ? "2.43.6" : null;
17902
+ const current = true ? "2.44.0" : null;
17903
17903
  if (!current) return;
17904
17904
  const cache = readCache();
17905
17905
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -17916,7 +17916,7 @@ function checkForUpdates() {
17916
17916
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
17917
17917
  if (process.env.CI) return;
17918
17918
  if (!process.stdout.isTTY) return;
17919
- const current = true ? "2.43.6" : null;
17919
+ const current = true ? "2.44.0" : null;
17920
17920
  if (!current) return;
17921
17921
  const cache = readCache();
17922
17922
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -18354,7 +18354,7 @@ var defaultSpawner = (env, cwd, args2 = []) => (0, import_node_child_process14.s
18354
18354
  detached: false
18355
18355
  });
18356
18356
  function currentCliVersion() {
18357
- return true ? "2.43.6" : null;
18357
+ return true ? "2.44.0" : null;
18358
18358
  }
18359
18359
  function runCmd(cmd, args2, timeoutMs) {
18360
18360
  return new Promise((resolve7) => {
@@ -24994,6 +24994,61 @@ The agent provider returned an overload/outage error, so this turn couldn\u2019t
24994
24994
 
24995
24995
  Follow the status here: [${info.url}](${info.url})` : "");
24996
24996
  }
24997
+ function isGeminiIneligibleTier(haystack) {
24998
+ return /IneligibleTierError|UNSUPPORTED_CLIENT|no longer supported for Gemini Code Assist|not eligible for Gemini Code Assist/i.test(
24999
+ haystack
25000
+ );
25001
+ }
25002
+ function startupFailureMessage(agent, detail, recentStderr) {
25003
+ const haystack = `${detail}
25004
+ ${recentStderr}`;
25005
+ if (agent === "gemini" && isGeminiIneligibleTier(haystack)) {
25006
+ return [
25007
+ "\u26A0\uFE0F **Gemini couldn't start \u2014 your Google account isn't eligible.**",
25008
+ "",
25009
+ "Google discontinued free **\u201CLogin with Google\u201D** access to the Gemini CLI on 2026-06-18. The free / individual tier (and Google AI Pro/Ultra) can no longer authenticate here.",
25010
+ "",
25011
+ "To use Gemini from CodeAgent, re-link it in **Profile \u203A Agents** with either:",
25012
+ "\u2022 a **Gemini API key** (AI Studio \u2014 free quota available), or",
25013
+ "\u2022 a paid **Gemini Code Assist (Standard/Enterprise)** subscription."
25014
+ ].join("\n");
25015
+ }
25016
+ if (looksLikeAuthFailure(haystack)) return AUTH_FAILURE_MESSAGE;
25017
+ if (looksLikeProviderOutage(haystack)) return providerOutageMessage(agent);
25018
+ const tail = recentStderr.split("\n").filter(Boolean).slice(-3).join("\n");
25019
+ return [
25020
+ `\u26A0\uFE0F The ${agent} agent failed to start.`,
25021
+ "",
25022
+ tail ? `Details:
25023
+ ${tail}` : detail
25024
+ ].join("\n");
25025
+ }
25026
+ async function surfaceStartupFailure(opts) {
25027
+ const msg = startupFailureMessage(opts.agent, opts.detail, opts.recentStderr);
25028
+ const publish = async () => {
25029
+ try {
25030
+ await opts.publisher.publishOutput({ type: "new_turn", done: false });
25031
+ await opts.publisher.publishOutput({ type: "text", content: msg, done: true });
25032
+ } catch {
25033
+ }
25034
+ };
25035
+ await publish();
25036
+ const errRelay = new CommandRelayService(
25037
+ opts.pluginId,
25038
+ async (cmd) => {
25039
+ if (cmd.type === "get_conversation") {
25040
+ await errRelay.sendResult(cmd.id, "completed", {}).catch(() => void 0);
25041
+ return;
25042
+ }
25043
+ await publish();
25044
+ await errRelay.sendResult(cmd.id, "failed", {
25045
+ error: `${opts.agent} is unavailable \u2014 see the message in chat.`
25046
+ }).catch(() => void 0);
25047
+ },
25048
+ { id: opts.agent, name: opts.agent, displayName: opts.agent }
25049
+ );
25050
+ errRelay.start();
25051
+ }
24997
25052
  function failureBubble(opts) {
24998
25053
  if (looksLikeAuthFailure(opts.detail) || looksLikeAuthFailure(opts.recentStderr)) {
24999
25054
  return AUTH_FAILURE_MESSAGE;
@@ -25194,12 +25249,27 @@ async function runAcpSession(opts) {
25194
25249
  log: (msg) => log.info("acpRunner", msg)
25195
25250
  });
25196
25251
  showInfo(`Starting ${opts.agent} via ACP adapter (${opts.adapter.requiresAgentBinary})\u2026`);
25252
+ let handshake;
25253
+ try {
25254
+ handshake = await client2.start();
25255
+ } catch (startErr) {
25256
+ const detail = describeError(startErr);
25257
+ log.warn("acpRunner", `ACP start failed for ${opts.agent}: ${detail}`);
25258
+ await surfaceStartupFailure({
25259
+ agent: opts.agent,
25260
+ pluginId: opts.pluginId,
25261
+ detail,
25262
+ recentStderr: recentStderr.join("\n"),
25263
+ publisher
25264
+ });
25265
+ return;
25266
+ }
25197
25267
  const {
25198
25268
  sessionId: acpSessionId,
25199
25269
  initialize,
25200
25270
  model: handshakeModel,
25201
25271
  tier: handshakeTier
25202
- } = await client2.start();
25272
+ } = handshake;
25203
25273
  log.trace(
25204
25274
  "acpRunner",
25205
25275
  `adapter handshake ok protocolVersion=${initialize.protocolVersion} sessionId=${acpSessionId.slice(0, 8)}`
@@ -29378,13 +29448,71 @@ async function host(args2) {
29378
29448
  );
29379
29449
  }
29380
29450
 
29451
+ // src/commands/invite.ts
29452
+ var import_picocolors13 = __toESM(require("picocolors"));
29453
+ var API_BASE12 = resolveApiBaseUrl();
29454
+ async function invite() {
29455
+ showIntro();
29456
+ const cfg = loadCliConfig();
29457
+ const session = cfg.sessions.find((s) => s.id === cfg.activeSessionId) ?? null;
29458
+ const pluginAuthToken = session?.pluginAuthToken;
29459
+ const sessionId = session?.id;
29460
+ const pluginId = session?.pluginId ?? cfg.pluginId;
29461
+ if (!pluginAuthToken || !sessionId || !pluginId) {
29462
+ console.log(
29463
+ import_picocolors13.default.yellow(" Not paired yet.") + import_picocolors13.default.dim(" Run ") + import_picocolors13.default.cyan("codeam pair") + import_picocolors13.default.dim(" first, then retry.")
29464
+ );
29465
+ console.log("");
29466
+ return;
29467
+ }
29468
+ try {
29469
+ const result = await _transport.postJsonAuthed(
29470
+ `${API_BASE12}/api/referrals/code`,
29471
+ { sessionId, pluginId },
29472
+ pluginAuthToken
29473
+ );
29474
+ const data = result?.data;
29475
+ if (!data?.link) {
29476
+ console.log(
29477
+ import_picocolors13.default.red(" Unexpected response from server. Try ") + import_picocolors13.default.cyan("codeam pair") + import_picocolors13.default.red(" then retry.")
29478
+ );
29479
+ console.log("");
29480
+ return;
29481
+ }
29482
+ console.log(import_picocolors13.default.bold(" Invite your crew \u2014 unlock PRO for you and them\n"));
29483
+ console.log(` ${import_picocolors13.default.bold(import_picocolors13.default.cyan(data.link))}`);
29484
+ console.log("");
29485
+ console.log(
29486
+ import_picocolors13.default.dim(
29487
+ " Share this link. Every dev who signs up and pairs a session earns you both 14 days of PRO."
29488
+ )
29489
+ );
29490
+ console.log("");
29491
+ } catch (err) {
29492
+ const e = err;
29493
+ const code = typeof e.statusCode === "number" ? e.statusCode : null;
29494
+ if (code !== null) {
29495
+ console.log(
29496
+ import_picocolors13.default.red(
29497
+ ` Couldn't fetch your invite link (HTTP ${code}). Try \`codeam pair\` then retry.`
29498
+ )
29499
+ );
29500
+ } else {
29501
+ console.log(
29502
+ import_picocolors13.default.red(" Couldn't reach the server. Check your connection and try again.")
29503
+ );
29504
+ }
29505
+ console.log("");
29506
+ }
29507
+ }
29508
+
29381
29509
  // src/commands/doctor.ts
29382
29510
  var import_node_dns = require("dns");
29383
29511
  var import_node_util5 = require("util");
29384
29512
  var import_node_crypto8 = require("crypto");
29385
29513
  var fs48 = __toESM(require("fs"));
29386
29514
  var path59 = __toESM(require("path"));
29387
- var import_picocolors13 = __toESM(require("picocolors"));
29515
+ var import_picocolors14 = __toESM(require("picocolors"));
29388
29516
  var dnsResolveP = (0, import_node_util5.promisify)(import_node_dns.resolve);
29389
29517
  async function checkDns(apiBase2) {
29390
29518
  const host2 = (() => {
@@ -29551,7 +29679,7 @@ function checkChokidar() {
29551
29679
  }
29552
29680
  async function doctor(args2 = []) {
29553
29681
  const json = args2.includes("--json");
29554
- const cliVersion = true ? "2.43.6" : "0.0.0-dev";
29682
+ const cliVersion = true ? "2.44.0" : "0.0.0-dev";
29555
29683
  const apiBase2 = resolveApiBaseUrl();
29556
29684
  const diagnosticId = (0, import_node_crypto8.randomUUID)();
29557
29685
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -29591,46 +29719,46 @@ async function doctor(args2 = []) {
29591
29719
  function printHumanReport(r) {
29592
29720
  const out2 = process.stderr;
29593
29721
  out2.write(`
29594
- ${import_picocolors13.default.bold(" codeam doctor")}
29722
+ ${import_picocolors14.default.bold(" codeam doctor")}
29595
29723
 
29596
29724
  `);
29597
- out2.write(` ${import_picocolors13.default.dim("cli")} ${r.cliVersion}
29725
+ out2.write(` ${import_picocolors14.default.dim("cli")} ${r.cliVersion}
29598
29726
  `);
29599
- out2.write(` ${import_picocolors13.default.dim("node")} ${r.node}
29727
+ out2.write(` ${import_picocolors14.default.dim("node")} ${r.node}
29600
29728
  `);
29601
- out2.write(` ${import_picocolors13.default.dim("os")} ${r.platform} ${r.arch}
29729
+ out2.write(` ${import_picocolors14.default.dim("os")} ${r.platform} ${r.arch}
29602
29730
  `);
29603
- out2.write(` ${import_picocolors13.default.dim("api")} ${r.apiBase}
29731
+ out2.write(` ${import_picocolors14.default.dim("api")} ${r.apiBase}
29604
29732
  `);
29605
29733
  if (process.env.CODEAM_TEST_MODE === "1" || process.env.CODEAM_TEST_MODE?.toLowerCase() === "true") {
29606
- out2.write(` ${import_picocolors13.default.dim("mode")} ${import_picocolors13.default.yellow("TEST_MODE \u2014 using dev preview")}
29734
+ out2.write(` ${import_picocolors14.default.dim("mode")} ${import_picocolors14.default.yellow("TEST_MODE \u2014 using dev preview")}
29607
29735
  `);
29608
29736
  } else if (process.env.CODEAM_API_URL) {
29609
- out2.write(` ${import_picocolors13.default.dim("mode")} ${import_picocolors13.default.yellow("CODEAM_API_URL override")}
29737
+ out2.write(` ${import_picocolors14.default.dim("mode")} ${import_picocolors14.default.yellow("CODEAM_API_URL override")}
29610
29738
  `);
29611
29739
  }
29612
- out2.write(` ${import_picocolors13.default.dim("diag id")} ${r.diagnosticId}
29740
+ out2.write(` ${import_picocolors14.default.dim("diag id")} ${r.diagnosticId}
29613
29741
  `);
29614
29742
  out2.write("\n");
29615
29743
  for (const c2 of r.checks) {
29616
- const mark = c2.ok ? import_picocolors13.default.green("\u2713") : c2.optional ? import_picocolors13.default.yellow("!") : import_picocolors13.default.red("\u2717");
29617
- out2.write(` ${mark} ${c2.label}${import_picocolors13.default.dim(` \u2014 ${c2.detail}`)}
29744
+ const mark = c2.ok ? import_picocolors14.default.green("\u2713") : c2.optional ? import_picocolors14.default.yellow("!") : import_picocolors14.default.red("\u2717");
29745
+ out2.write(` ${mark} ${c2.label}${import_picocolors14.default.dim(` \u2014 ${c2.detail}`)}
29618
29746
  `);
29619
29747
  if (!c2.ok && c2.hint) {
29620
29748
  for (const line of c2.hint.split("\n")) {
29621
- out2.write(` ${import_picocolors13.default.dim(line)}
29749
+ out2.write(` ${import_picocolors14.default.dim(line)}
29622
29750
  `);
29623
29751
  }
29624
29752
  }
29625
29753
  }
29626
29754
  out2.write("\n");
29627
29755
  if (r.ok) {
29628
- out2.write(` ${import_picocolors13.default.green("All checks passed.")}
29756
+ out2.write(` ${import_picocolors14.default.green("All checks passed.")}
29629
29757
 
29630
29758
  `);
29631
29759
  } else {
29632
29760
  out2.write(
29633
- ` ${import_picocolors13.default.red("Some checks failed.")} ${import_picocolors13.default.dim("Paste the diagnostic id above when opening a bug report.")}
29761
+ ` ${import_picocolors14.default.red("Some checks failed.")} ${import_picocolors14.default.dim("Paste the diagnostic id above when opening a bug report.")}
29634
29762
 
29635
29763
  `
29636
29764
  );
@@ -29748,118 +29876,123 @@ async function completion(args2) {
29748
29876
  }
29749
29877
 
29750
29878
  // src/commands/version.ts
29751
- var import_picocolors14 = __toESM(require("picocolors"));
29879
+ var import_picocolors15 = __toESM(require("picocolors"));
29752
29880
  function version2() {
29753
- const v = true ? "2.43.6" : "unknown";
29754
- console.log(`${import_picocolors14.default.bold("codeam-cli")} ${import_picocolors14.default.cyan(v)}`);
29881
+ const v = true ? "2.44.0" : "unknown";
29882
+ console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
29755
29883
  }
29756
29884
 
29757
29885
  // src/commands/help.ts
29758
- var import_picocolors15 = __toESM(require("picocolors"));
29886
+ var import_picocolors16 = __toESM(require("picocolors"));
29759
29887
  function help() {
29760
29888
  const lines = [
29761
29889
  "",
29762
- ` ${import_picocolors15.default.bold(import_picocolors15.default.magenta("codeam-cli"))} ${import_picocolors15.default.dim("\u2014 remote-control AI coding agents from your phone")}`,
29890
+ ` ${import_picocolors16.default.bold(import_picocolors16.default.magenta("codeam-cli"))} ${import_picocolors16.default.dim("\u2014 remote-control AI coding agents from your phone")}`,
29763
29891
  "",
29764
- ` ${import_picocolors15.default.bold("Usage")}`,
29765
- ` ${import_picocolors15.default.cyan("codeam")} ${import_picocolors15.default.dim("[command]")}`,
29892
+ ` ${import_picocolors16.default.bold("Usage")}`,
29893
+ ` ${import_picocolors16.default.cyan("codeam")} ${import_picocolors16.default.dim("[command]")}`,
29766
29894
  "",
29767
- ` ${import_picocolors15.default.bold("Commands")}`,
29768
- ` ${import_picocolors15.default.white("codeam")} ${import_picocolors15.default.dim("start the active agent with mobile control")}`,
29769
- ` ${import_picocolors15.default.white("codeam <agent>")} ${import_picocolors15.default.dim("start a specific agent \u2014 e.g. claude, codex")}`,
29770
- ` ${import_picocolors15.default.white("codeam pair")} ${import_picocolors15.default.dim("pair a new mobile device (interactive)")}`,
29771
- ` ${import_picocolors15.default.white("codeam pair --agent <id>")} ${import_picocolors15.default.dim("pair non-interactively for a specific agent")}`,
29772
- ` ${import_picocolors15.default.white("codeam sessions")} ${import_picocolors15.default.dim("list paired devices")}`,
29773
- ` ${import_picocolors15.default.white("codeam sessions switch")} ${import_picocolors15.default.dim("switch the active paired session")}`,
29774
- ` ${import_picocolors15.default.white("codeam sessions delete <id>")} ${import_picocolors15.default.dim("remove a specific paired session")}`,
29775
- ` ${import_picocolors15.default.white("codeam status")} ${import_picocolors15.default.dim("show connection info")}`,
29776
- ` ${import_picocolors15.default.white("codeam logout")} ${import_picocolors15.default.dim("remove all paired sessions")}`,
29777
- ` ${import_picocolors15.default.white("codeam link <agent>")} ${import_picocolors15.default.dim("link an agent (claude, codex) to your CodeAgent account")}`,
29778
- ` ${import_picocolors15.default.white("codeam deploy")} ${import_picocolors15.default.dim("provision a cloud workspace (Codespaces) and pair it")}`,
29779
- ` ${import_picocolors15.default.white("codeam deploy ls | list")} ${import_picocolors15.default.dim("list deployed cloud workspaces")}`,
29780
- ` ${import_picocolors15.default.white("codeam deploy stop | remove")} ${import_picocolors15.default.dim("stop a deployed workspace session")}`,
29781
- ` ${import_picocolors15.default.white("codeam doctor")} ${import_picocolors15.default.dim("run diagnostic checks (DNS, /health, binaries, \u2026)")}`,
29782
- ` ${import_picocolors15.default.white("codeam completion <shell>")} ${import_picocolors15.default.dim("emit a bash/zsh/fish completion script")}`,
29895
+ ` ${import_picocolors16.default.bold("Commands")}`,
29896
+ ` ${import_picocolors16.default.white("codeam")} ${import_picocolors16.default.dim("start the active agent with mobile control")}`,
29897
+ ` ${import_picocolors16.default.white("codeam <agent>")} ${import_picocolors16.default.dim("start a specific agent \u2014 e.g. claude, codex")}`,
29898
+ ` ${import_picocolors16.default.white("codeam pair")} ${import_picocolors16.default.dim("pair a new mobile device (interactive)")}`,
29899
+ ` ${import_picocolors16.default.white("codeam pair --agent <id>")} ${import_picocolors16.default.dim("pair non-interactively for a specific agent")}`,
29900
+ ` ${import_picocolors16.default.white("codeam sessions")} ${import_picocolors16.default.dim("list paired devices")}`,
29901
+ ` ${import_picocolors16.default.white("codeam sessions switch")} ${import_picocolors16.default.dim("switch the active paired session")}`,
29902
+ ` ${import_picocolors16.default.white("codeam sessions delete <id>")} ${import_picocolors16.default.dim("remove a specific paired session")}`,
29903
+ ` ${import_picocolors16.default.white("codeam status")} ${import_picocolors16.default.dim("show connection info")}`,
29904
+ ` ${import_picocolors16.default.white("codeam logout")} ${import_picocolors16.default.dim("remove all paired sessions")}`,
29905
+ ` ${import_picocolors16.default.white("codeam link <agent>")} ${import_picocolors16.default.dim("link an agent (claude, codex) to your CodeAgent account")}`,
29906
+ ` ${import_picocolors16.default.white("codeam deploy")} ${import_picocolors16.default.dim("provision a cloud workspace (Codespaces) and pair it")}`,
29907
+ ` ${import_picocolors16.default.white("codeam deploy ls | list")} ${import_picocolors16.default.dim("list deployed cloud workspaces")}`,
29908
+ ` ${import_picocolors16.default.white("codeam deploy stop | remove")} ${import_picocolors16.default.dim("stop a deployed workspace session")}`,
29909
+ ` ${import_picocolors16.default.white("codeam doctor")} ${import_picocolors16.default.dim("run diagnostic checks (DNS, /health, binaries, \u2026)")}`,
29910
+ ` ${import_picocolors16.default.white("codeam completion <shell>")} ${import_picocolors16.default.dim("emit a bash/zsh/fish completion script")}`,
29783
29911
  "",
29784
- ` ${import_picocolors15.default.bold("Flags")}`,
29785
- ` ${import_picocolors15.default.white("-v, --version")} ${import_picocolors15.default.dim("print the CLI version")}`,
29786
- ` ${import_picocolors15.default.white("-h, --help")} ${import_picocolors15.default.dim("show this help")}`,
29912
+ ` ${import_picocolors16.default.bold("Flags")}`,
29913
+ ` ${import_picocolors16.default.white("-v, --version")} ${import_picocolors16.default.dim("print the CLI version")}`,
29914
+ ` ${import_picocolors16.default.white("-h, --help")} ${import_picocolors16.default.dim("show this help")}`,
29787
29915
  "",
29788
- ` ${import_picocolors15.default.bold("Links")}`,
29789
- ` ${import_picocolors15.default.dim("Docs:")} ${import_picocolors15.default.green("https://www.codeagent-mobile.com")}`,
29790
- ` ${import_picocolors15.default.dim("Issues:")} ${import_picocolors15.default.green("https://github.com/edgar-durand/codeagent-mobile-clients/issues")}`,
29916
+ ` ${import_picocolors16.default.bold("Links")}`,
29917
+ ` ${import_picocolors16.default.dim("Docs:")} ${import_picocolors16.default.green("https://www.codeagent-mobile.com")}`,
29918
+ ` ${import_picocolors16.default.dim("Issues:")} ${import_picocolors16.default.green("https://github.com/edgar-durand/codeagent-mobile-clients/issues")}`,
29791
29919
  ""
29792
29920
  ];
29793
29921
  process.stdout.write(lines.join("\n") + "\n");
29794
29922
  }
29795
29923
 
29796
29924
  // src/commands/subcommand-help.ts
29797
- var import_picocolors16 = __toESM(require("picocolors"));
29925
+ var import_picocolors17 = __toESM(require("picocolors"));
29798
29926
  var HELPS = {
29799
29927
  pair: () => print([
29800
- ` ${import_picocolors16.default.bold("codeam pair")} ${import_picocolors16.default.dim("\u2014 pair a mobile device with this CLI")}`,
29928
+ ` ${import_picocolors17.default.bold("codeam pair")} ${import_picocolors17.default.dim("\u2014 pair a mobile device with this CLI")}`,
29801
29929
  "",
29802
- ` ${import_picocolors16.default.cyan("codeam pair")} ${import_picocolors16.default.dim("interactive pairing (prompts for the agent)")}`,
29803
- ` ${import_picocolors16.default.cyan("codeam pair --agent <id>")} ${import_picocolors16.default.dim("pair non-interactively (agent: claude | codex)")}`,
29804
- ` ${import_picocolors16.default.cyan("codeam pair --dry-run")} ${import_picocolors16.default.dim("request a pairing code, validate the response, exit")}`
29930
+ ` ${import_picocolors17.default.cyan("codeam pair")} ${import_picocolors17.default.dim("interactive pairing (prompts for the agent)")}`,
29931
+ ` ${import_picocolors17.default.cyan("codeam pair --agent <id>")} ${import_picocolors17.default.dim("pair non-interactively (agent: claude | codex)")}`,
29932
+ ` ${import_picocolors17.default.cyan("codeam pair --dry-run")} ${import_picocolors17.default.dim("request a pairing code, validate the response, exit")}`
29805
29933
  ]),
29806
29934
  "pair-auto": () => print([
29807
- ` ${import_picocolors16.default.bold("codeam pair-auto")} ${import_picocolors16.default.dim("\u2014 non-interactive variant of pair for scripted setups")}`,
29935
+ ` ${import_picocolors17.default.bold("codeam pair-auto")} ${import_picocolors17.default.dim("\u2014 non-interactive variant of pair for scripted setups")}`,
29808
29936
  "",
29809
- ` ${import_picocolors16.default.cyan("codeam pair-auto --agent <id>")} ${import_picocolors16.default.dim("pair using the supplied agent id; exit on success or timeout")}`
29937
+ ` ${import_picocolors17.default.cyan("codeam pair-auto --agent <id>")} ${import_picocolors17.default.dim("pair using the supplied agent id; exit on success or timeout")}`
29810
29938
  ]),
29811
29939
  link: () => print([
29812
- ` ${import_picocolors16.default.bold("codeam link <agent>")} ${import_picocolors16.default.dim("\u2014 upload a local agent token (Claude or Codex) to your vault")}`,
29940
+ ` ${import_picocolors17.default.bold("codeam link <agent>")} ${import_picocolors17.default.dim("\u2014 upload a local agent token (Claude or Codex) to your vault")}`,
29813
29941
  "",
29814
- ` ${import_picocolors16.default.cyan("codeam link claude")}`,
29815
- ` ${import_picocolors16.default.cyan("codeam link codex")}`,
29942
+ ` ${import_picocolors17.default.cyan("codeam link claude")}`,
29943
+ ` ${import_picocolors17.default.cyan("codeam link codex")}`,
29816
29944
  "",
29817
- ` ${import_picocolors16.default.white("--api-key=<key>")} ${import_picocolors16.default.dim("paste an API key directly (visible in `ps -ef`)")}`,
29818
- ` ${import_picocolors16.default.white("--api-key-file=<path>")} ${import_picocolors16.default.dim("read API key from a file (recommended for CI / scripts)")}`,
29819
- ` ${import_picocolors16.default.white("--reuse-existing")} ${import_picocolors16.default.dim("upload existing creds without re-launching the agent login")}`,
29820
- ` ${import_picocolors16.default.white("--token-file=<path>")} ${import_picocolors16.default.dim("manual credential blob path for unusual vendor locations")}`,
29821
- ` ${import_picocolors16.default.white("--dry-run")} ${import_picocolors16.default.dim("probe the /api/plugin/agents/<agent>/link endpoint and exit")}`
29945
+ ` ${import_picocolors17.default.white("--api-key=<key>")} ${import_picocolors17.default.dim("paste an API key directly (visible in `ps -ef`)")}`,
29946
+ ` ${import_picocolors17.default.white("--api-key-file=<path>")} ${import_picocolors17.default.dim("read API key from a file (recommended for CI / scripts)")}`,
29947
+ ` ${import_picocolors17.default.white("--reuse-existing")} ${import_picocolors17.default.dim("upload existing creds without re-launching the agent login")}`,
29948
+ ` ${import_picocolors17.default.white("--token-file=<path>")} ${import_picocolors17.default.dim("manual credential blob path for unusual vendor locations")}`,
29949
+ ` ${import_picocolors17.default.white("--dry-run")} ${import_picocolors17.default.dim("probe the /api/plugin/agents/<agent>/link endpoint and exit")}`
29822
29950
  ]),
29823
29951
  sessions: () => print([
29824
- ` ${import_picocolors16.default.bold("codeam sessions")} ${import_picocolors16.default.dim("\u2014 list, switch, or delete paired mobile sessions")}`,
29952
+ ` ${import_picocolors17.default.bold("codeam sessions")} ${import_picocolors17.default.dim("\u2014 list, switch, or delete paired mobile sessions")}`,
29825
29953
  "",
29826
- ` ${import_picocolors16.default.cyan("codeam sessions")} ${import_picocolors16.default.dim("list all paired sessions on this machine")}`,
29827
- ` ${import_picocolors16.default.cyan("codeam sessions switch")} ${import_picocolors16.default.dim("interactively switch the active session")}`,
29828
- ` ${import_picocolors16.default.cyan("codeam sessions delete <id>")} ${import_picocolors16.default.dim("remove a specific paired session")}`
29954
+ ` ${import_picocolors17.default.cyan("codeam sessions")} ${import_picocolors17.default.dim("list all paired sessions on this machine")}`,
29955
+ ` ${import_picocolors17.default.cyan("codeam sessions switch")} ${import_picocolors17.default.dim("interactively switch the active session")}`,
29956
+ ` ${import_picocolors17.default.cyan("codeam sessions delete <id>")} ${import_picocolors17.default.dim("remove a specific paired session")}`
29829
29957
  ]),
29830
29958
  deploy: () => print([
29831
- ` ${import_picocolors16.default.bold("codeam deploy")} ${import_picocolors16.default.dim("\u2014 provision a cloud workspace (GitHub Codespaces) and pair it")}`,
29959
+ ` ${import_picocolors17.default.bold("codeam deploy")} ${import_picocolors17.default.dim("\u2014 provision a cloud workspace (GitHub Codespaces) and pair it")}`,
29960
+ "",
29961
+ ` ${import_picocolors17.default.cyan("codeam deploy")} ${import_picocolors17.default.dim("start a new deploy (prompts for repo + agent)")}`,
29962
+ ` ${import_picocolors17.default.cyan("codeam deploy ls | list")} ${import_picocolors17.default.dim("list deployed cloud workspaces")}`,
29963
+ ` ${import_picocolors17.default.cyan("codeam deploy stop | remove")} ${import_picocolors17.default.dim("pick a workspace and stop its codeam-pair session")}`
29964
+ ]),
29965
+ invite: () => print([
29966
+ ` ${import_picocolors17.default.bold("codeam invite")} ${import_picocolors17.default.dim("\u2014 print your referral link to earn PRO for you and your crew")}`,
29832
29967
  "",
29833
- ` ${import_picocolors16.default.cyan("codeam deploy")} ${import_picocolors16.default.dim("start a new deploy (prompts for repo + agent)")}`,
29834
- ` ${import_picocolors16.default.cyan("codeam deploy ls | list")} ${import_picocolors16.default.dim("list deployed cloud workspaces")}`,
29835
- ` ${import_picocolors16.default.cyan("codeam deploy stop | remove")} ${import_picocolors16.default.dim("pick a workspace and stop its codeam-pair session")}`
29968
+ ` ${import_picocolors17.default.cyan("codeam invite")} ${import_picocolors17.default.dim("fetch and display your personal referral link")}`
29836
29969
  ]),
29837
29970
  status: () => print([
29838
- ` ${import_picocolors16.default.bold("codeam status")} ${import_picocolors16.default.dim("\u2014 show the active session, agent, and connection info")}`
29971
+ ` ${import_picocolors17.default.bold("codeam status")} ${import_picocolors17.default.dim("\u2014 show the active session, agent, and connection info")}`
29839
29972
  ]),
29840
29973
  logout: () => print([
29841
- ` ${import_picocolors16.default.bold("codeam logout")} ${import_picocolors16.default.dim("\u2014 remove every paired session from this machine")}`
29974
+ ` ${import_picocolors17.default.bold("codeam logout")} ${import_picocolors17.default.dim("\u2014 remove every paired session from this machine")}`
29842
29975
  ]),
29843
29976
  doctor: () => print([
29844
- ` ${import_picocolors16.default.bold("codeam doctor")} ${import_picocolors16.default.dim("\u2014 run diagnostic checks for support triage")}`,
29977
+ ` ${import_picocolors17.default.bold("codeam doctor")} ${import_picocolors17.default.dim("\u2014 run diagnostic checks for support triage")}`,
29845
29978
  "",
29846
- ` ${import_picocolors16.default.cyan("codeam doctor")} ${import_picocolors16.default.dim("human-readable report")}`,
29847
- ` ${import_picocolors16.default.cyan("codeam doctor --json")} ${import_picocolors16.default.dim("machine-parseable report (single JSON document on stdout)")}`,
29979
+ ` ${import_picocolors17.default.cyan("codeam doctor")} ${import_picocolors17.default.dim("human-readable report")}`,
29980
+ ` ${import_picocolors17.default.cyan("codeam doctor --json")} ${import_picocolors17.default.dim("machine-parseable report (single JSON document on stdout)")}`,
29848
29981
  "",
29849
- ` ${import_picocolors16.default.dim("Output never includes tokens or credentials. Paste the diagnostic id")}`,
29850
- ` ${import_picocolors16.default.dim("into a bug report so support can grep the server-side logs.")}`
29982
+ ` ${import_picocolors17.default.dim("Output never includes tokens or credentials. Paste the diagnostic id")}`,
29983
+ ` ${import_picocolors17.default.dim("into a bug report so support can grep the server-side logs.")}`
29851
29984
  ]),
29852
29985
  completion: () => print([
29853
- ` ${import_picocolors16.default.bold("codeam completion <shell>")} ${import_picocolors16.default.dim("\u2014 emit a shell-completion script for sourcing")}`,
29986
+ ` ${import_picocolors17.default.bold("codeam completion <shell>")} ${import_picocolors17.default.dim("\u2014 emit a shell-completion script for sourcing")}`,
29854
29987
  "",
29855
- ` ${import_picocolors16.default.cyan("codeam completion bash")} ${import_picocolors16.default.dim("print a bash completion function")}`,
29856
- ` ${import_picocolors16.default.cyan("codeam completion zsh")} ${import_picocolors16.default.dim("print a zsh completion function")}`,
29857
- ` ${import_picocolors16.default.cyan("codeam completion fish")} ${import_picocolors16.default.dim("print a fish completion file")}`,
29988
+ ` ${import_picocolors17.default.cyan("codeam completion bash")} ${import_picocolors17.default.dim("print a bash completion function")}`,
29989
+ ` ${import_picocolors17.default.cyan("codeam completion zsh")} ${import_picocolors17.default.dim("print a zsh completion function")}`,
29990
+ ` ${import_picocolors17.default.cyan("codeam completion fish")} ${import_picocolors17.default.dim("print a fish completion file")}`,
29858
29991
  "",
29859
- ` ${import_picocolors16.default.dim("Examples:")}`,
29860
- ` ${import_picocolors16.default.dim(" bash: codeam completion bash >> ~/.bashrc")}`,
29861
- ` ${import_picocolors16.default.dim(" zsh: codeam completion zsh >> ~/.zshrc")}`,
29862
- ` ${import_picocolors16.default.dim(" fish: codeam completion fish > ~/.config/fish/completions/codeam.fish")}`
29992
+ ` ${import_picocolors17.default.dim("Examples:")}`,
29993
+ ` ${import_picocolors17.default.dim(" bash: codeam completion bash >> ~/.bashrc")}`,
29994
+ ` ${import_picocolors17.default.dim(" zsh: codeam completion zsh >> ~/.zshrc")}`,
29995
+ ` ${import_picocolors17.default.dim(" fish: codeam completion fish > ~/.config/fish/completions/codeam.fish")}`
29863
29996
  ])
29864
29997
  };
29865
29998
  function print(lines) {
@@ -29927,6 +30060,7 @@ async function main() {
29927
30060
  "host": () => host(args),
29928
30061
  "sessions": () => sessions2(args),
29929
30062
  "status": () => status(),
30063
+ "invite": () => invite(),
29930
30064
  "logout": () => logout(),
29931
30065
  "link": () => link(args),
29932
30066
  "doctor": () => doctor(args),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.43.6",
3
+ "version": "2.44.0",
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",