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 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.11" : "0.0.0-dev",
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.11",
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.11" ? { ideVersion: "2.61.11" } : {}
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.11" : null;
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.11" : null;
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.11" : null;
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.11" : "0.0.0-dev";
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.11" : "unknown";
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.11",
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",