codeam-cli 2.61.14 → 2.61.16

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,18 @@ 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.15] — 2026-07-17
8
+
9
+ ### Added
10
+
11
+ - **shared:** Integration category field + getIntegrationsByCategory
12
+
13
+ ## [2.61.14] — 2026-07-17
14
+
15
+ ### Fixed
16
+
17
+ - **shared:** Dark-launch figma integration pending Figma app review
18
+
7
19
  ## [2.61.13] — 2026-07-17
8
20
 
9
21
  ### Added
package/dist/index.js CHANGED
@@ -485,6 +485,7 @@ var INTEGRATION_REGISTRY = {
485
485
  id: "jira",
486
486
  name: "Atlassian",
487
487
  icon: "jira",
488
+ category: "tracker",
488
489
  enabled: true,
489
490
  auth: {
490
491
  kind: "oauth_redirect",
@@ -524,6 +525,7 @@ var INTEGRATION_REGISTRY = {
524
525
  id: "sentry",
525
526
  name: "Sentry",
526
527
  icon: "sentry",
528
+ category: "observability",
527
529
  // LIVE — the Sentry OAuth Application (Confidential) is registered and
528
530
  // SENTRY_OAUTH_CLIENT_ID/SECRET/REDIRECT_URI are in Secret Manager
529
531
  // (prod+dev). The backend SentryOAuthProvider is config-gated (503 if
@@ -577,6 +579,7 @@ var INTEGRATION_REGISTRY = {
577
579
  id: "linear",
578
580
  name: "Linear",
579
581
  icon: "linear",
582
+ category: "tracker",
580
583
  // LIVE — the Linear OAuth Application (Public + Confidential) is registered
581
584
  // and LINEAR_OAUTH_CLIENT_ID/SECRET/REDIRECT_URI are in Secret Manager
582
585
  // (prod+dev). The backend LinearOAuthProvider is config-gated (503 if env
@@ -614,6 +617,7 @@ var INTEGRATION_REGISTRY = {
614
617
  id: "slack",
615
618
  name: "Slack",
616
619
  icon: "slack",
620
+ category: "comms",
617
621
  // LIVE — the Slack app (OAuth v2, USER token — the agent acts AS THE USER)
618
622
  // is registered and
619
623
  // SLACK_OAUTH_CLIENT_ID/SECRET/REDIRECT_URI are in Secret Manager
@@ -668,6 +672,7 @@ var INTEGRATION_REGISTRY = {
668
672
  id: "notion",
669
673
  name: "Notion",
670
674
  icon: "notion",
675
+ category: "docs",
671
676
  // LIVE — the Notion public OAuth integration is registered and
672
677
  // NOTION_OAUTH_CLIENT_ID/SECRET/REDIRECT_URI are in Secret Manager
673
678
  // (prod+dev). The backend NotionOAuthProvider is config-gated (503 if env
@@ -700,6 +705,7 @@ var INTEGRATION_REGISTRY = {
700
705
  id: "azure_devops",
701
706
  name: "Azure DevOps",
702
707
  icon: "azure_devops",
708
+ category: "tracker",
703
709
  // LIVE — the FIRST api_key (PAT) integration. No OAuth: Azure DevOps OAuth
704
710
  // apps are being sunset by Microsoft in favor of Entra ID, and PATs are the
705
711
  // native, reliable ADO auth. The user pastes their org URL + a PAT; the
@@ -747,6 +753,7 @@ var INTEGRATION_REGISTRY = {
747
753
  id: "figma",
748
754
  name: "Figma",
749
755
  icon: "figma",
756
+ category: "design",
750
757
  // DARK — pending Figma's OAuth-app review approval (submitted 2026-07-16).
751
758
  // Figma OAuth apps do NOT exist publicly until review passes (authorize URL
752
759
  // errors "OAuth app ... doesn't exist"). Backend provider + secrets are
@@ -6017,7 +6024,7 @@ function readAnonId() {
6017
6024
  }
6018
6025
  function superProperties() {
6019
6026
  return {
6020
- cliVersion: true ? "2.61.14" : "0.0.0-dev",
6027
+ cliVersion: true ? "2.61.16" : "0.0.0-dev",
6021
6028
  nodeVersion: process.version,
6022
6029
  platform: process.platform,
6023
6030
  arch: process.arch,
@@ -6198,7 +6205,7 @@ var os4 = __toESM(require("os"));
6198
6205
  // package.json
6199
6206
  var package_default = {
6200
6207
  name: "codeam-cli",
6201
- version: "2.61.14",
6208
+ version: "2.61.16",
6202
6209
  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.",
6203
6210
  type: "commonjs",
6204
6211
  main: "dist/index.js",
@@ -7341,7 +7348,7 @@ var CommandRelayService = class _CommandRelayService {
7341
7348
  // fresh + clear the "CLI update available" banner after a self-update
7342
7349
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
7343
7350
  // pair/reconnect). Older backends ignore the extra field.
7344
- ..."2.61.14" ? { ideVersion: "2.61.14" } : {}
7351
+ ..."2.61.16" ? { ideVersion: "2.61.16" } : {}
7345
7352
  }).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
7346
7353
  }
7347
7354
  /**
@@ -17942,7 +17949,7 @@ async function autoUpgradeBeforeCriticalCommand() {
17942
17949
  if (process.env.NODE_ENV === "test") return;
17943
17950
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
17944
17951
  if (process.env.CI) return;
17945
- const current = true ? "2.61.14" : null;
17952
+ const current = true ? "2.61.16" : null;
17946
17953
  if (!current) return;
17947
17954
  const cache = readCache();
17948
17955
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -17959,7 +17966,7 @@ function checkForUpdates() {
17959
17966
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
17960
17967
  if (process.env.CI) return;
17961
17968
  if (!process.stdout.isTTY) return;
17962
- const current = true ? "2.61.14" : null;
17969
+ const current = true ? "2.61.16" : null;
17963
17970
  if (!current) return;
17964
17971
  const cache = readCache();
17965
17972
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -17979,7 +17986,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
17979
17986
  var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
17980
17987
  var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
17981
17988
  function currentCliVersion() {
17982
- return true ? "2.61.14" : null;
17989
+ return true ? "2.61.16" : null;
17983
17990
  }
17984
17991
  function runCmd(cmd, args2, timeoutMs) {
17985
17992
  return new Promise((resolve8) => {
@@ -24483,12 +24490,35 @@ var REGISTRY = {
24483
24490
  }
24484
24491
  })
24485
24492
  };
24493
+ var resolvedAdapterCache = /* @__PURE__ */ new Map();
24486
24494
  function getAcpAdapter(agent) {
24495
+ const cached2 = resolvedAdapterCache.get(agent);
24496
+ if (cached2) return cached2;
24487
24497
  const factory = REGISTRY[agent];
24488
- return factory ? factory() : null;
24498
+ if (!factory) return null;
24499
+ const spec = factory();
24500
+ if (spec) resolvedAdapterCache.set(agent, spec);
24501
+ return spec;
24489
24502
  }
24490
24503
  function requiresAcp(agent) {
24491
- return getAcpAdapter(agent) !== null;
24504
+ return Object.prototype.hasOwnProperty.call(REGISTRY, agent);
24505
+ }
24506
+ var DEFAULT_ADAPTER_RETRY_TIMEOUT_MS = 8e3;
24507
+ var DEFAULT_ADAPTER_RETRY_POLL_MS = 750;
24508
+ async function resolveAcpAdapterWithRetry(agent, opts = {}) {
24509
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_ADAPTER_RETRY_TIMEOUT_MS;
24510
+ const pollMs = opts.pollMs ?? DEFAULT_ADAPTER_RETRY_POLL_MS;
24511
+ const now = opts.now ?? Date.now;
24512
+ const sleep5 = opts.sleep ?? ((ms) => new Promise((resolve8) => setTimeout(resolve8, ms)));
24513
+ let spec = getAcpAdapter(agent);
24514
+ if (spec) return spec;
24515
+ const deadline = now() + timeoutMs;
24516
+ while (now() < deadline) {
24517
+ await sleep5(pollMs);
24518
+ spec = getAcpAdapter(agent);
24519
+ if (spec) return spec;
24520
+ }
24521
+ return null;
24492
24522
  }
24493
24523
 
24494
24524
  // src/agents/acp/runner.ts
@@ -34791,8 +34821,35 @@ async function start(requestedAgent) {
34791
34821
  }
34792
34822
  }
34793
34823
  if (requiresAcp(session.agent)) {
34794
- const adapter = getAcpAdapter(session.agent);
34795
- if (!adapter || !session.pluginAuthToken) {
34824
+ let adapter = getAcpAdapter(session.agent);
34825
+ if (!adapter) {
34826
+ adapter = await resolveAcpAdapterWithRetry(session.agent);
34827
+ }
34828
+ if (!adapter) {
34829
+ log.error(
34830
+ "acp",
34831
+ `[acp] REQUIRED adapter unresolvable \u2014 refusing PTY downgrade (agent=${session.agent})`
34832
+ );
34833
+ const failureMsg = `${AGENT_REGISTRY[session.agent].displayName}'s ACP adapter is unavailable \u2014 the session cannot start; redeploy or retry.`;
34834
+ if (session.pluginAuthToken) {
34835
+ await surfaceStartupFailure({
34836
+ agent: session.agent,
34837
+ pluginId,
34838
+ detail: failureMsg,
34839
+ recentStderr: "",
34840
+ publisher: new AcpPublisher({
34841
+ sessionId: session.id,
34842
+ pluginId,
34843
+ pluginAuthToken: session.pluginAuthToken,
34844
+ refreshAuthToken: () => fetchCurrentPluginAuthToken(session.id, pluginId, session.pollSecret)
34845
+ })
34846
+ });
34847
+ return;
34848
+ }
34849
+ showError(failureMsg);
34850
+ process.exit(1);
34851
+ }
34852
+ if (!session.pluginAuthToken) {
34796
34853
  showError(
34797
34854
  `${AGENT_REGISTRY[session.agent].displayName} requires a paired session with an auth token. Re-pair with \`codeam pair\` to continue.`
34798
34855
  );
@@ -34818,6 +34875,9 @@ async function start(requestedAgent) {
34818
34875
  });
34819
34876
  return;
34820
34877
  }
34878
+ if (requiresAcp(session.agent)) {
34879
+ log.error("acp", `[anomaly] acp-required agent on PTY runtime (agent=${session.agent})`);
34880
+ }
34821
34881
  const runtime = createRuntimeStrategy(session.agent);
34822
34882
  const historySvc = new HistoryService(runtime, pluginId, cwd, {
34823
34883
  pluginAuthToken: session.pluginAuthToken
@@ -37538,7 +37598,7 @@ function checkChokidar() {
37538
37598
  }
37539
37599
  async function doctor(args2 = []) {
37540
37600
  const json = args2.includes("--json");
37541
- const cliVersion = true ? "2.61.14" : "0.0.0-dev";
37601
+ const cliVersion = true ? "2.61.16" : "0.0.0-dev";
37542
37602
  const apiBase2 = resolveApiBaseUrl();
37543
37603
  const diagnosticId = (0, import_node_crypto12.randomUUID)();
37544
37604
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -38049,7 +38109,7 @@ async function mcpRun(args2) {
38049
38109
  // src/commands/version.ts
38050
38110
  var import_picocolors15 = __toESM(require("picocolors"));
38051
38111
  function version2() {
38052
- const v = true ? "2.61.14" : "unknown";
38112
+ const v = true ? "2.61.16" : "unknown";
38053
38113
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
38054
38114
  }
38055
38115
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.61.14",
3
+ "version": "2.61.16",
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",