codeam-cli 2.43.7 → 2.45.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.44.0] — 2026-06-25
8
+
9
+ ### Added
10
+
11
+ - **cli:** Codeam invite — print referral link
12
+
13
+ ## [2.43.7] — 2026-06-25
14
+
15
+ ### Fixed
16
+
17
+ - **cli:** Surface ACP agent startup failures in-app instead of stuck loading/offline
18
+
7
19
  ## [2.43.6] — 2026-06-25
8
20
 
9
21
  ### Fixed
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.7" : "0.0.0-dev",
5400
+ cliVersion: true ? "2.45.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.7",
5581
+ version: "2.45.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",
@@ -17477,10 +17477,33 @@ var geminiProvisioner = {
17477
17477
  return {};
17478
17478
  }
17479
17479
  };
17480
+ var cursorProvisioner = {
17481
+ write(auth, _home) {
17482
+ if (auth.kind === "api_key") {
17483
+ return { CURSOR_API_KEY: auth.value };
17484
+ }
17485
+ const value = auth.value.trim();
17486
+ if (value.startsWith("{")) {
17487
+ let parsed;
17488
+ try {
17489
+ parsed = JSON.parse(value);
17490
+ } catch {
17491
+ throw new Error("cursor oauth_token: credential blob is not valid JSON");
17492
+ }
17493
+ if (typeof parsed !== "object" || parsed === null || typeof parsed["accessToken"] !== "string" || !parsed["accessToken"]) {
17494
+ throw new Error("cursor oauth_token: credential blob is missing a non-empty accessToken");
17495
+ }
17496
+ const accessToken = parsed["accessToken"];
17497
+ return { CURSOR_API_KEY: accessToken };
17498
+ }
17499
+ return { CURSOR_API_KEY: value };
17500
+ }
17501
+ };
17480
17502
  var PROVISIONERS = {
17481
17503
  claude: claudeProvisioner,
17482
17504
  codex: codexProvisioner,
17483
- gemini: geminiProvisioner
17505
+ gemini: geminiProvisioner,
17506
+ cursor: cursorProvisioner
17484
17507
  };
17485
17508
  var UnsupportedAgentError = class extends Error {
17486
17509
  agentId;
@@ -17899,7 +17922,7 @@ async function autoUpgradeBeforeCriticalCommand() {
17899
17922
  if (process.env.NODE_ENV === "test") return;
17900
17923
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
17901
17924
  if (process.env.CI) return;
17902
- const current = true ? "2.43.7" : null;
17925
+ const current = true ? "2.45.0" : null;
17903
17926
  if (!current) return;
17904
17927
  const cache = readCache();
17905
17928
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -17916,7 +17939,7 @@ function checkForUpdates() {
17916
17939
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
17917
17940
  if (process.env.CI) return;
17918
17941
  if (!process.stdout.isTTY) return;
17919
- const current = true ? "2.43.7" : null;
17942
+ const current = true ? "2.45.0" : null;
17920
17943
  if (!current) return;
17921
17944
  const cache = readCache();
17922
17945
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -18354,7 +18377,7 @@ var defaultSpawner = (env, cwd, args2 = []) => (0, import_node_child_process14.s
18354
18377
  detached: false
18355
18378
  });
18356
18379
  function currentCliVersion() {
18357
- return true ? "2.43.7" : null;
18380
+ return true ? "2.45.0" : null;
18358
18381
  }
18359
18382
  function runCmd(cmd, args2, timeoutMs) {
18360
18383
  return new Promise((resolve7) => {
@@ -29448,13 +29471,71 @@ async function host(args2) {
29448
29471
  );
29449
29472
  }
29450
29473
 
29474
+ // src/commands/invite.ts
29475
+ var import_picocolors13 = __toESM(require("picocolors"));
29476
+ var API_BASE12 = resolveApiBaseUrl();
29477
+ async function invite() {
29478
+ showIntro();
29479
+ const cfg = loadCliConfig();
29480
+ const session = cfg.sessions.find((s) => s.id === cfg.activeSessionId) ?? null;
29481
+ const pluginAuthToken = session?.pluginAuthToken;
29482
+ const sessionId = session?.id;
29483
+ const pluginId = session?.pluginId ?? cfg.pluginId;
29484
+ if (!pluginAuthToken || !sessionId || !pluginId) {
29485
+ console.log(
29486
+ 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.")
29487
+ );
29488
+ console.log("");
29489
+ return;
29490
+ }
29491
+ try {
29492
+ const result = await _transport.postJsonAuthed(
29493
+ `${API_BASE12}/api/referrals/code`,
29494
+ { sessionId, pluginId },
29495
+ pluginAuthToken
29496
+ );
29497
+ const data = result?.data;
29498
+ if (!data?.link) {
29499
+ console.log(
29500
+ import_picocolors13.default.red(" Unexpected response from server. Try ") + import_picocolors13.default.cyan("codeam pair") + import_picocolors13.default.red(" then retry.")
29501
+ );
29502
+ console.log("");
29503
+ return;
29504
+ }
29505
+ console.log(import_picocolors13.default.bold(" Invite your crew \u2014 unlock PRO for you and them\n"));
29506
+ console.log(` ${import_picocolors13.default.bold(import_picocolors13.default.cyan(data.link))}`);
29507
+ console.log("");
29508
+ console.log(
29509
+ import_picocolors13.default.dim(
29510
+ " Share this link. Every dev who signs up and pairs a session earns you both 14 days of PRO."
29511
+ )
29512
+ );
29513
+ console.log("");
29514
+ } catch (err) {
29515
+ const e = err;
29516
+ const code = typeof e.statusCode === "number" ? e.statusCode : null;
29517
+ if (code !== null) {
29518
+ console.log(
29519
+ import_picocolors13.default.red(
29520
+ ` Couldn't fetch your invite link (HTTP ${code}). Try \`codeam pair\` then retry.`
29521
+ )
29522
+ );
29523
+ } else {
29524
+ console.log(
29525
+ import_picocolors13.default.red(" Couldn't reach the server. Check your connection and try again.")
29526
+ );
29527
+ }
29528
+ console.log("");
29529
+ }
29530
+ }
29531
+
29451
29532
  // src/commands/doctor.ts
29452
29533
  var import_node_dns = require("dns");
29453
29534
  var import_node_util5 = require("util");
29454
29535
  var import_node_crypto8 = require("crypto");
29455
29536
  var fs48 = __toESM(require("fs"));
29456
29537
  var path59 = __toESM(require("path"));
29457
- var import_picocolors13 = __toESM(require("picocolors"));
29538
+ var import_picocolors14 = __toESM(require("picocolors"));
29458
29539
  var dnsResolveP = (0, import_node_util5.promisify)(import_node_dns.resolve);
29459
29540
  async function checkDns(apiBase2) {
29460
29541
  const host2 = (() => {
@@ -29621,7 +29702,7 @@ function checkChokidar() {
29621
29702
  }
29622
29703
  async function doctor(args2 = []) {
29623
29704
  const json = args2.includes("--json");
29624
- const cliVersion = true ? "2.43.7" : "0.0.0-dev";
29705
+ const cliVersion = true ? "2.45.0" : "0.0.0-dev";
29625
29706
  const apiBase2 = resolveApiBaseUrl();
29626
29707
  const diagnosticId = (0, import_node_crypto8.randomUUID)();
29627
29708
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -29661,46 +29742,46 @@ async function doctor(args2 = []) {
29661
29742
  function printHumanReport(r) {
29662
29743
  const out2 = process.stderr;
29663
29744
  out2.write(`
29664
- ${import_picocolors13.default.bold(" codeam doctor")}
29745
+ ${import_picocolors14.default.bold(" codeam doctor")}
29665
29746
 
29666
29747
  `);
29667
- out2.write(` ${import_picocolors13.default.dim("cli")} ${r.cliVersion}
29748
+ out2.write(` ${import_picocolors14.default.dim("cli")} ${r.cliVersion}
29668
29749
  `);
29669
- out2.write(` ${import_picocolors13.default.dim("node")} ${r.node}
29750
+ out2.write(` ${import_picocolors14.default.dim("node")} ${r.node}
29670
29751
  `);
29671
- out2.write(` ${import_picocolors13.default.dim("os")} ${r.platform} ${r.arch}
29752
+ out2.write(` ${import_picocolors14.default.dim("os")} ${r.platform} ${r.arch}
29672
29753
  `);
29673
- out2.write(` ${import_picocolors13.default.dim("api")} ${r.apiBase}
29754
+ out2.write(` ${import_picocolors14.default.dim("api")} ${r.apiBase}
29674
29755
  `);
29675
29756
  if (process.env.CODEAM_TEST_MODE === "1" || process.env.CODEAM_TEST_MODE?.toLowerCase() === "true") {
29676
- out2.write(` ${import_picocolors13.default.dim("mode")} ${import_picocolors13.default.yellow("TEST_MODE \u2014 using dev preview")}
29757
+ out2.write(` ${import_picocolors14.default.dim("mode")} ${import_picocolors14.default.yellow("TEST_MODE \u2014 using dev preview")}
29677
29758
  `);
29678
29759
  } else if (process.env.CODEAM_API_URL) {
29679
- out2.write(` ${import_picocolors13.default.dim("mode")} ${import_picocolors13.default.yellow("CODEAM_API_URL override")}
29760
+ out2.write(` ${import_picocolors14.default.dim("mode")} ${import_picocolors14.default.yellow("CODEAM_API_URL override")}
29680
29761
  `);
29681
29762
  }
29682
- out2.write(` ${import_picocolors13.default.dim("diag id")} ${r.diagnosticId}
29763
+ out2.write(` ${import_picocolors14.default.dim("diag id")} ${r.diagnosticId}
29683
29764
  `);
29684
29765
  out2.write("\n");
29685
29766
  for (const c2 of r.checks) {
29686
- const mark = c2.ok ? import_picocolors13.default.green("\u2713") : c2.optional ? import_picocolors13.default.yellow("!") : import_picocolors13.default.red("\u2717");
29687
- out2.write(` ${mark} ${c2.label}${import_picocolors13.default.dim(` \u2014 ${c2.detail}`)}
29767
+ const mark = c2.ok ? import_picocolors14.default.green("\u2713") : c2.optional ? import_picocolors14.default.yellow("!") : import_picocolors14.default.red("\u2717");
29768
+ out2.write(` ${mark} ${c2.label}${import_picocolors14.default.dim(` \u2014 ${c2.detail}`)}
29688
29769
  `);
29689
29770
  if (!c2.ok && c2.hint) {
29690
29771
  for (const line of c2.hint.split("\n")) {
29691
- out2.write(` ${import_picocolors13.default.dim(line)}
29772
+ out2.write(` ${import_picocolors14.default.dim(line)}
29692
29773
  `);
29693
29774
  }
29694
29775
  }
29695
29776
  }
29696
29777
  out2.write("\n");
29697
29778
  if (r.ok) {
29698
- out2.write(` ${import_picocolors13.default.green("All checks passed.")}
29779
+ out2.write(` ${import_picocolors14.default.green("All checks passed.")}
29699
29780
 
29700
29781
  `);
29701
29782
  } else {
29702
29783
  out2.write(
29703
- ` ${import_picocolors13.default.red("Some checks failed.")} ${import_picocolors13.default.dim("Paste the diagnostic id above when opening a bug report.")}
29784
+ ` ${import_picocolors14.default.red("Some checks failed.")} ${import_picocolors14.default.dim("Paste the diagnostic id above when opening a bug report.")}
29704
29785
 
29705
29786
  `
29706
29787
  );
@@ -29818,118 +29899,123 @@ async function completion(args2) {
29818
29899
  }
29819
29900
 
29820
29901
  // src/commands/version.ts
29821
- var import_picocolors14 = __toESM(require("picocolors"));
29902
+ var import_picocolors15 = __toESM(require("picocolors"));
29822
29903
  function version2() {
29823
- const v = true ? "2.43.7" : "unknown";
29824
- console.log(`${import_picocolors14.default.bold("codeam-cli")} ${import_picocolors14.default.cyan(v)}`);
29904
+ const v = true ? "2.45.0" : "unknown";
29905
+ console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
29825
29906
  }
29826
29907
 
29827
29908
  // src/commands/help.ts
29828
- var import_picocolors15 = __toESM(require("picocolors"));
29909
+ var import_picocolors16 = __toESM(require("picocolors"));
29829
29910
  function help() {
29830
29911
  const lines = [
29831
29912
  "",
29832
- ` ${import_picocolors15.default.bold(import_picocolors15.default.magenta("codeam-cli"))} ${import_picocolors15.default.dim("\u2014 remote-control AI coding agents from your phone")}`,
29913
+ ` ${import_picocolors16.default.bold(import_picocolors16.default.magenta("codeam-cli"))} ${import_picocolors16.default.dim("\u2014 remote-control AI coding agents from your phone")}`,
29833
29914
  "",
29834
- ` ${import_picocolors15.default.bold("Usage")}`,
29835
- ` ${import_picocolors15.default.cyan("codeam")} ${import_picocolors15.default.dim("[command]")}`,
29915
+ ` ${import_picocolors16.default.bold("Usage")}`,
29916
+ ` ${import_picocolors16.default.cyan("codeam")} ${import_picocolors16.default.dim("[command]")}`,
29836
29917
  "",
29837
- ` ${import_picocolors15.default.bold("Commands")}`,
29838
- ` ${import_picocolors15.default.white("codeam")} ${import_picocolors15.default.dim("start the active agent with mobile control")}`,
29839
- ` ${import_picocolors15.default.white("codeam <agent>")} ${import_picocolors15.default.dim("start a specific agent \u2014 e.g. claude, codex")}`,
29840
- ` ${import_picocolors15.default.white("codeam pair")} ${import_picocolors15.default.dim("pair a new mobile device (interactive)")}`,
29841
- ` ${import_picocolors15.default.white("codeam pair --agent <id>")} ${import_picocolors15.default.dim("pair non-interactively for a specific agent")}`,
29842
- ` ${import_picocolors15.default.white("codeam sessions")} ${import_picocolors15.default.dim("list paired devices")}`,
29843
- ` ${import_picocolors15.default.white("codeam sessions switch")} ${import_picocolors15.default.dim("switch the active paired session")}`,
29844
- ` ${import_picocolors15.default.white("codeam sessions delete <id>")} ${import_picocolors15.default.dim("remove a specific paired session")}`,
29845
- ` ${import_picocolors15.default.white("codeam status")} ${import_picocolors15.default.dim("show connection info")}`,
29846
- ` ${import_picocolors15.default.white("codeam logout")} ${import_picocolors15.default.dim("remove all paired sessions")}`,
29847
- ` ${import_picocolors15.default.white("codeam link <agent>")} ${import_picocolors15.default.dim("link an agent (claude, codex) to your CodeAgent account")}`,
29848
- ` ${import_picocolors15.default.white("codeam deploy")} ${import_picocolors15.default.dim("provision a cloud workspace (Codespaces) and pair it")}`,
29849
- ` ${import_picocolors15.default.white("codeam deploy ls | list")} ${import_picocolors15.default.dim("list deployed cloud workspaces")}`,
29850
- ` ${import_picocolors15.default.white("codeam deploy stop | remove")} ${import_picocolors15.default.dim("stop a deployed workspace session")}`,
29851
- ` ${import_picocolors15.default.white("codeam doctor")} ${import_picocolors15.default.dim("run diagnostic checks (DNS, /health, binaries, \u2026)")}`,
29852
- ` ${import_picocolors15.default.white("codeam completion <shell>")} ${import_picocolors15.default.dim("emit a bash/zsh/fish completion script")}`,
29918
+ ` ${import_picocolors16.default.bold("Commands")}`,
29919
+ ` ${import_picocolors16.default.white("codeam")} ${import_picocolors16.default.dim("start the active agent with mobile control")}`,
29920
+ ` ${import_picocolors16.default.white("codeam <agent>")} ${import_picocolors16.default.dim("start a specific agent \u2014 e.g. claude, codex")}`,
29921
+ ` ${import_picocolors16.default.white("codeam pair")} ${import_picocolors16.default.dim("pair a new mobile device (interactive)")}`,
29922
+ ` ${import_picocolors16.default.white("codeam pair --agent <id>")} ${import_picocolors16.default.dim("pair non-interactively for a specific agent")}`,
29923
+ ` ${import_picocolors16.default.white("codeam sessions")} ${import_picocolors16.default.dim("list paired devices")}`,
29924
+ ` ${import_picocolors16.default.white("codeam sessions switch")} ${import_picocolors16.default.dim("switch the active paired session")}`,
29925
+ ` ${import_picocolors16.default.white("codeam sessions delete <id>")} ${import_picocolors16.default.dim("remove a specific paired session")}`,
29926
+ ` ${import_picocolors16.default.white("codeam status")} ${import_picocolors16.default.dim("show connection info")}`,
29927
+ ` ${import_picocolors16.default.white("codeam logout")} ${import_picocolors16.default.dim("remove all paired sessions")}`,
29928
+ ` ${import_picocolors16.default.white("codeam link <agent>")} ${import_picocolors16.default.dim("link an agent (claude, codex) to your CodeAgent account")}`,
29929
+ ` ${import_picocolors16.default.white("codeam deploy")} ${import_picocolors16.default.dim("provision a cloud workspace (Codespaces) and pair it")}`,
29930
+ ` ${import_picocolors16.default.white("codeam deploy ls | list")} ${import_picocolors16.default.dim("list deployed cloud workspaces")}`,
29931
+ ` ${import_picocolors16.default.white("codeam deploy stop | remove")} ${import_picocolors16.default.dim("stop a deployed workspace session")}`,
29932
+ ` ${import_picocolors16.default.white("codeam doctor")} ${import_picocolors16.default.dim("run diagnostic checks (DNS, /health, binaries, \u2026)")}`,
29933
+ ` ${import_picocolors16.default.white("codeam completion <shell>")} ${import_picocolors16.default.dim("emit a bash/zsh/fish completion script")}`,
29853
29934
  "",
29854
- ` ${import_picocolors15.default.bold("Flags")}`,
29855
- ` ${import_picocolors15.default.white("-v, --version")} ${import_picocolors15.default.dim("print the CLI version")}`,
29856
- ` ${import_picocolors15.default.white("-h, --help")} ${import_picocolors15.default.dim("show this help")}`,
29935
+ ` ${import_picocolors16.default.bold("Flags")}`,
29936
+ ` ${import_picocolors16.default.white("-v, --version")} ${import_picocolors16.default.dim("print the CLI version")}`,
29937
+ ` ${import_picocolors16.default.white("-h, --help")} ${import_picocolors16.default.dim("show this help")}`,
29857
29938
  "",
29858
- ` ${import_picocolors15.default.bold("Links")}`,
29859
- ` ${import_picocolors15.default.dim("Docs:")} ${import_picocolors15.default.green("https://www.codeagent-mobile.com")}`,
29860
- ` ${import_picocolors15.default.dim("Issues:")} ${import_picocolors15.default.green("https://github.com/edgar-durand/codeagent-mobile-clients/issues")}`,
29939
+ ` ${import_picocolors16.default.bold("Links")}`,
29940
+ ` ${import_picocolors16.default.dim("Docs:")} ${import_picocolors16.default.green("https://www.codeagent-mobile.com")}`,
29941
+ ` ${import_picocolors16.default.dim("Issues:")} ${import_picocolors16.default.green("https://github.com/edgar-durand/codeagent-mobile-clients/issues")}`,
29861
29942
  ""
29862
29943
  ];
29863
29944
  process.stdout.write(lines.join("\n") + "\n");
29864
29945
  }
29865
29946
 
29866
29947
  // src/commands/subcommand-help.ts
29867
- var import_picocolors16 = __toESM(require("picocolors"));
29948
+ var import_picocolors17 = __toESM(require("picocolors"));
29868
29949
  var HELPS = {
29869
29950
  pair: () => print([
29870
- ` ${import_picocolors16.default.bold("codeam pair")} ${import_picocolors16.default.dim("\u2014 pair a mobile device with this CLI")}`,
29951
+ ` ${import_picocolors17.default.bold("codeam pair")} ${import_picocolors17.default.dim("\u2014 pair a mobile device with this CLI")}`,
29871
29952
  "",
29872
- ` ${import_picocolors16.default.cyan("codeam pair")} ${import_picocolors16.default.dim("interactive pairing (prompts for the agent)")}`,
29873
- ` ${import_picocolors16.default.cyan("codeam pair --agent <id>")} ${import_picocolors16.default.dim("pair non-interactively (agent: claude | codex)")}`,
29874
- ` ${import_picocolors16.default.cyan("codeam pair --dry-run")} ${import_picocolors16.default.dim("request a pairing code, validate the response, exit")}`
29953
+ ` ${import_picocolors17.default.cyan("codeam pair")} ${import_picocolors17.default.dim("interactive pairing (prompts for the agent)")}`,
29954
+ ` ${import_picocolors17.default.cyan("codeam pair --agent <id>")} ${import_picocolors17.default.dim("pair non-interactively (agent: claude | codex)")}`,
29955
+ ` ${import_picocolors17.default.cyan("codeam pair --dry-run")} ${import_picocolors17.default.dim("request a pairing code, validate the response, exit")}`
29875
29956
  ]),
29876
29957
  "pair-auto": () => print([
29877
- ` ${import_picocolors16.default.bold("codeam pair-auto")} ${import_picocolors16.default.dim("\u2014 non-interactive variant of pair for scripted setups")}`,
29958
+ ` ${import_picocolors17.default.bold("codeam pair-auto")} ${import_picocolors17.default.dim("\u2014 non-interactive variant of pair for scripted setups")}`,
29878
29959
  "",
29879
- ` ${import_picocolors16.default.cyan("codeam pair-auto --agent <id>")} ${import_picocolors16.default.dim("pair using the supplied agent id; exit on success or timeout")}`
29960
+ ` ${import_picocolors17.default.cyan("codeam pair-auto --agent <id>")} ${import_picocolors17.default.dim("pair using the supplied agent id; exit on success or timeout")}`
29880
29961
  ]),
29881
29962
  link: () => print([
29882
- ` ${import_picocolors16.default.bold("codeam link <agent>")} ${import_picocolors16.default.dim("\u2014 upload a local agent token (Claude or Codex) to your vault")}`,
29963
+ ` ${import_picocolors17.default.bold("codeam link <agent>")} ${import_picocolors17.default.dim("\u2014 upload a local agent token (Claude or Codex) to your vault")}`,
29883
29964
  "",
29884
- ` ${import_picocolors16.default.cyan("codeam link claude")}`,
29885
- ` ${import_picocolors16.default.cyan("codeam link codex")}`,
29965
+ ` ${import_picocolors17.default.cyan("codeam link claude")}`,
29966
+ ` ${import_picocolors17.default.cyan("codeam link codex")}`,
29886
29967
  "",
29887
- ` ${import_picocolors16.default.white("--api-key=<key>")} ${import_picocolors16.default.dim("paste an API key directly (visible in `ps -ef`)")}`,
29888
- ` ${import_picocolors16.default.white("--api-key-file=<path>")} ${import_picocolors16.default.dim("read API key from a file (recommended for CI / scripts)")}`,
29889
- ` ${import_picocolors16.default.white("--reuse-existing")} ${import_picocolors16.default.dim("upload existing creds without re-launching the agent login")}`,
29890
- ` ${import_picocolors16.default.white("--token-file=<path>")} ${import_picocolors16.default.dim("manual credential blob path for unusual vendor locations")}`,
29891
- ` ${import_picocolors16.default.white("--dry-run")} ${import_picocolors16.default.dim("probe the /api/plugin/agents/<agent>/link endpoint and exit")}`
29968
+ ` ${import_picocolors17.default.white("--api-key=<key>")} ${import_picocolors17.default.dim("paste an API key directly (visible in `ps -ef`)")}`,
29969
+ ` ${import_picocolors17.default.white("--api-key-file=<path>")} ${import_picocolors17.default.dim("read API key from a file (recommended for CI / scripts)")}`,
29970
+ ` ${import_picocolors17.default.white("--reuse-existing")} ${import_picocolors17.default.dim("upload existing creds without re-launching the agent login")}`,
29971
+ ` ${import_picocolors17.default.white("--token-file=<path>")} ${import_picocolors17.default.dim("manual credential blob path for unusual vendor locations")}`,
29972
+ ` ${import_picocolors17.default.white("--dry-run")} ${import_picocolors17.default.dim("probe the /api/plugin/agents/<agent>/link endpoint and exit")}`
29892
29973
  ]),
29893
29974
  sessions: () => print([
29894
- ` ${import_picocolors16.default.bold("codeam sessions")} ${import_picocolors16.default.dim("\u2014 list, switch, or delete paired mobile sessions")}`,
29975
+ ` ${import_picocolors17.default.bold("codeam sessions")} ${import_picocolors17.default.dim("\u2014 list, switch, or delete paired mobile sessions")}`,
29895
29976
  "",
29896
- ` ${import_picocolors16.default.cyan("codeam sessions")} ${import_picocolors16.default.dim("list all paired sessions on this machine")}`,
29897
- ` ${import_picocolors16.default.cyan("codeam sessions switch")} ${import_picocolors16.default.dim("interactively switch the active session")}`,
29898
- ` ${import_picocolors16.default.cyan("codeam sessions delete <id>")} ${import_picocolors16.default.dim("remove a specific paired session")}`
29977
+ ` ${import_picocolors17.default.cyan("codeam sessions")} ${import_picocolors17.default.dim("list all paired sessions on this machine")}`,
29978
+ ` ${import_picocolors17.default.cyan("codeam sessions switch")} ${import_picocolors17.default.dim("interactively switch the active session")}`,
29979
+ ` ${import_picocolors17.default.cyan("codeam sessions delete <id>")} ${import_picocolors17.default.dim("remove a specific paired session")}`
29899
29980
  ]),
29900
29981
  deploy: () => print([
29901
- ` ${import_picocolors16.default.bold("codeam deploy")} ${import_picocolors16.default.dim("\u2014 provision a cloud workspace (GitHub Codespaces) and pair it")}`,
29982
+ ` ${import_picocolors17.default.bold("codeam deploy")} ${import_picocolors17.default.dim("\u2014 provision a cloud workspace (GitHub Codespaces) and pair it")}`,
29983
+ "",
29984
+ ` ${import_picocolors17.default.cyan("codeam deploy")} ${import_picocolors17.default.dim("start a new deploy (prompts for repo + agent)")}`,
29985
+ ` ${import_picocolors17.default.cyan("codeam deploy ls | list")} ${import_picocolors17.default.dim("list deployed cloud workspaces")}`,
29986
+ ` ${import_picocolors17.default.cyan("codeam deploy stop | remove")} ${import_picocolors17.default.dim("pick a workspace and stop its codeam-pair session")}`
29987
+ ]),
29988
+ invite: () => print([
29989
+ ` ${import_picocolors17.default.bold("codeam invite")} ${import_picocolors17.default.dim("\u2014 print your referral link to earn PRO for you and your crew")}`,
29902
29990
  "",
29903
- ` ${import_picocolors16.default.cyan("codeam deploy")} ${import_picocolors16.default.dim("start a new deploy (prompts for repo + agent)")}`,
29904
- ` ${import_picocolors16.default.cyan("codeam deploy ls | list")} ${import_picocolors16.default.dim("list deployed cloud workspaces")}`,
29905
- ` ${import_picocolors16.default.cyan("codeam deploy stop | remove")} ${import_picocolors16.default.dim("pick a workspace and stop its codeam-pair session")}`
29991
+ ` ${import_picocolors17.default.cyan("codeam invite")} ${import_picocolors17.default.dim("fetch and display your personal referral link")}`
29906
29992
  ]),
29907
29993
  status: () => print([
29908
- ` ${import_picocolors16.default.bold("codeam status")} ${import_picocolors16.default.dim("\u2014 show the active session, agent, and connection info")}`
29994
+ ` ${import_picocolors17.default.bold("codeam status")} ${import_picocolors17.default.dim("\u2014 show the active session, agent, and connection info")}`
29909
29995
  ]),
29910
29996
  logout: () => print([
29911
- ` ${import_picocolors16.default.bold("codeam logout")} ${import_picocolors16.default.dim("\u2014 remove every paired session from this machine")}`
29997
+ ` ${import_picocolors17.default.bold("codeam logout")} ${import_picocolors17.default.dim("\u2014 remove every paired session from this machine")}`
29912
29998
  ]),
29913
29999
  doctor: () => print([
29914
- ` ${import_picocolors16.default.bold("codeam doctor")} ${import_picocolors16.default.dim("\u2014 run diagnostic checks for support triage")}`,
30000
+ ` ${import_picocolors17.default.bold("codeam doctor")} ${import_picocolors17.default.dim("\u2014 run diagnostic checks for support triage")}`,
29915
30001
  "",
29916
- ` ${import_picocolors16.default.cyan("codeam doctor")} ${import_picocolors16.default.dim("human-readable report")}`,
29917
- ` ${import_picocolors16.default.cyan("codeam doctor --json")} ${import_picocolors16.default.dim("machine-parseable report (single JSON document on stdout)")}`,
30002
+ ` ${import_picocolors17.default.cyan("codeam doctor")} ${import_picocolors17.default.dim("human-readable report")}`,
30003
+ ` ${import_picocolors17.default.cyan("codeam doctor --json")} ${import_picocolors17.default.dim("machine-parseable report (single JSON document on stdout)")}`,
29918
30004
  "",
29919
- ` ${import_picocolors16.default.dim("Output never includes tokens or credentials. Paste the diagnostic id")}`,
29920
- ` ${import_picocolors16.default.dim("into a bug report so support can grep the server-side logs.")}`
30005
+ ` ${import_picocolors17.default.dim("Output never includes tokens or credentials. Paste the diagnostic id")}`,
30006
+ ` ${import_picocolors17.default.dim("into a bug report so support can grep the server-side logs.")}`
29921
30007
  ]),
29922
30008
  completion: () => print([
29923
- ` ${import_picocolors16.default.bold("codeam completion <shell>")} ${import_picocolors16.default.dim("\u2014 emit a shell-completion script for sourcing")}`,
30009
+ ` ${import_picocolors17.default.bold("codeam completion <shell>")} ${import_picocolors17.default.dim("\u2014 emit a shell-completion script for sourcing")}`,
29924
30010
  "",
29925
- ` ${import_picocolors16.default.cyan("codeam completion bash")} ${import_picocolors16.default.dim("print a bash completion function")}`,
29926
- ` ${import_picocolors16.default.cyan("codeam completion zsh")} ${import_picocolors16.default.dim("print a zsh completion function")}`,
29927
- ` ${import_picocolors16.default.cyan("codeam completion fish")} ${import_picocolors16.default.dim("print a fish completion file")}`,
30011
+ ` ${import_picocolors17.default.cyan("codeam completion bash")} ${import_picocolors17.default.dim("print a bash completion function")}`,
30012
+ ` ${import_picocolors17.default.cyan("codeam completion zsh")} ${import_picocolors17.default.dim("print a zsh completion function")}`,
30013
+ ` ${import_picocolors17.default.cyan("codeam completion fish")} ${import_picocolors17.default.dim("print a fish completion file")}`,
29928
30014
  "",
29929
- ` ${import_picocolors16.default.dim("Examples:")}`,
29930
- ` ${import_picocolors16.default.dim(" bash: codeam completion bash >> ~/.bashrc")}`,
29931
- ` ${import_picocolors16.default.dim(" zsh: codeam completion zsh >> ~/.zshrc")}`,
29932
- ` ${import_picocolors16.default.dim(" fish: codeam completion fish > ~/.config/fish/completions/codeam.fish")}`
30015
+ ` ${import_picocolors17.default.dim("Examples:")}`,
30016
+ ` ${import_picocolors17.default.dim(" bash: codeam completion bash >> ~/.bashrc")}`,
30017
+ ` ${import_picocolors17.default.dim(" zsh: codeam completion zsh >> ~/.zshrc")}`,
30018
+ ` ${import_picocolors17.default.dim(" fish: codeam completion fish > ~/.config/fish/completions/codeam.fish")}`
29933
30019
  ])
29934
30020
  };
29935
30021
  function print(lines) {
@@ -29997,6 +30083,7 @@ async function main() {
29997
30083
  "host": () => host(args),
29998
30084
  "sessions": () => sessions2(args),
29999
30085
  "status": () => status(),
30086
+ "invite": () => invite(),
30000
30087
  "logout": () => logout(),
30001
30088
  "link": () => link(args),
30002
30089
  "doctor": () => doctor(args),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.43.7",
3
+ "version": "2.45.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",