codeam-cli 2.61.11 → 2.61.13

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