codeam-cli 2.40.2 → 2.41.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.
- package/CHANGELOG.md +10 -0
- package/dist/index.js +76 -10
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,16 @@ 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.40.2] — 2026-06-24
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **cli:** Provision Claude setup-token via CLAUDE_CODE_OAUTH_TOKEN on self-hosted (was malformed .credentials.json → 401)
|
|
12
|
+
|
|
13
|
+
### Merge
|
|
14
|
+
|
|
15
|
+
- Provision Claude setup-token via CLAUDE_CODE_OAUTH_TOKEN on self-hosted
|
|
16
|
+
|
|
7
17
|
## [2.40.1] — 2026-06-24
|
|
8
18
|
|
|
9
19
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -5390,7 +5390,7 @@ function readAnonId() {
|
|
|
5390
5390
|
}
|
|
5391
5391
|
function superProperties() {
|
|
5392
5392
|
return {
|
|
5393
|
-
cliVersion: true ? "2.
|
|
5393
|
+
cliVersion: true ? "2.41.1" : "0.0.0-dev",
|
|
5394
5394
|
nodeVersion: process.version,
|
|
5395
5395
|
platform: process.platform,
|
|
5396
5396
|
arch: process.arch,
|
|
@@ -5549,7 +5549,7 @@ var os4 = __toESM(require("os"));
|
|
|
5549
5549
|
// package.json
|
|
5550
5550
|
var package_default = {
|
|
5551
5551
|
name: "codeam-cli",
|
|
5552
|
-
version: "2.
|
|
5552
|
+
version: "2.41.1",
|
|
5553
5553
|
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.",
|
|
5554
5554
|
type: "commonjs",
|
|
5555
5555
|
main: "dist/index.js",
|
|
@@ -17753,7 +17753,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
17753
17753
|
if (process.env.NODE_ENV === "test") return;
|
|
17754
17754
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17755
17755
|
if (process.env.CI) return;
|
|
17756
|
-
const current = true ? "2.
|
|
17756
|
+
const current = true ? "2.41.1" : null;
|
|
17757
17757
|
if (!current) return;
|
|
17758
17758
|
const cache = readCache();
|
|
17759
17759
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -17770,7 +17770,7 @@ function checkForUpdates() {
|
|
|
17770
17770
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17771
17771
|
if (process.env.CI) return;
|
|
17772
17772
|
if (!process.stdout.isTTY) return;
|
|
17773
|
-
const current = true ? "2.
|
|
17773
|
+
const current = true ? "2.41.1" : null;
|
|
17774
17774
|
if (!current) return;
|
|
17775
17775
|
const cache = readCache();
|
|
17776
17776
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -18208,7 +18208,7 @@ var defaultSpawner = (env, cwd, args2 = []) => (0, import_node_child_process14.s
|
|
|
18208
18208
|
detached: false
|
|
18209
18209
|
});
|
|
18210
18210
|
function currentCliVersion() {
|
|
18211
|
-
return true ? "2.
|
|
18211
|
+
return true ? "2.41.1" : null;
|
|
18212
18212
|
}
|
|
18213
18213
|
function runCmd(cmd, args2, timeoutMs) {
|
|
18214
18214
|
return new Promise((resolve7) => {
|
|
@@ -24619,10 +24619,69 @@ function looksLikeAuthFailure(text) {
|
|
|
24619
24619
|
}
|
|
24620
24620
|
var AUTH_FAILURE_MESSAGE = "\u{1F512} **Authentication failed \u2014 your agent credentials are invalid or expired (API 401).**\n\nTap [Re-authenticate this agent](codeam://reauth) to renew your credentials in Profile \u203A Agents, then send your message again.";
|
|
24621
24621
|
var TURN_FAILURE_MESSAGE = "\u26A0\uFE0F **The agent hit an error and couldn\u2019t finish this turn.** Please send your message again.";
|
|
24622
|
+
var PROVIDER_OUTAGE_RE = /overloaded_error|\boverloaded\b|service[ _]unavailable|temporarily[ _]unavailable|(?:api error|http|status)[:\s]+(?:529|503|502|504)\b|\b(?:529|503|502|504)\b[^\n]{0,40}(?:overload|unavailable|gateway|upstream|server error)|bad gateway|gateway time-?out|upstream (?:error|connect|timeout)/i;
|
|
24623
|
+
function looksLikeProviderOutage(text) {
|
|
24624
|
+
return PROVIDER_OUTAGE_RE.test(text);
|
|
24625
|
+
}
|
|
24626
|
+
function agentStatusPage(agent) {
|
|
24627
|
+
const a = (agent ?? "").toLowerCase();
|
|
24628
|
+
if (a.includes("claude") || a.includes("anthropic"))
|
|
24629
|
+
return {
|
|
24630
|
+
vendor: "Anthropic",
|
|
24631
|
+
url: "https://status.anthropic.com",
|
|
24632
|
+
statusApi: "https://status.anthropic.com/api/v2/status.json"
|
|
24633
|
+
};
|
|
24634
|
+
if (a.includes("codex") || a.includes("openai"))
|
|
24635
|
+
return {
|
|
24636
|
+
vendor: "OpenAI",
|
|
24637
|
+
url: "https://status.openai.com",
|
|
24638
|
+
statusApi: "https://status.openai.com/api/v2/status.json"
|
|
24639
|
+
};
|
|
24640
|
+
if (a.includes("gemini") || a.includes("google"))
|
|
24641
|
+
return { vendor: "Google", url: "https://status.cloud.google.com" };
|
|
24642
|
+
if (a.includes("copilot"))
|
|
24643
|
+
return {
|
|
24644
|
+
vendor: "GitHub",
|
|
24645
|
+
url: "https://www.githubstatus.com",
|
|
24646
|
+
statusApi: "https://www.githubstatus.com/api/v2/status.json"
|
|
24647
|
+
};
|
|
24648
|
+
if (a.includes("cursor"))
|
|
24649
|
+
return {
|
|
24650
|
+
vendor: "Cursor",
|
|
24651
|
+
url: "https://status.cursor.com",
|
|
24652
|
+
statusApi: "https://status.cursor.com/api/v2/status.json"
|
|
24653
|
+
};
|
|
24654
|
+
return null;
|
|
24655
|
+
}
|
|
24656
|
+
async function checkProviderStatus(agent, fetchImpl = fetch) {
|
|
24657
|
+
const info = agentStatusPage(agent);
|
|
24658
|
+
if (!info?.statusApi) return false;
|
|
24659
|
+
try {
|
|
24660
|
+
const res = await withTimeout(fetchImpl(info.statusApi), 4e3);
|
|
24661
|
+
if (!res || !res.ok) return false;
|
|
24662
|
+
const body = await res.json();
|
|
24663
|
+
const indicator = body?.status?.indicator;
|
|
24664
|
+
return typeof indicator === "string" && indicator.toLowerCase() !== "none";
|
|
24665
|
+
} catch {
|
|
24666
|
+
return false;
|
|
24667
|
+
}
|
|
24668
|
+
}
|
|
24669
|
+
function providerOutageMessage(agent) {
|
|
24670
|
+
const info = agentStatusPage(agent);
|
|
24671
|
+
const who = info ? info.vendor : "The agent provider";
|
|
24672
|
+
return `\u{1F310} **${who} is having a service disruption \u2014 this isn\u2019t your session.**
|
|
24673
|
+
|
|
24674
|
+
The agent provider returned an overload/outage error, so this turn couldn\u2019t finish. It usually clears up on its own \u2014 just send your message again in a bit.` + (info ? `
|
|
24675
|
+
|
|
24676
|
+
Follow the status here: [${info.url}](${info.url})` : "");
|
|
24677
|
+
}
|
|
24622
24678
|
function failureBubble(opts) {
|
|
24623
24679
|
if (looksLikeAuthFailure(opts.detail) || looksLikeAuthFailure(opts.recentStderr)) {
|
|
24624
24680
|
return AUTH_FAILURE_MESSAGE;
|
|
24625
24681
|
}
|
|
24682
|
+
if (looksLikeProviderOutage(opts.detail) || looksLikeProviderOutage(opts.recentStderr)) {
|
|
24683
|
+
return providerOutageMessage(opts.agent);
|
|
24684
|
+
}
|
|
24626
24685
|
if (!opts.hadText) return TURN_FAILURE_MESSAGE;
|
|
24627
24686
|
return null;
|
|
24628
24687
|
}
|
|
@@ -24740,6 +24799,7 @@ async function runAcpSession(opts) {
|
|
|
24740
24799
|
onUnexpectedExit: (code, signal) => {
|
|
24741
24800
|
log.warn("acpRunner", `adapter died code=${code} signal=${signal}; shutting down session`);
|
|
24742
24801
|
const authFail = looksLikeAuthFailure(recentStderr.join("\n"));
|
|
24802
|
+
const outageFail = !authFail && looksLikeProviderOutage(recentStderr.join("\n"));
|
|
24743
24803
|
if (authFail) {
|
|
24744
24804
|
void reportCredentialInvalid(opts);
|
|
24745
24805
|
}
|
|
@@ -24749,7 +24809,7 @@ async function runAcpSession(opts) {
|
|
|
24749
24809
|
await streaming.closeAll();
|
|
24750
24810
|
await publisher.publishOutput({
|
|
24751
24811
|
type: "text",
|
|
24752
|
-
content: authFail ? AUTH_FAILURE_MESSAGE : `Agent adapter exited unexpectedly (code=${code ?? "null"} signal=${signal ?? "null"}).`,
|
|
24812
|
+
content: authFail ? AUTH_FAILURE_MESSAGE : outageFail ? providerOutageMessage(opts.agent) : `Agent adapter exited unexpectedly (code=${code ?? "null"} signal=${signal ?? "null"}).`,
|
|
24753
24813
|
done: true
|
|
24754
24814
|
});
|
|
24755
24815
|
})(),
|
|
@@ -24934,11 +24994,17 @@ async function handleCommand(cmd, client2, relay, acpSessionId, models, streamin
|
|
|
24934
24994
|
await recoverFromFailedTurn(client2, streaming);
|
|
24935
24995
|
const detail = describeError(err);
|
|
24936
24996
|
log.warn("acpRunner", `prompt failed: ${detail}`);
|
|
24937
|
-
|
|
24997
|
+
let bubble = failureBubble({
|
|
24938
24998
|
detail,
|
|
24939
24999
|
recentStderr: recentStderr.join("\n"),
|
|
24940
|
-
hadText
|
|
25000
|
+
hadText,
|
|
25001
|
+
agent: opts.agent
|
|
24941
25002
|
});
|
|
25003
|
+
if (bubble !== AUTH_FAILURE_MESSAGE && bubble !== providerOutageMessage(opts.agent)) {
|
|
25004
|
+
if (await checkProviderStatus(opts.agent)) {
|
|
25005
|
+
bubble = providerOutageMessage(opts.agent);
|
|
25006
|
+
}
|
|
25007
|
+
}
|
|
24942
25008
|
if (bubble) {
|
|
24943
25009
|
await publisher.publishOutput({ type: "text", content: bubble, done: true });
|
|
24944
25010
|
history.appendAgentReply(bubble);
|
|
@@ -29096,7 +29162,7 @@ function checkChokidar() {
|
|
|
29096
29162
|
}
|
|
29097
29163
|
async function doctor(args2 = []) {
|
|
29098
29164
|
const json = args2.includes("--json");
|
|
29099
|
-
const cliVersion = true ? "2.
|
|
29165
|
+
const cliVersion = true ? "2.41.1" : "0.0.0-dev";
|
|
29100
29166
|
const apiBase2 = resolveApiBaseUrl();
|
|
29101
29167
|
const diagnosticId = (0, import_node_crypto8.randomUUID)();
|
|
29102
29168
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -29295,7 +29361,7 @@ async function completion(args2) {
|
|
|
29295
29361
|
// src/commands/version.ts
|
|
29296
29362
|
var import_picocolors14 = __toESM(require("picocolors"));
|
|
29297
29363
|
function version2() {
|
|
29298
|
-
const v = true ? "2.
|
|
29364
|
+
const v = true ? "2.41.1" : "unknown";
|
|
29299
29365
|
console.log(`${import_picocolors14.default.bold("codeam-cli")} ${import_picocolors14.default.cyan(v)}`);
|
|
29300
29366
|
}
|
|
29301
29367
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.41.1",
|
|
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",
|