codeam-cli 2.61.11 → 2.61.14
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 +16 -0
- package/dist/index.js +94 -11
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ 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.13] — 2026-07-17
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **shared:** Add figma integration (read-only, figma-developer-mcp@0.13.2)
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **cli:** Complete RemoteCommand literal in resume-session test (typecheck gate)
|
|
16
|
+
|
|
17
|
+
## [2.61.11] — 2026-07-16
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- **cli:** Periodic 12h re-baseline so an idle session's conversation outlives the backend TTL
|
|
22
|
+
|
|
7
23
|
## [2.61.10] — 2026-07-16
|
|
8
24
|
|
|
9
25
|
### Fixed
|
package/dist/index.js
CHANGED
|
@@ -742,6 +742,48 @@ var INTEGRATION_REGISTRY = {
|
|
|
742
742
|
staticEnv: { AZURE_DEVOPS_AUTH_METHOD: "pat" }
|
|
743
743
|
}
|
|
744
744
|
}
|
|
745
|
+
},
|
|
746
|
+
figma: {
|
|
747
|
+
id: "figma",
|
|
748
|
+
name: "Figma",
|
|
749
|
+
icon: "figma",
|
|
750
|
+
// DARK — pending Figma's OAuth-app review approval (submitted 2026-07-16).
|
|
751
|
+
// Figma OAuth apps do NOT exist publicly until review passes (authorize URL
|
|
752
|
+
// errors "OAuth app ... doesn't exist"). Backend provider + secrets are
|
|
753
|
+
// already deployed; flip to true once approved (bead codeagent-m4ix).
|
|
754
|
+
enabled: false,
|
|
755
|
+
auth: {
|
|
756
|
+
kind: "oauth_redirect",
|
|
757
|
+
// Granular READ-ONLY scopes (legacy `files:read` is deprecated for
|
|
758
|
+
// OAuth). Asset export (GET /v1/images) rides file_content:read.
|
|
759
|
+
// file_variables:read is Enterprise-only and would break linking for
|
|
760
|
+
// normal accounts — deliberately excluded. ⚠️ Changing these requires
|
|
761
|
+
// the user to RE-LINK Figma.
|
|
762
|
+
scopes: [
|
|
763
|
+
"current_user:read",
|
|
764
|
+
"file_content:read",
|
|
765
|
+
"file_metadata:read",
|
|
766
|
+
"file_dev_resources:read",
|
|
767
|
+
"library_content:read"
|
|
768
|
+
]
|
|
769
|
+
},
|
|
770
|
+
delivery: {
|
|
771
|
+
mcp: {
|
|
772
|
+
// Framelink figma-developer-mcp (Node, stdio) in BYO-token headless
|
|
773
|
+
// mode — the ONLY known Figma MCP server that accepts an OAuth
|
|
774
|
+
// Bearer token: FIGMA_OAUTH_TOKEN → `Authorization: Bearer` (env
|
|
775
|
+
// only, never argv). Figma's official servers can't be used here
|
|
776
|
+
// (remote = interactive OAuth + client allowlist; Dev Mode =
|
|
777
|
+
// desktop app). Version PINNED; bump only after re-verifying
|
|
778
|
+
// headless. Tools: get_figma_data (condensed layout extraction) +
|
|
779
|
+
// download_figma_images (asset export).
|
|
780
|
+
command: "npx",
|
|
781
|
+
args: ["-y", "figma-developer-mcp@0.13.2", "--stdio", "--no-telemetry"],
|
|
782
|
+
envMapping: {
|
|
783
|
+
FIGMA_OAUTH_TOKEN: "accessToken"
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
745
787
|
}
|
|
746
788
|
};
|
|
747
789
|
function getIntegration(id) {
|
|
@@ -5975,7 +6017,7 @@ function readAnonId() {
|
|
|
5975
6017
|
}
|
|
5976
6018
|
function superProperties() {
|
|
5977
6019
|
return {
|
|
5978
|
-
cliVersion: true ? "2.61.
|
|
6020
|
+
cliVersion: true ? "2.61.14" : "0.0.0-dev",
|
|
5979
6021
|
nodeVersion: process.version,
|
|
5980
6022
|
platform: process.platform,
|
|
5981
6023
|
arch: process.arch,
|
|
@@ -6156,7 +6198,7 @@ var os4 = __toESM(require("os"));
|
|
|
6156
6198
|
// package.json
|
|
6157
6199
|
var package_default = {
|
|
6158
6200
|
name: "codeam-cli",
|
|
6159
|
-
version: "2.61.
|
|
6201
|
+
version: "2.61.14",
|
|
6160
6202
|
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.",
|
|
6161
6203
|
type: "commonjs",
|
|
6162
6204
|
main: "dist/index.js",
|
|
@@ -7299,7 +7341,7 @@ var CommandRelayService = class _CommandRelayService {
|
|
|
7299
7341
|
// fresh + clear the "CLI update available" banner after a self-update
|
|
7300
7342
|
// (a codespace that reinstalls @latest reconnects via heartbeat, not
|
|
7301
7343
|
// pair/reconnect). Older backends ignore the extra field.
|
|
7302
|
-
..."2.61.
|
|
7344
|
+
..."2.61.14" ? { ideVersion: "2.61.14" } : {}
|
|
7303
7345
|
}).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
|
|
7304
7346
|
}
|
|
7305
7347
|
/**
|
|
@@ -17900,7 +17942,7 @@ async function autoUpgradeBeforeCriticalCommand() {
|
|
|
17900
17942
|
if (process.env.NODE_ENV === "test") return;
|
|
17901
17943
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17902
17944
|
if (process.env.CI) return;
|
|
17903
|
-
const current = true ? "2.61.
|
|
17945
|
+
const current = true ? "2.61.14" : null;
|
|
17904
17946
|
if (!current) return;
|
|
17905
17947
|
const cache = readCache();
|
|
17906
17948
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -17917,7 +17959,7 @@ function checkForUpdates() {
|
|
|
17917
17959
|
if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
|
|
17918
17960
|
if (process.env.CI) return;
|
|
17919
17961
|
if (!process.stdout.isTTY) return;
|
|
17920
|
-
const current = true ? "2.61.
|
|
17962
|
+
const current = true ? "2.61.14" : null;
|
|
17921
17963
|
if (!current) return;
|
|
17922
17964
|
const cache = readCache();
|
|
17923
17965
|
const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
|
|
@@ -17937,7 +17979,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
|
17937
17979
|
var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
|
|
17938
17980
|
var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
|
|
17939
17981
|
function currentCliVersion() {
|
|
17940
|
-
return true ? "2.61.
|
|
17982
|
+
return true ? "2.61.14" : null;
|
|
17941
17983
|
}
|
|
17942
17984
|
function runCmd(cmd, args2, timeoutMs) {
|
|
17943
17985
|
return new Promise((resolve8) => {
|
|
@@ -31807,6 +31849,23 @@ async function resumeSessionH(ctx) {
|
|
|
31807
31849
|
}
|
|
31808
31850
|
try {
|
|
31809
31851
|
await client3.loadSession(id);
|
|
31852
|
+
ctx.history.switchActiveSession(id);
|
|
31853
|
+
ctx.onActiveSessionChanged?.(id);
|
|
31854
|
+
try {
|
|
31855
|
+
await ctx.jsonlHistory.uploadConversationIfChanged(id);
|
|
31856
|
+
} catch (err) {
|
|
31857
|
+
log.warn("acpRunner", `resume_session: transcript upload failed: ${describeError(err)}`);
|
|
31858
|
+
}
|
|
31859
|
+
void (async () => {
|
|
31860
|
+
try {
|
|
31861
|
+
const listed = await client3.listSessions();
|
|
31862
|
+
if (listed && listed.length > 0) {
|
|
31863
|
+
await ctx.publisher.pushSessionList({ agentId: opts.agent, sessions: listed });
|
|
31864
|
+
}
|
|
31865
|
+
} catch (err) {
|
|
31866
|
+
log.warn("acpRunner", `resume_session: list push failed: ${describeError(err)}`);
|
|
31867
|
+
}
|
|
31868
|
+
})();
|
|
31810
31869
|
await relay.sendResult(cmd.id, "completed", { sessionId: id });
|
|
31811
31870
|
} catch (err) {
|
|
31812
31871
|
log.warn("acpRunner", `resume_session failed: ${describeError(err)}`);
|
|
@@ -32360,6 +32419,21 @@ var AcpHistory = class {
|
|
|
32360
32419
|
opts;
|
|
32361
32420
|
messages = [];
|
|
32362
32421
|
summary = null;
|
|
32422
|
+
/**
|
|
32423
|
+
* Switch the active conversation after a `resume_session` loadSession
|
|
32424
|
+
* (2026-07-16 "conversation never loads on resume" fix). The buffered
|
|
32425
|
+
* turns belong to the PREVIOUS conversation — flushing them under the
|
|
32426
|
+
* new id would corrupt it — so the buffer and summary reset; the loaded
|
|
32427
|
+
* conversation's real history lives in its JSONL, which the resume
|
|
32428
|
+
* handler uploads via HistoryService. Future turn flushes then push
|
|
32429
|
+
* under the new id.
|
|
32430
|
+
*/
|
|
32431
|
+
switchActiveSession(id) {
|
|
32432
|
+
if (id === this.opts.acpSessionId) return;
|
|
32433
|
+
this.opts.acpSessionId = id;
|
|
32434
|
+
this.messages.length = 0;
|
|
32435
|
+
this.summary = null;
|
|
32436
|
+
}
|
|
32363
32437
|
appendUserPrompt(text) {
|
|
32364
32438
|
if (this.summary === null) {
|
|
32365
32439
|
const trimmed = text.trim().replace(/\s+/g, " ");
|
|
@@ -32745,7 +32819,15 @@ async function runAcpSession(opts) {
|
|
|
32745
32819
|
budgetRecovery,
|
|
32746
32820
|
{ get: () => _budgetReachedPosted, set: (v) => {
|
|
32747
32821
|
_budgetReachedPosted = v;
|
|
32748
|
-
} }
|
|
32822
|
+
} },
|
|
32823
|
+
// resume_session re-points the runner's active conversation: the
|
|
32824
|
+
// relay callback reads `acpSessionId` per command, so every FUTURE
|
|
32825
|
+
// get_conversation / upload / one-shot serves the RESUMED id — not
|
|
32826
|
+
// the boot-time one (2026-07-16 "resume loads the old/blank
|
|
32827
|
+
// conversation" fix).
|
|
32828
|
+
(id) => {
|
|
32829
|
+
acpSessionId = id;
|
|
32830
|
+
}
|
|
32749
32831
|
);
|
|
32750
32832
|
},
|
|
32751
32833
|
{ id: opts.agent, name: opts.agent, displayName: opts.agent }
|
|
@@ -32780,7 +32862,7 @@ async function runAcpSession(opts) {
|
|
|
32780
32862
|
await new Promise(() => {
|
|
32781
32863
|
});
|
|
32782
32864
|
}
|
|
32783
|
-
async function handleCommand(cmd, client3, relay, acpSessionId, models, streaming, opts, history, jsonlHistory, agentCaps, turnFiles, getBeads, publisher, recentStderr, budgetRecovery, budgetReachedFlag) {
|
|
32865
|
+
async function handleCommand(cmd, client3, relay, acpSessionId, models, streaming, opts, history, jsonlHistory, agentCaps, turnFiles, getBeads, publisher, recentStderr, budgetRecovery, budgetReachedFlag, onActiveSessionChanged) {
|
|
32784
32866
|
const session = {
|
|
32785
32867
|
client: client3,
|
|
32786
32868
|
relay,
|
|
@@ -32796,7 +32878,8 @@ async function handleCommand(cmd, client3, relay, acpSessionId, models, streamin
|
|
|
32796
32878
|
publisher,
|
|
32797
32879
|
recentStderr,
|
|
32798
32880
|
budgetRecovery,
|
|
32799
|
-
budgetReachedFlag
|
|
32881
|
+
budgetReachedFlag,
|
|
32882
|
+
onActiveSessionChanged
|
|
32800
32883
|
};
|
|
32801
32884
|
await dispatchAcpCommand(assembleAcpCommandContext(session, cmd));
|
|
32802
32885
|
}
|
|
@@ -37455,7 +37538,7 @@ function checkChokidar() {
|
|
|
37455
37538
|
}
|
|
37456
37539
|
async function doctor(args2 = []) {
|
|
37457
37540
|
const json = args2.includes("--json");
|
|
37458
|
-
const cliVersion = true ? "2.61.
|
|
37541
|
+
const cliVersion = true ? "2.61.14" : "0.0.0-dev";
|
|
37459
37542
|
const apiBase2 = resolveApiBaseUrl();
|
|
37460
37543
|
const diagnosticId = (0, import_node_crypto12.randomUUID)();
|
|
37461
37544
|
log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
|
|
@@ -37966,7 +38049,7 @@ async function mcpRun(args2) {
|
|
|
37966
38049
|
// src/commands/version.ts
|
|
37967
38050
|
var import_picocolors15 = __toESM(require("picocolors"));
|
|
37968
38051
|
function version2() {
|
|
37969
|
-
const v = true ? "2.61.
|
|
38052
|
+
const v = true ? "2.61.14" : "unknown";
|
|
37970
38053
|
console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
|
|
37971
38054
|
}
|
|
37972
38055
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeam-cli",
|
|
3
|
-
"version": "2.61.
|
|
3
|
+
"version": "2.61.14",
|
|
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",
|