codeam-cli 2.39.43 → 2.39.44
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 +6 -0
- package/dist/index.js +97 -66
- package/package.json +1 -1
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.39.43] — 2026-06-19
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** Extract macOS cloudflared .tgz + self-heal gzip-corrupt cache
|
|
12
|
+
|
|
7
13
|
## [2.39.42] — 2026-06-19
|
|
8
14
|
|
|
9
15
|
### Added
|
package/dist/index.js
CHANGED
|
@@ -498,7 +498,7 @@ var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
|
|
|
498
498
|
// package.json
|
|
499
499
|
var package_default = {
|
|
500
500
|
name: "codeam-cli",
|
|
501
|
-
version: "2.39.
|
|
501
|
+
version: "2.39.44",
|
|
502
502
|
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.",
|
|
503
503
|
type: "commonjs",
|
|
504
504
|
main: "dist/index.js",
|
|
@@ -5908,7 +5908,7 @@ function readAnonId() {
|
|
|
5908
5908
|
}
|
|
5909
5909
|
function superProperties() {
|
|
5910
5910
|
return {
|
|
5911
|
-
cliVersion: true ? "2.39.
|
|
5911
|
+
cliVersion: true ? "2.39.44" : "0.0.0-dev",
|
|
5912
5912
|
nodeVersion: process.version,
|
|
5913
5913
|
platform: process.platform,
|
|
5914
5914
|
arch: process.arch,
|
|
@@ -20253,6 +20253,7 @@ var import_crypto4 = require("crypto");
|
|
|
20253
20253
|
|
|
20254
20254
|
// src/services/turn-files/git-changeset.ts
|
|
20255
20255
|
var import_child_process21 = require("child_process");
|
|
20256
|
+
var fs37 = __toESM(require("fs/promises"));
|
|
20256
20257
|
var path44 = __toESM(require("path"));
|
|
20257
20258
|
async function collectRepoChangeset(opts) {
|
|
20258
20259
|
const status2 = await runGit3(opts.repoRoot, ["status", "--porcelain=v1", "-z"]);
|
|
@@ -20267,7 +20268,16 @@ async function collectRepoChangeset(opts) {
|
|
|
20267
20268
|
const entries = [];
|
|
20268
20269
|
for (const row of parseStatus(status2)) {
|
|
20269
20270
|
if (isIgnoredFilePath(row.filePath)) continue;
|
|
20270
|
-
const
|
|
20271
|
+
const numstatEntry = numstat.get(row.filePath);
|
|
20272
|
+
let stats;
|
|
20273
|
+
if (row.fileStatus === "added" && numstatEntry === void 0) {
|
|
20274
|
+
const lineCount = await readUntrackedLineCount(
|
|
20275
|
+
path44.join(opts.repoRoot, row.filePath)
|
|
20276
|
+
);
|
|
20277
|
+
stats = { added: lineCount, removed: 0 };
|
|
20278
|
+
} else {
|
|
20279
|
+
stats = numstatEntry ?? { added: 0, removed: 0 };
|
|
20280
|
+
}
|
|
20271
20281
|
entries.push({
|
|
20272
20282
|
filePath: row.filePath,
|
|
20273
20283
|
fileStatus: row.fileStatus,
|
|
@@ -20284,6 +20294,27 @@ async function collectRepoChangeset(opts) {
|
|
|
20284
20294
|
}
|
|
20285
20295
|
return entries;
|
|
20286
20296
|
}
|
|
20297
|
+
var MAX_UNTRACKED_LINE_SCAN = 1e5;
|
|
20298
|
+
var _readUntrackedLineCountImpl = {
|
|
20299
|
+
read: defaultReadUntrackedLineCount
|
|
20300
|
+
};
|
|
20301
|
+
function readUntrackedLineCount(absPath) {
|
|
20302
|
+
return _readUntrackedLineCountImpl.read(absPath);
|
|
20303
|
+
}
|
|
20304
|
+
async function defaultReadUntrackedLineCount(absPath) {
|
|
20305
|
+
try {
|
|
20306
|
+
const content = await fs37.readFile(absPath, "utf8");
|
|
20307
|
+
let count = 0;
|
|
20308
|
+
let pos = -1;
|
|
20309
|
+
while ((pos = content.indexOf("\n", pos + 1)) !== -1) {
|
|
20310
|
+
count += 1;
|
|
20311
|
+
if (count >= MAX_UNTRACKED_LINE_SCAN) return count;
|
|
20312
|
+
}
|
|
20313
|
+
return content.length > 0 ? Math.max(count, 1) : 0;
|
|
20314
|
+
} catch {
|
|
20315
|
+
return 0;
|
|
20316
|
+
}
|
|
20317
|
+
}
|
|
20287
20318
|
function parseStatus(raw) {
|
|
20288
20319
|
const tokens = raw.split("\0");
|
|
20289
20320
|
const rows = [];
|
|
@@ -20364,7 +20395,7 @@ function defaultRunGit(cwd, args2) {
|
|
|
20364
20395
|
});
|
|
20365
20396
|
}
|
|
20366
20397
|
async function discoverRepos(workingDir, maxDepth = 4) {
|
|
20367
|
-
const
|
|
20398
|
+
const fs47 = await import("fs/promises");
|
|
20368
20399
|
const out2 = [];
|
|
20369
20400
|
await walk(workingDir, 0);
|
|
20370
20401
|
return out2;
|
|
@@ -20372,7 +20403,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
|
|
|
20372
20403
|
if (depth > maxDepth) return;
|
|
20373
20404
|
let entries = [];
|
|
20374
20405
|
try {
|
|
20375
|
-
const dirents = await
|
|
20406
|
+
const dirents = await fs47.readdir(dir, { withFileTypes: true });
|
|
20376
20407
|
entries = dirents.filter((d3) => !d3.name.startsWith(".") || d3.name === ".git").map((d3) => ({ name: d3.name, isDirectory: d3.isDirectory() }));
|
|
20377
20408
|
} catch {
|
|
20378
20409
|
return;
|
|
@@ -20398,7 +20429,7 @@ async function discoverRepos(workingDir, maxDepth = 4) {
|
|
|
20398
20429
|
}
|
|
20399
20430
|
|
|
20400
20431
|
// src/services/turn-files/files-outbox.ts
|
|
20401
|
-
var
|
|
20432
|
+
var fs38 = __toESM(require("fs/promises"));
|
|
20402
20433
|
var path45 = __toESM(require("path"));
|
|
20403
20434
|
var import_os7 = require("os");
|
|
20404
20435
|
var HOME_OUTBOX_DIR = ".codeam/outbox";
|
|
@@ -20440,8 +20471,8 @@ var FilesOutbox = class {
|
|
|
20440
20471
|
/** Persist the entry to disk and trigger a flush. Returns once the
|
|
20441
20472
|
* line is durable on disk (not once the POST succeeds). */
|
|
20442
20473
|
async enqueue(entry) {
|
|
20443
|
-
await
|
|
20444
|
-
await
|
|
20474
|
+
await fs38.mkdir(path45.dirname(this.filePath), { recursive: true });
|
|
20475
|
+
await fs38.appendFile(this.filePath, JSON.stringify(entry) + "\n", "utf8");
|
|
20445
20476
|
this.backoffIndex = 0;
|
|
20446
20477
|
if (this.autoSchedule) this.scheduleFlush(0);
|
|
20447
20478
|
}
|
|
@@ -20530,7 +20561,7 @@ var FilesOutbox = class {
|
|
|
20530
20561
|
async readAll() {
|
|
20531
20562
|
let raw = "";
|
|
20532
20563
|
try {
|
|
20533
|
-
raw = await
|
|
20564
|
+
raw = await fs38.readFile(this.filePath, "utf8");
|
|
20534
20565
|
} catch {
|
|
20535
20566
|
return [];
|
|
20536
20567
|
}
|
|
@@ -20554,12 +20585,12 @@ var FilesOutbox = class {
|
|
|
20554
20585
|
async rewrite(entries) {
|
|
20555
20586
|
const tmpPath = `${this.filePath}.${process.pid}.tmp`;
|
|
20556
20587
|
if (entries.length === 0) {
|
|
20557
|
-
await
|
|
20588
|
+
await fs38.unlink(this.filePath).catch(() => void 0);
|
|
20558
20589
|
return;
|
|
20559
20590
|
}
|
|
20560
20591
|
const payload = entries.map((e) => JSON.stringify(e)).join("\n") + "\n";
|
|
20561
|
-
await
|
|
20562
|
-
await
|
|
20592
|
+
await fs38.writeFile(tmpPath, payload, "utf8");
|
|
20593
|
+
await fs38.rename(tmpPath, this.filePath);
|
|
20563
20594
|
}
|
|
20564
20595
|
};
|
|
20565
20596
|
function applyJitter(ms) {
|
|
@@ -22457,7 +22488,7 @@ var OutputService = class _OutputService {
|
|
|
22457
22488
|
};
|
|
22458
22489
|
|
|
22459
22490
|
// src/services/history.service.ts
|
|
22460
|
-
var
|
|
22491
|
+
var fs39 = __toESM(require("fs"));
|
|
22461
22492
|
var path46 = __toESM(require("path"));
|
|
22462
22493
|
var os30 = __toESM(require("os"));
|
|
22463
22494
|
var https7 = __toESM(require("https"));
|
|
@@ -22486,7 +22517,7 @@ function parseJsonl(filePath) {
|
|
|
22486
22517
|
const messages = [];
|
|
22487
22518
|
let raw;
|
|
22488
22519
|
try {
|
|
22489
|
-
raw =
|
|
22520
|
+
raw = fs39.readFileSync(filePath, "utf8");
|
|
22490
22521
|
} catch (err) {
|
|
22491
22522
|
if (err.code !== "ENOENT") {
|
|
22492
22523
|
log.warn("history:parseJsonl", `read failed for ${filePath}`, err);
|
|
@@ -22676,9 +22707,9 @@ var HistoryService = class _HistoryService {
|
|
|
22676
22707
|
const dir = this.projectDir;
|
|
22677
22708
|
const cutoff = this.bootTimeMs - _HistoryService.BIRTHTIME_GRACE_MS;
|
|
22678
22709
|
try {
|
|
22679
|
-
const files =
|
|
22710
|
+
const files = fs39.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isFile() && e.name.endsWith(".jsonl")).map((e) => {
|
|
22680
22711
|
try {
|
|
22681
|
-
const stat3 =
|
|
22712
|
+
const stat3 = fs39.statSync(path46.join(dir, e.name));
|
|
22682
22713
|
return { name: e.name, mtime: stat3.mtimeMs, birthtime: stat3.birthtimeMs };
|
|
22683
22714
|
} catch {
|
|
22684
22715
|
return { name: e.name, mtime: 0, birthtime: 0 };
|
|
@@ -22719,13 +22750,13 @@ var HistoryService = class _HistoryService {
|
|
|
22719
22750
|
const cutoff = this.bootTimeMs - _HistoryService.BIRTHTIME_GRACE_MS;
|
|
22720
22751
|
let entries;
|
|
22721
22752
|
try {
|
|
22722
|
-
entries =
|
|
22753
|
+
entries = fs39.readdirSync(dir, { withFileTypes: true });
|
|
22723
22754
|
} catch {
|
|
22724
22755
|
return null;
|
|
22725
22756
|
}
|
|
22726
22757
|
const files = entries.filter((e) => e.isFile() && e.name.endsWith(".jsonl")).map((e) => {
|
|
22727
22758
|
try {
|
|
22728
|
-
const stat3 =
|
|
22759
|
+
const stat3 = fs39.statSync(path46.join(dir, e.name));
|
|
22729
22760
|
return { name: e.name, mtime: stat3.mtimeMs, birthtime: stat3.birthtimeMs };
|
|
22730
22761
|
} catch {
|
|
22731
22762
|
return { name: e.name, mtime: 0, birthtime: 0 };
|
|
@@ -22739,7 +22770,7 @@ var HistoryService = class _HistoryService {
|
|
|
22739
22770
|
extractUsageFromFile(filePath) {
|
|
22740
22771
|
let raw;
|
|
22741
22772
|
try {
|
|
22742
|
-
raw =
|
|
22773
|
+
raw = fs39.readFileSync(filePath, "utf8");
|
|
22743
22774
|
} catch {
|
|
22744
22775
|
return null;
|
|
22745
22776
|
}
|
|
@@ -22784,9 +22815,9 @@ var HistoryService = class _HistoryService {
|
|
|
22784
22815
|
let totalCost = 0;
|
|
22785
22816
|
let files;
|
|
22786
22817
|
try {
|
|
22787
|
-
files =
|
|
22818
|
+
files = fs39.readdirSync(projectDir).filter((f) => f.endsWith(".jsonl")).filter((f) => {
|
|
22788
22819
|
try {
|
|
22789
|
-
return
|
|
22820
|
+
return fs39.statSync(path46.join(projectDir, f)).mtimeMs >= monthStartMs;
|
|
22790
22821
|
} catch {
|
|
22791
22822
|
return false;
|
|
22792
22823
|
}
|
|
@@ -22797,7 +22828,7 @@ var HistoryService = class _HistoryService {
|
|
|
22797
22828
|
for (const file of files) {
|
|
22798
22829
|
let raw;
|
|
22799
22830
|
try {
|
|
22800
|
-
raw =
|
|
22831
|
+
raw = fs39.readFileSync(path46.join(projectDir, file), "utf8");
|
|
22801
22832
|
} catch {
|
|
22802
22833
|
continue;
|
|
22803
22834
|
}
|
|
@@ -23388,7 +23419,7 @@ function buildKeepAlive(ctx) {
|
|
|
23388
23419
|
}
|
|
23389
23420
|
|
|
23390
23421
|
// src/agents/claude/onboarding.ts
|
|
23391
|
-
var
|
|
23422
|
+
var fs40 = __toESM(require("fs"));
|
|
23392
23423
|
var os31 = __toESM(require("os"));
|
|
23393
23424
|
var path47 = __toESM(require("path"));
|
|
23394
23425
|
function ensureClaudeOnboarded() {
|
|
@@ -23396,7 +23427,7 @@ function ensureClaudeOnboarded() {
|
|
|
23396
23427
|
const file = path47.join(os31.homedir(), ".claude.json");
|
|
23397
23428
|
let config = {};
|
|
23398
23429
|
try {
|
|
23399
|
-
config = JSON.parse(
|
|
23430
|
+
config = JSON.parse(fs40.readFileSync(file, "utf8"));
|
|
23400
23431
|
} catch {
|
|
23401
23432
|
}
|
|
23402
23433
|
if (config.hasCompletedOnboarding === true && typeof config.theme === "string") {
|
|
@@ -23407,8 +23438,8 @@ function ensureClaudeOnboarded() {
|
|
|
23407
23438
|
if (typeof config.lastOnboardingVersion !== "string") {
|
|
23408
23439
|
config.lastOnboardingVersion = "2.1.177";
|
|
23409
23440
|
}
|
|
23410
|
-
|
|
23411
|
-
|
|
23441
|
+
fs40.mkdirSync(path47.dirname(file), { recursive: true });
|
|
23442
|
+
fs40.writeFileSync(file, JSON.stringify(config, null, 2));
|
|
23412
23443
|
log.info("claude", "pre-completed Claude onboarding (skip first-run theme picker)");
|
|
23413
23444
|
} catch (err) {
|
|
23414
23445
|
log.warn("claude", `ensureClaudeOnboarded failed (non-fatal): ${err.message}`);
|
|
@@ -23899,7 +23930,7 @@ async function autoLinkAfterPair(opts) {
|
|
|
23899
23930
|
}
|
|
23900
23931
|
|
|
23901
23932
|
// src/commands/pair-auto.ts
|
|
23902
|
-
var
|
|
23933
|
+
var fs41 = __toESM(require("fs"));
|
|
23903
23934
|
var os32 = __toESM(require("os"));
|
|
23904
23935
|
var path48 = __toESM(require("path"));
|
|
23905
23936
|
var import_crypto7 = require("crypto");
|
|
@@ -24098,10 +24129,10 @@ function readTokenFromArgs(args2) {
|
|
|
24098
24129
|
if (fileFlag) {
|
|
24099
24130
|
const path58 = fileFlag.slice("--token-file=".length);
|
|
24100
24131
|
try {
|
|
24101
|
-
const content =
|
|
24132
|
+
const content = fs41.readFileSync(path58, "utf8").trim();
|
|
24102
24133
|
if (content.length === 0) fail(`--token-file ${path58} is empty`);
|
|
24103
24134
|
try {
|
|
24104
|
-
|
|
24135
|
+
fs41.unlinkSync(path58);
|
|
24105
24136
|
} catch {
|
|
24106
24137
|
}
|
|
24107
24138
|
return content;
|
|
@@ -24198,7 +24229,7 @@ function isLivePairAuto(pid) {
|
|
|
24198
24229
|
if (e.code !== "EPERM") return false;
|
|
24199
24230
|
}
|
|
24200
24231
|
try {
|
|
24201
|
-
return
|
|
24232
|
+
return fs41.readFileSync(`/proc/${pid}/cmdline`, "utf8").includes("codeam");
|
|
24202
24233
|
} catch {
|
|
24203
24234
|
return true;
|
|
24204
24235
|
}
|
|
@@ -24206,19 +24237,19 @@ function isLivePairAuto(pid) {
|
|
|
24206
24237
|
function acquireSingletonLock() {
|
|
24207
24238
|
const lockPath = pairAutoLockPath();
|
|
24208
24239
|
try {
|
|
24209
|
-
|
|
24240
|
+
fs41.mkdirSync(path48.dirname(lockPath), { recursive: true });
|
|
24210
24241
|
try {
|
|
24211
|
-
|
|
24242
|
+
fs41.writeFileSync(lockPath, String(process.pid), { flag: "wx" });
|
|
24212
24243
|
} catch (e) {
|
|
24213
24244
|
if (e.code !== "EEXIST") throw e;
|
|
24214
|
-
const holder = Number(
|
|
24245
|
+
const holder = Number(fs41.readFileSync(lockPath, "utf8").trim());
|
|
24215
24246
|
if (isLivePairAuto(holder)) return false;
|
|
24216
|
-
|
|
24247
|
+
fs41.writeFileSync(lockPath, String(process.pid));
|
|
24217
24248
|
}
|
|
24218
24249
|
process.once("exit", () => {
|
|
24219
24250
|
try {
|
|
24220
|
-
if (
|
|
24221
|
-
|
|
24251
|
+
if (fs41.existsSync(lockPath) && Number(fs41.readFileSync(lockPath, "utf8").trim()) === process.pid) {
|
|
24252
|
+
fs41.unlinkSync(lockPath);
|
|
24222
24253
|
}
|
|
24223
24254
|
} catch {
|
|
24224
24255
|
}
|
|
@@ -26360,7 +26391,7 @@ async function stopWorkspaceFromLocal(target) {
|
|
|
26360
26391
|
}
|
|
26361
26392
|
|
|
26362
26393
|
// src/commands/host/host-client.ts
|
|
26363
|
-
var
|
|
26394
|
+
var fs42 = __toESM(require("fs"));
|
|
26364
26395
|
var os33 = __toESM(require("os"));
|
|
26365
26396
|
var path53 = __toESM(require("path"));
|
|
26366
26397
|
function sampleCpuTimes() {
|
|
@@ -26421,7 +26452,7 @@ function collectOsInfo() {
|
|
|
26421
26452
|
}
|
|
26422
26453
|
function loadHostIdentity() {
|
|
26423
26454
|
try {
|
|
26424
|
-
const raw =
|
|
26455
|
+
const raw = fs42.readFileSync(hostIdentityPath(), "utf8");
|
|
26425
26456
|
const parsed = JSON.parse(raw);
|
|
26426
26457
|
if (typeof parsed === "object" && parsed !== null && typeof parsed.hostId === "string" && typeof parsed.hostToken === "string" && typeof parsed.controlPluginId === "string") {
|
|
26427
26458
|
const p2 = parsed;
|
|
@@ -26434,12 +26465,12 @@ function loadHostIdentity() {
|
|
|
26434
26465
|
}
|
|
26435
26466
|
function saveHostIdentity(identity) {
|
|
26436
26467
|
const file = hostIdentityPath();
|
|
26437
|
-
|
|
26438
|
-
|
|
26468
|
+
fs42.mkdirSync(path53.dirname(file), { recursive: true, mode: 448 });
|
|
26469
|
+
fs42.writeFileSync(file, JSON.stringify(identity, null, 2), {
|
|
26439
26470
|
encoding: "utf8",
|
|
26440
26471
|
mode: 384
|
|
26441
26472
|
});
|
|
26442
|
-
|
|
26473
|
+
fs42.chmodSync(file, 384);
|
|
26443
26474
|
}
|
|
26444
26475
|
var HostHttpError = class extends Error {
|
|
26445
26476
|
constructor(message, status2) {
|
|
@@ -26462,7 +26493,7 @@ function isHostAuthRejection(err) {
|
|
|
26462
26493
|
}
|
|
26463
26494
|
function deleteHostIdentity() {
|
|
26464
26495
|
try {
|
|
26465
|
-
|
|
26496
|
+
fs42.rmSync(hostIdentityPath(), { force: true });
|
|
26466
26497
|
} catch {
|
|
26467
26498
|
}
|
|
26468
26499
|
}
|
|
@@ -26626,7 +26657,7 @@ var import_node_child_process13 = require("child_process");
|
|
|
26626
26657
|
var os36 = __toESM(require("os"));
|
|
26627
26658
|
|
|
26628
26659
|
// src/commands/host/workspace.ts
|
|
26629
|
-
var
|
|
26660
|
+
var fs43 = __toESM(require("fs"));
|
|
26630
26661
|
var os34 = __toESM(require("os"));
|
|
26631
26662
|
var path54 = __toESM(require("path"));
|
|
26632
26663
|
var import_node_child_process12 = require("child_process");
|
|
@@ -26679,16 +26710,16 @@ function maskToken(text, cloneToken) {
|
|
|
26679
26710
|
}
|
|
26680
26711
|
async function prepareWorkspace(repoOrPath, deployId, cloneToken) {
|
|
26681
26712
|
if (isAbsolutePathTarget(repoOrPath)) {
|
|
26682
|
-
if (!
|
|
26713
|
+
if (!fs43.existsSync(repoOrPath)) {
|
|
26683
26714
|
throw new Error(`deploy target path does not exist: ${repoOrPath}`);
|
|
26684
26715
|
}
|
|
26685
26716
|
return repoOrPath;
|
|
26686
26717
|
}
|
|
26687
26718
|
const dest = path54.join(selfHostedWorkspaceRoot(), deployId);
|
|
26688
|
-
if (
|
|
26719
|
+
if (fs43.existsSync(path54.join(dest, ".git"))) {
|
|
26689
26720
|
return dest;
|
|
26690
26721
|
}
|
|
26691
|
-
|
|
26722
|
+
fs43.mkdirSync(selfHostedWorkspaceRoot(), { recursive: true, mode: 448 });
|
|
26692
26723
|
const cloneUrl = repoCloneUrl(repoOrPath, cloneToken);
|
|
26693
26724
|
try {
|
|
26694
26725
|
await execFileP9("git", ["clone", "--depth", "1", cloneUrl, dest], {
|
|
@@ -26704,7 +26735,7 @@ async function prepareWorkspace(repoOrPath, deployId, cloneToken) {
|
|
|
26704
26735
|
}
|
|
26705
26736
|
|
|
26706
26737
|
// src/commands/host/agent-provisioning.ts
|
|
26707
|
-
var
|
|
26738
|
+
var fs44 = __toESM(require("fs"));
|
|
26708
26739
|
var os35 = __toESM(require("os"));
|
|
26709
26740
|
var path55 = __toESM(require("path"));
|
|
26710
26741
|
var PUBLIC_TO_INTERNAL_AGENT = {
|
|
@@ -26721,12 +26752,12 @@ function toInternalAgentId(publicAgentId) {
|
|
|
26721
26752
|
return PUBLIC_TO_INTERNAL_AGENT[publicAgentId] ?? null;
|
|
26722
26753
|
}
|
|
26723
26754
|
function ensureDir(dir) {
|
|
26724
|
-
|
|
26755
|
+
fs44.mkdirSync(dir, { recursive: true, mode: 448 });
|
|
26725
26756
|
}
|
|
26726
26757
|
function writeFile0600(filePath, contents) {
|
|
26727
26758
|
ensureDir(path55.dirname(filePath));
|
|
26728
|
-
|
|
26729
|
-
|
|
26759
|
+
fs44.writeFileSync(filePath, contents, { encoding: "utf8", mode: 384 });
|
|
26760
|
+
fs44.chmodSync(filePath, 384);
|
|
26730
26761
|
}
|
|
26731
26762
|
var claudeProvisioner = {
|
|
26732
26763
|
write(auth, home) {
|
|
@@ -26735,7 +26766,7 @@ var claudeProvisioner = {
|
|
|
26735
26766
|
}
|
|
26736
26767
|
writeFile0600(path55.join(home, ".claude", ".credentials.json"), auth.value);
|
|
26737
26768
|
const claudeJson = path55.join(home, ".claude.json");
|
|
26738
|
-
if (!
|
|
26769
|
+
if (!fs44.existsSync(claudeJson)) {
|
|
26739
26770
|
writeFile0600(
|
|
26740
26771
|
claudeJson,
|
|
26741
26772
|
JSON.stringify({ hasCompletedOnboarding: true, customApiKeyResponses: { approved: [] } })
|
|
@@ -27165,7 +27196,7 @@ async function hostAgent(args2 = []) {
|
|
|
27165
27196
|
var import_node_dns = require("dns");
|
|
27166
27197
|
var import_node_util5 = require("util");
|
|
27167
27198
|
var import_node_crypto8 = require("crypto");
|
|
27168
|
-
var
|
|
27199
|
+
var fs45 = __toESM(require("fs"));
|
|
27169
27200
|
var path56 = __toESM(require("path"));
|
|
27170
27201
|
var import_picocolors12 = __toESM(require("picocolors"));
|
|
27171
27202
|
var dnsResolveP = (0, import_node_util5.promisify)(import_node_dns.resolve);
|
|
@@ -27224,11 +27255,11 @@ async function checkHealth(apiBase2) {
|
|
|
27224
27255
|
function checkConfigDir() {
|
|
27225
27256
|
const dir = path56.join(require("os").homedir(), ".codeam");
|
|
27226
27257
|
try {
|
|
27227
|
-
|
|
27258
|
+
fs45.mkdirSync(dir, { recursive: true, mode: 448 });
|
|
27228
27259
|
const probe = path56.join(dir, ".doctor-probe");
|
|
27229
|
-
|
|
27230
|
-
const read =
|
|
27231
|
-
|
|
27260
|
+
fs45.writeFileSync(probe, "ok", { mode: 384 });
|
|
27261
|
+
const read = fs45.readFileSync(probe, "utf8");
|
|
27262
|
+
fs45.unlinkSync(probe);
|
|
27232
27263
|
if (read !== "ok") throw new Error("write/read round-trip mismatch");
|
|
27233
27264
|
return {
|
|
27234
27265
|
id: "config-dir",
|
|
@@ -27334,7 +27365,7 @@ function checkChokidar() {
|
|
|
27334
27365
|
}
|
|
27335
27366
|
async function doctor(args2 = []) {
|
|
27336
27367
|
const json = args2.includes("--json");
|
|
27337
|
-
const cliVersion = true ? "2.39.
|
|
27368
|
+
const cliVersion = true ? "2.39.44" : "0.0.0-dev";
|
|
27338
27369
|
const apiBase2 = resolveApiBaseUrl();
|
|
27339
27370
|
const diagnosticId = (0, import_node_crypto8.randomUUID)();
|
|
27340
27371
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -27533,7 +27564,7 @@ async function completion(args2) {
|
|
|
27533
27564
|
// src/commands/version.ts
|
|
27534
27565
|
var import_picocolors13 = __toESM(require("picocolors"));
|
|
27535
27566
|
function version2() {
|
|
27536
|
-
const v = true ? "2.39.
|
|
27567
|
+
const v = true ? "2.39.44" : "unknown";
|
|
27537
27568
|
console.log(`${import_picocolors13.default.bold("codeam-cli")} ${import_picocolors13.default.cyan(v)}`);
|
|
27538
27569
|
}
|
|
27539
27570
|
|
|
@@ -27661,7 +27692,7 @@ function tryShowSubcommandHelp(cmd, args2) {
|
|
|
27661
27692
|
var _subcommandHelpKeys = Object.keys(HELPS);
|
|
27662
27693
|
|
|
27663
27694
|
// src/lib/updateNotifier.ts
|
|
27664
|
-
var
|
|
27695
|
+
var fs46 = __toESM(require("fs"));
|
|
27665
27696
|
var os37 = __toESM(require("os"));
|
|
27666
27697
|
var path57 = __toESM(require("path"));
|
|
27667
27698
|
var https8 = __toESM(require("https"));
|
|
@@ -27677,7 +27708,7 @@ function cachePath() {
|
|
|
27677
27708
|
}
|
|
27678
27709
|
function readCache() {
|
|
27679
27710
|
try {
|
|
27680
|
-
const raw =
|
|
27711
|
+
const raw = fs46.readFileSync(cachePath(), "utf8");
|
|
27681
27712
|
const parsed = JSON.parse(raw);
|
|
27682
27713
|
if (typeof parsed.fetchedAt !== "number" || typeof parsed.latest !== "string") return null;
|
|
27683
27714
|
return parsed;
|
|
@@ -27688,10 +27719,10 @@ function readCache() {
|
|
|
27688
27719
|
function writeCache(cache) {
|
|
27689
27720
|
try {
|
|
27690
27721
|
const file = cachePath();
|
|
27691
|
-
|
|
27722
|
+
fs46.mkdirSync(path57.dirname(file), { recursive: true });
|
|
27692
27723
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
27693
|
-
|
|
27694
|
-
|
|
27724
|
+
fs46.writeFileSync(tmp, JSON.stringify(cache));
|
|
27725
|
+
fs46.renameSync(tmp, file);
|
|
27695
27726
|
} catch {
|
|
27696
27727
|
}
|
|
27697
27728
|
}
|
|
@@ -27766,7 +27797,7 @@ function isLinkedInstall() {
|
|
|
27766
27797
|
}).trim();
|
|
27767
27798
|
if (!root) return false;
|
|
27768
27799
|
const pkgPath = path57.join(root, PKG_NAME);
|
|
27769
|
-
return
|
|
27800
|
+
return fs46.lstatSync(pkgPath).isSymbolicLink();
|
|
27770
27801
|
} catch {
|
|
27771
27802
|
return false;
|
|
27772
27803
|
}
|
|
@@ -27802,7 +27833,7 @@ function maybeAutoUpdate(currentVersion, latest) {
|
|
|
27802
27833
|
return;
|
|
27803
27834
|
}
|
|
27804
27835
|
try {
|
|
27805
|
-
|
|
27836
|
+
fs46.unlinkSync(cachePath());
|
|
27806
27837
|
} catch {
|
|
27807
27838
|
}
|
|
27808
27839
|
process.stderr.write(` ${import_picocolors16.default.green("\u2713")} Updated. Resuming session...
|
|
@@ -27819,7 +27850,7 @@ function checkForUpdates() {
|
|
|
27819
27850
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
27820
27851
|
if (process.env.CI) return;
|
|
27821
27852
|
if (!process.stdout.isTTY) return;
|
|
27822
|
-
const current = true ? "2.39.
|
|
27853
|
+
const current = true ? "2.39.44" : null;
|
|
27823
27854
|
if (!current) return;
|
|
27824
27855
|
const cache = readCache();
|
|
27825
27856
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.39.
|
|
3
|
+
"version": "2.39.44",
|
|
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",
|