codeam-cli 2.0.0 → 2.0.1

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.
Files changed (2) hide show
  1. package/dist/index.js +72 -37
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -116,7 +116,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
116
116
  // package.json
117
117
  var package_default = {
118
118
  name: "codeam-cli",
119
- version: "2.0.0",
119
+ version: "2.0.1",
120
120
  description: "Remote control Claude Code (and other AI coding agents) from your mobile phone. Pair your device, send prompts, stream responses in real-time, and approve commands \u2014 from anywhere.",
121
121
  main: "dist/index.js",
122
122
  bin: {
@@ -1010,38 +1010,7 @@ function classifyStep(text) {
1010
1010
  return { tool: "other", label, status: "running" };
1011
1011
  }
1012
1012
 
1013
- // ../../packages/shared/src/models/pricing.ts
1014
- var MODEL_PRICING = {
1015
- "claude-sonnet-4": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
1016
- "claude-opus-4": { input: 15, output: 75, cacheRead: 1.5, cacheWrite: 18.75 },
1017
- "claude-3-5-sonnet": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
1018
- "claude-3-5-haiku": { input: 0.8, output: 4, cacheRead: 0.08, cacheWrite: 1 },
1019
- "claude-3-haiku": { input: 0.25, output: 1.25, cacheRead: 0.03, cacheWrite: 0.3 }
1020
- };
1021
- var MODEL_CONTEXT_WINDOW = {
1022
- "claude-opus-4": 1e6,
1023
- "claude-sonnet-4": 1e6,
1024
- "claude-3-5-sonnet": 2e5,
1025
- "claude-3-5-haiku": 2e5,
1026
- "claude-3-haiku": 2e5
1027
- };
1028
- var DEFAULT_CONTEXT_WINDOW = 2e5;
1029
- function getPricing(model) {
1030
- for (const [prefix, pricing] of Object.entries(MODEL_PRICING)) {
1031
- if (model.startsWith(prefix)) return pricing;
1032
- }
1033
- return MODEL_PRICING["claude-sonnet-4"];
1034
- }
1035
- function getContextWindow(model) {
1036
- if (!model) return DEFAULT_CONTEXT_WINDOW;
1037
- for (const [prefix, size] of Object.entries(MODEL_CONTEXT_WINDOW)) {
1038
- if (model.startsWith(prefix)) return size;
1039
- }
1040
- return DEFAULT_CONTEXT_WINDOW;
1041
- }
1042
-
1043
- // src/services/output.service.ts
1044
- var API_BASE4 = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
1013
+ // ../../packages/shared/src/protocol/renderToLines.ts
1045
1014
  function renderToLines(raw) {
1046
1015
  const screen = [""];
1047
1016
  let row = 0;
@@ -1147,11 +1116,12 @@ function renderToLines(raw) {
1147
1116
  }
1148
1117
  return screen;
1149
1118
  }
1119
+
1120
+ // ../../packages/shared/src/protocol/selector.ts
1150
1121
  function detectSelector(lines) {
1151
1122
  if (lines.some((l) => /\?\s+for\s+shortcuts/i.test(l.trim()))) return null;
1152
1123
  const clean = lines.map(
1153
1124
  (l) => l.replace(/^[│╭╰╮╯┌└┐┘├┤┬┴┼]\s?/, "").replace(/\s*[│╭╰╮╯┌└┐┘├┤┬┴┼─━═]+\s*$/, "")
1154
- // strip trailing fill + border
1155
1125
  );
1156
1126
  if (!clean.some((l) => /^❯\s*\d+\./.test(l.trim()))) return null;
1157
1127
  let optionStartIdx = -1;
@@ -1253,6 +1223,8 @@ function detectListSelector(lines) {
1253
1223
  currentIndex
1254
1224
  };
1255
1225
  }
1226
+
1227
+ // ../../packages/shared/src/protocol/filterChrome.ts
1256
1228
  function filterChrome(lines) {
1257
1229
  const result = [];
1258
1230
  let skipEchoContinuation = false;
@@ -1295,6 +1267,39 @@ function filterChrome(lines) {
1295
1267
  }
1296
1268
  return result;
1297
1269
  }
1270
+
1271
+ // ../../packages/shared/src/models/pricing.ts
1272
+ var MODEL_PRICING = {
1273
+ "claude-sonnet-4": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
1274
+ "claude-opus-4": { input: 15, output: 75, cacheRead: 1.5, cacheWrite: 18.75 },
1275
+ "claude-3-5-sonnet": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
1276
+ "claude-3-5-haiku": { input: 0.8, output: 4, cacheRead: 0.08, cacheWrite: 1 },
1277
+ "claude-3-haiku": { input: 0.25, output: 1.25, cacheRead: 0.03, cacheWrite: 0.3 }
1278
+ };
1279
+ var MODEL_CONTEXT_WINDOW = {
1280
+ "claude-opus-4": 1e6,
1281
+ "claude-sonnet-4": 1e6,
1282
+ "claude-3-5-sonnet": 2e5,
1283
+ "claude-3-5-haiku": 2e5,
1284
+ "claude-3-haiku": 2e5
1285
+ };
1286
+ var DEFAULT_CONTEXT_WINDOW = 2e5;
1287
+ function getPricing(model) {
1288
+ for (const [prefix, pricing] of Object.entries(MODEL_PRICING)) {
1289
+ if (model.startsWith(prefix)) return pricing;
1290
+ }
1291
+ return MODEL_PRICING["claude-sonnet-4"];
1292
+ }
1293
+ function getContextWindow(model) {
1294
+ if (!model) return DEFAULT_CONTEXT_WINDOW;
1295
+ for (const [prefix, size] of Object.entries(MODEL_CONTEXT_WINDOW)) {
1296
+ if (model.startsWith(prefix)) return size;
1297
+ }
1298
+ return DEFAULT_CONTEXT_WINDOW;
1299
+ }
1300
+
1301
+ // src/services/output.service.ts
1302
+ var API_BASE4 = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
1298
1303
  var OutputService = class _OutputService {
1299
1304
  constructor(sessionId, pluginId, onSessionIdDetected, onRateLimitDetected, onTurnComplete, onTerminalTurnDetected) {
1300
1305
  this.sessionId = sessionId;
@@ -1582,6 +1587,27 @@ var path4 = __toESM(require("path"));
1582
1587
  var os4 = __toESM(require("os"));
1583
1588
  var https3 = __toESM(require("https"));
1584
1589
  var http3 = __toESM(require("http"));
1590
+
1591
+ // src/services/logger.ts
1592
+ var LEVELS = { silent: 0, error: 1, warn: 2, info: 3, debug: 4 };
1593
+ function currentLevel() {
1594
+ const raw = (process.env.CODEAM_LOG ?? "error").toLowerCase();
1595
+ return LEVELS[raw] ?? LEVELS.error;
1596
+ }
1597
+ function emit(level, tag, msg, err) {
1598
+ if (LEVELS[level] > currentLevel()) return;
1599
+ const detail = err instanceof Error ? `: ${err.message}` : err !== void 0 ? `: ${String(err)}` : "";
1600
+ process.stderr.write(`[codeam:${level}] ${tag} \u2014 ${msg}${detail}
1601
+ `);
1602
+ }
1603
+ var log = {
1604
+ error: (tag, msg, err) => emit("error", tag, msg, err),
1605
+ warn: (tag, msg, err) => emit("warn", tag, msg, err),
1606
+ info: (tag, msg, err) => emit("info", tag, msg, err),
1607
+ debug: (tag, msg, err) => emit("debug", tag, msg, err)
1608
+ };
1609
+
1610
+ // src/services/history.service.ts
1585
1611
  var API_BASE5 = process.env.CODEAM_API_URL ?? "https://codeagent-mobile-api.vercel.app";
1586
1612
  function encodeCwd(cwd) {
1587
1613
  return cwd.replace(/\//g, "-");
@@ -1599,7 +1625,10 @@ function parseJsonl(filePath) {
1599
1625
  let raw;
1600
1626
  try {
1601
1627
  raw = fs4.readFileSync(filePath, "utf8");
1602
- } catch {
1628
+ } catch (err) {
1629
+ if (err.code !== "ENOENT") {
1630
+ log.warn("history:parseJsonl", `read failed for ${filePath}`, err);
1631
+ }
1603
1632
  return messages;
1604
1633
  }
1605
1634
  const lines = raw.split("\n").filter(Boolean);
@@ -1643,11 +1672,17 @@ function post(endpoint, body) {
1643
1672
  },
1644
1673
  (res) => {
1645
1674
  res.resume();
1646
- resolve(res.statusCode !== void 0 && res.statusCode >= 200 && res.statusCode < 300);
1675
+ const ok = res.statusCode !== void 0 && res.statusCode >= 200 && res.statusCode < 300;
1676
+ if (!ok) log.warn("history:post", `${endpoint} \u2192 HTTP ${res.statusCode}`);
1677
+ resolve(ok);
1647
1678
  }
1648
1679
  );
1649
- req.on("error", () => resolve(false));
1680
+ req.on("error", (err) => {
1681
+ log.warn("history:post", `${endpoint} network error`, err);
1682
+ resolve(false);
1683
+ });
1650
1684
  req.on("timeout", () => {
1685
+ log.warn("history:post", `${endpoint} timeout after 15s`);
1651
1686
  req.destroy();
1652
1687
  resolve(false);
1653
1688
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Remote control Claude Code (and other AI coding agents) from your mobile phone. Pair your device, send prompts, stream responses in real-time, and approve commands — from anywhere.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {