codeam-cli 2.61.78 → 2.61.80
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 +13 -0
- package/dist/index.js +89 -26
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,19 @@ 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.61.79] — 2026-07-31
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **shared:** Convex uses the api_key (deploy key) rail, not OAuth
|
|
12
|
+
|
|
13
|
+
## [2.61.78] — 2026-07-31
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **shared:** Session-tools wire — SESSION_INTEGRATIONS_CHANGED event + repo stack-detect maps
|
|
18
|
+
- **cli:** Session-tools relay — integrations_sync + integrations_detect handlers
|
|
19
|
+
|
|
7
20
|
## [2.61.77] — 2026-07-31
|
|
8
21
|
|
|
9
22
|
### Added
|
package/dist/index.js
CHANGED
|
@@ -1521,28 +1521,34 @@ var INTEGRATION_REGISTRY = {
|
|
|
1521
1521
|
name: "Convex",
|
|
1522
1522
|
icon: "convex",
|
|
1523
1523
|
category: "database",
|
|
1524
|
-
// LIVE —
|
|
1525
|
-
//
|
|
1526
|
-
//
|
|
1527
|
-
//
|
|
1528
|
-
//
|
|
1529
|
-
//
|
|
1530
|
-
//
|
|
1531
|
-
//
|
|
1532
|
-
//
|
|
1524
|
+
// LIVE — api_key rail (the user pastes a Convex DEPLOY KEY).
|
|
1525
|
+
// ⚠️ Convex's OAuth application token was tried first and DOES NOT WORK with
|
|
1526
|
+
// the MCP: it's a narrow Management-API credential — verified live it fails
|
|
1527
|
+
// `convex mcp start` as BOTH CONVEX_DEPLOY_KEY and CONVEX_OVERRIDE_ACCESS_TOKEN,
|
|
1528
|
+
// and can't even enumerate the team's deployments ("requires a Personal
|
|
1529
|
+
// Access Token"). The Convex MCP's DOCUMENTED headless credential is a
|
|
1530
|
+
// DEPLOY KEY (CONVEX_DEPLOY_KEY=dev:…|… / prod:… / project:…), so the user
|
|
1531
|
+
// pastes one (Convex Dashboard → Project Settings → Deploy Keys), exactly
|
|
1532
|
+
// like Azure DevOps / Datadog / Trello. No OAuth app, no GSM secret.
|
|
1533
1533
|
enabled: true,
|
|
1534
1534
|
auth: {
|
|
1535
|
-
kind: "
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1535
|
+
kind: "api_key",
|
|
1536
|
+
fields: [
|
|
1537
|
+
{
|
|
1538
|
+
key: "accessToken",
|
|
1539
|
+
label: "Convex deploy key",
|
|
1540
|
+
placeholder: "prod:happy-animal-123|eyJ2\u2026",
|
|
1541
|
+
secret: true,
|
|
1542
|
+
help: "Convex Dashboard \u2192 Project Settings \u2192 Deploy Keys \u2192 Generate a deploy key."
|
|
1543
|
+
}
|
|
1544
|
+
]
|
|
1539
1545
|
},
|
|
1540
1546
|
delivery: {
|
|
1541
1547
|
mcp: {
|
|
1542
1548
|
// Convex's OFFICIAL MCP server ships inside the `convex` npm package
|
|
1543
|
-
// (`convex mcp start`). The
|
|
1544
|
-
//
|
|
1545
|
-
//
|
|
1549
|
+
// (`convex mcp start`). The pasted deploy key is fed via CONVEX_DEPLOY_KEY
|
|
1550
|
+
// (env only, never argv) — its documented non-interactive credential.
|
|
1551
|
+
// Version PINNED; bump only after re-verifying headless.
|
|
1546
1552
|
command: "npx",
|
|
1547
1553
|
args: ["-y", "convex@1.42.3", "mcp", "start"],
|
|
1548
1554
|
envMapping: {
|
|
@@ -7358,7 +7364,7 @@ function readAnonId() {
|
|
|
7358
7364
|
}
|
|
7359
7365
|
function superProperties() {
|
|
7360
7366
|
return {
|
|
7361
|
-
cliVersion: true ? "2.61.
|
|
7367
|
+
cliVersion: true ? "2.61.80" : "0.0.0-dev",
|
|
7362
7368
|
nodeVersion: process.version,
|
|
7363
7369
|
platform: process.platform,
|
|
7364
7370
|
arch: process.arch,
|
|
@@ -7539,7 +7545,7 @@ var os4 = __toESM(require("os"));
|
|
|
7539
7545
|
// package.json
|
|
7540
7546
|
var package_default = {
|
|
7541
7547
|
name: "codeam-cli",
|
|
7542
|
-
version: "2.61.
|
|
7548
|
+
version: "2.61.80",
|
|
7543
7549
|
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.",
|
|
7544
7550
|
type: "commonjs",
|
|
7545
7551
|
main: "dist/index.js",
|
|
@@ -8771,7 +8777,7 @@ var CommandRelayService = class _CommandRelayService {
|
|
|
8771
8777
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
8772
8778
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
8773
8779
|
// pair/reconnect). Older backends ignore the extra field.
|
|
8774
|
-
..."2.61.
|
|
8780
|
+
..."2.61.80" ? { ideVersion: "2.61.80" } : {}
|
|
8775
8781
|
}).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
|
|
8776
8782
|
}
|
|
8777
8783
|
/**
|
|
@@ -19885,7 +19891,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
19885
19891
|
if (process.env.NODE_ENV === "test") return;
|
|
19886
19892
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
19887
19893
|
if (process.env.CI) return;
|
|
19888
|
-
const current = true ? "2.61.
|
|
19894
|
+
const current = true ? "2.61.80" : null;
|
|
19889
19895
|
if (!current) return;
|
|
19890
19896
|
const cache = readCache();
|
|
19891
19897
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -19902,7 +19908,7 @@ function checkForUpdates() {
|
|
|
19902
19908
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
19903
19909
|
if (process.env.CI) return;
|
|
19904
19910
|
if (!process.stdout.isTTY) return;
|
|
19905
|
-
const current = true ? "2.61.
|
|
19911
|
+
const current = true ? "2.61.80" : null;
|
|
19906
19912
|
if (!current) return;
|
|
19907
19913
|
const cache = readCache();
|
|
19908
19914
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -19922,7 +19928,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
|
19922
19928
|
var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
|
|
19923
19929
|
var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
19924
19930
|
function currentCliVersion() {
|
|
19925
|
-
return true ? "2.61.
|
|
19931
|
+
return true ? "2.61.80" : null;
|
|
19926
19932
|
}
|
|
19927
19933
|
function runCmd(cmd, args2, timeoutMs) {
|
|
19928
19934
|
return new Promise((resolve9) => {
|
|
@@ -40620,7 +40626,7 @@ function checkChokidar() {
|
|
|
40620
40626
|
}
|
|
40621
40627
|
async function doctor(args2 = []) {
|
|
40622
40628
|
const json = args2.includes("--json");
|
|
40623
|
-
const cliVersion = true ? "2.61.
|
|
40629
|
+
const cliVersion = true ? "2.61.80" : "0.0.0-dev";
|
|
40624
40630
|
const apiBase2 = resolveApiBaseUrl();
|
|
40625
40631
|
const diagnosticId = (0, import_node_crypto13.randomUUID)();
|
|
40626
40632
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -40877,6 +40883,10 @@ var import_node_child_process31 = require("child_process");
|
|
|
40877
40883
|
var import_node_readline3 = __toESM(require("readline"));
|
|
40878
40884
|
var RESTART_CHECK_INTERVAL_MS = 3e4;
|
|
40879
40885
|
var SIGKILL_ESCALATION_MS = 2e3;
|
|
40886
|
+
var TOOL_CALL_TIMEOUT_MS = (() => {
|
|
40887
|
+
const raw = Number(process.env.CODEAM_MCP_TOOL_TIMEOUT_MS);
|
|
40888
|
+
return Number.isFinite(raw) && raw > 0 ? raw : 12e4;
|
|
40889
|
+
})();
|
|
40880
40890
|
var REPLAY_INIT_ID = "__codeam_replay_init__";
|
|
40881
40891
|
var RestartableStdioProxy = class {
|
|
40882
40892
|
constructor(opts) {
|
|
@@ -40887,12 +40897,16 @@ var RestartableStdioProxy = class {
|
|
|
40887
40897
|
childRl = null;
|
|
40888
40898
|
initializeLine = null;
|
|
40889
40899
|
inflight = /* @__PURE__ */ new Set();
|
|
40900
|
+
/** Per-`tools/call` request-id watchdog timers (see TOOL_CALL_TIMEOUT_MS). */
|
|
40901
|
+
toolTimers = /* @__PURE__ */ new Map();
|
|
40902
|
+
stdout = null;
|
|
40890
40903
|
swapping = false;
|
|
40891
40904
|
pendingClientLines = [];
|
|
40892
40905
|
ended = () => void 0;
|
|
40893
40906
|
async start() {
|
|
40894
40907
|
const stdin = this.opts.stdin ?? process.stdin;
|
|
40895
40908
|
const stdout = this.opts.stdout ?? process.stdout;
|
|
40909
|
+
this.stdout = stdout;
|
|
40896
40910
|
await this.spawnChild(stdout);
|
|
40897
40911
|
const rl = import_node_readline3.default.createInterface({ input: stdin, crlfDelay: Infinity });
|
|
40898
40912
|
rl.on("line", (line) => this.onClientLine(line));
|
|
@@ -40919,9 +40933,15 @@ var RestartableStdioProxy = class {
|
|
|
40919
40933
|
}
|
|
40920
40934
|
if (msg.method === "notifications/cancelled") {
|
|
40921
40935
|
const requestId = msg.params?.requestId;
|
|
40922
|
-
if (requestId !== void 0)
|
|
40936
|
+
if (requestId !== void 0) {
|
|
40937
|
+
this.inflight.delete(requestId);
|
|
40938
|
+
this.clearToolTimeout(requestId);
|
|
40939
|
+
}
|
|
40940
|
+
}
|
|
40941
|
+
if (msg.id !== void 0 && msg.method !== void 0) {
|
|
40942
|
+
this.inflight.add(msg.id);
|
|
40943
|
+
if (msg.method === "tools/call") this.armToolTimeout(msg.id);
|
|
40923
40944
|
}
|
|
40924
|
-
if (msg.id !== void 0 && msg.method !== void 0) this.inflight.add(msg.id);
|
|
40925
40945
|
} catch {
|
|
40926
40946
|
}
|
|
40927
40947
|
this.child?.stdin?.write(line + "\n");
|
|
@@ -40934,12 +40954,54 @@ var RestartableStdioProxy = class {
|
|
|
40934
40954
|
return;
|
|
40935
40955
|
}
|
|
40936
40956
|
this.inflight.delete(msg.id);
|
|
40957
|
+
this.clearToolTimeout(msg.id);
|
|
40937
40958
|
}
|
|
40938
40959
|
} catch {
|
|
40939
40960
|
}
|
|
40940
40961
|
stdout.write(line + "\n");
|
|
40941
40962
|
if (this.inflight.size === 0) this.checkRestart(stdout);
|
|
40942
40963
|
}
|
|
40964
|
+
/**
|
|
40965
|
+
* Arm a per-`tools/call` watchdog. If the server never answers this request
|
|
40966
|
+
* id within {@link TOOL_CALL_TIMEOUT_MS}, synthesize a JSON-RPC error response
|
|
40967
|
+
* to the client so the agent's turn unblocks (clean tool error) instead of
|
|
40968
|
+
* hanging forever with no Stop. Idempotent per id.
|
|
40969
|
+
*/
|
|
40970
|
+
armToolTimeout(id) {
|
|
40971
|
+
const existing = this.toolTimers.get(id);
|
|
40972
|
+
if (existing) clearTimeout(existing);
|
|
40973
|
+
const t2 = setTimeout(() => {
|
|
40974
|
+
this.toolTimers.delete(id);
|
|
40975
|
+
if (!this.inflight.has(id)) return;
|
|
40976
|
+
this.inflight.delete(id);
|
|
40977
|
+
process.stderr.write(
|
|
40978
|
+
`[codeam mcp-run] tools/call id=${String(id)} timed out after ${TOOL_CALL_TIMEOUT_MS}ms \u2014 server did not respond; failing the call so the turn can proceed
|
|
40979
|
+
`
|
|
40980
|
+
);
|
|
40981
|
+
const errResponse = {
|
|
40982
|
+
jsonrpc: "2.0",
|
|
40983
|
+
id,
|
|
40984
|
+
error: {
|
|
40985
|
+
code: -32001,
|
|
40986
|
+
message: `MCP tool call timed out after ${Math.round(TOOL_CALL_TIMEOUT_MS / 1e3)}s \u2014 the server did not respond. The target service/deployment may be unreachable (e.g. a Convex dev deployment is only reachable while \`convex dev\` is running \u2014 use a production deploy key or start \`convex dev\`).`
|
|
40987
|
+
}
|
|
40988
|
+
};
|
|
40989
|
+
(this.stdout ?? process.stdout).write(JSON.stringify(errResponse) + "\n");
|
|
40990
|
+
}, TOOL_CALL_TIMEOUT_MS);
|
|
40991
|
+
t2.unref();
|
|
40992
|
+
this.toolTimers.set(id, t2);
|
|
40993
|
+
}
|
|
40994
|
+
clearToolTimeout(id) {
|
|
40995
|
+
const t2 = this.toolTimers.get(id);
|
|
40996
|
+
if (t2) {
|
|
40997
|
+
clearTimeout(t2);
|
|
40998
|
+
this.toolTimers.delete(id);
|
|
40999
|
+
}
|
|
41000
|
+
}
|
|
41001
|
+
clearAllToolTimeouts() {
|
|
41002
|
+
for (const t2 of this.toolTimers.values()) clearTimeout(t2);
|
|
41003
|
+
this.toolTimers.clear();
|
|
41004
|
+
}
|
|
40943
41005
|
/**
|
|
40944
41006
|
* Failsafe wrapper for the fire-and-forget call sites (post-response check
|
|
40945
41007
|
* + the 30 s timer): `maybeRestart` handles the token-fetch failure itself,
|
|
@@ -41010,6 +41072,7 @@ var RestartableStdioProxy = class {
|
|
|
41010
41072
|
});
|
|
41011
41073
|
child.on("exit", (code) => {
|
|
41012
41074
|
if (child !== this.child) return;
|
|
41075
|
+
this.clearAllToolTimeouts();
|
|
41013
41076
|
this.ended(code ?? 1);
|
|
41014
41077
|
});
|
|
41015
41078
|
}
|
|
@@ -41142,7 +41205,7 @@ async function mcpRun(args2) {
|
|
|
41142
41205
|
// src/commands/version.ts
|
|
41143
41206
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
41144
41207
|
function version2() {
|
|
41145
|
-
const v = true ? "2.61.
|
|
41208
|
+
const v = true ? "2.61.80" : "unknown";
|
|
41146
41209
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
41147
41210
|
}
|
|
41148
41211
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.61.
|
|
3
|
+
"version": "2.61.80",
|
|
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",
|