codeam-cli 2.61.44 → 2.61.45

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.44] — 2026-07-25
8
+
9
+ ### Added
10
+
11
+ - **shared:** Resend integration — api_key (send-only comms), excluded from From-Conversation
12
+
7
13
  ## [2.61.43] — 2026-07-25
8
14
 
9
15
  ### Added
package/dist/index.js CHANGED
@@ -6,6 +6,9 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __getProtoOf = Object.getPrototypeOf;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __esm = (fn, res) => function __init() {
10
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
11
+ };
9
12
  var __commonJS = (cb, mod) => function __require() {
10
13
  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
11
14
  };
@@ -86,6 +89,67 @@ var require_src = __commonJS({
86
89
  }
87
90
  });
88
91
 
92
+ // src/integrations/http-relay.ts
93
+ var http_relay_exports = {};
94
+ __export(http_relay_exports, {
95
+ buildHttpHeaders: () => buildHttpHeaders,
96
+ runHttpRelay: () => runHttpRelay
97
+ });
98
+ function buildHttpHeaders(httpHeaders, token) {
99
+ const headers = {};
100
+ for (const [name, template] of Object.entries(httpHeaders ?? {})) {
101
+ headers[name] = template.replace(/\{(\w+)\}/g, (_m, field) => {
102
+ const v = token[field];
103
+ return typeof v === "string" ? v : "";
104
+ });
105
+ }
106
+ return headers;
107
+ }
108
+ async function runHttpRelay(delivery, client3, id) {
109
+ if (!delivery.httpUrl) throw new Error("runHttpRelay called without delivery.httpUrl");
110
+ const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
111
+ const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
112
+ const token = await client3.getToken(id);
113
+ const httpTransport = new StreamableHTTPClientTransport(new URL(delivery.httpUrl), {
114
+ requestInit: { headers: buildHttpHeaders(delivery.httpHeaders, token) }
115
+ });
116
+ const stdioTransport = new StdioServerTransport();
117
+ await new Promise((resolve8, reject) => {
118
+ let done = false;
119
+ const finish = (err) => {
120
+ if (done) return;
121
+ done = true;
122
+ void httpTransport.close().catch(() => void 0);
123
+ void stdioTransport.close().catch(() => void 0);
124
+ if (err) reject(err);
125
+ else resolve8();
126
+ };
127
+ stdioTransport.onmessage = (msg) => {
128
+ void httpTransport.send(msg).catch((e) => {
129
+ process.stderr.write(`[mcp-run http] send\u2192remote failed: ${String(e)}
130
+ `);
131
+ });
132
+ };
133
+ httpTransport.onmessage = (msg) => {
134
+ void stdioTransport.send(msg).catch(() => void 0);
135
+ };
136
+ stdioTransport.onclose = () => finish();
137
+ httpTransport.onclose = () => finish();
138
+ stdioTransport.onerror = (e) => process.stderr.write(`[mcp-run http] stdio: ${String(e)}
139
+ `);
140
+ httpTransport.onerror = (e) => process.stderr.write(`[mcp-run http] http: ${String(e)}
141
+ `);
142
+ Promise.all([httpTransport.start(), stdioTransport.start()]).catch(
143
+ (e) => finish(e instanceof Error ? e : new Error(String(e)))
144
+ );
145
+ });
146
+ }
147
+ var init_http_relay = __esm({
148
+ "src/integrations/http-relay.ts"() {
149
+ "use strict";
150
+ }
151
+ });
152
+
89
153
  // src/commands/start.ts
90
154
  var import_picocolors4 = __toESM(require("picocolors"));
91
155
 
@@ -854,6 +918,44 @@ var INTEGRATION_REGISTRY = {
854
918
  }
855
919
  }
856
920
  },
921
+ posthog: {
922
+ id: "posthog",
923
+ name: "PostHog",
924
+ icon: "posthog",
925
+ category: "observability",
926
+ // LIVE — api_key: the user pastes a PostHog Personal API Key (phx_…, created
927
+ // with the "MCP Server" preset). PostHog's MCP is HOSTED-ONLY
928
+ // (mcp.posthog.com) over HTTP, and its stdio bridge (mcp-remote) forces its
929
+ // own browser OAuth — incompatible with our headless broker. So delivery
930
+ // uses the shim's HTTP transport: it relays to the hosted MCP with the key
931
+ // as a Bearer header (exactly Cursor's {url, headers} config). No OAuth, no
932
+ // GSM secret; a backend VALIDATOR proves the key + vaults it.
933
+ enabled: true,
934
+ auth: {
935
+ kind: "api_key",
936
+ fields: [
937
+ {
938
+ key: "accessToken",
939
+ label: "Personal API Key",
940
+ placeholder: "phx_xxxxxxxxxxxxxxxx",
941
+ secret: true,
942
+ help: 'PostHog \u2192 Settings \u2192 Personal API keys \u2192 create with the "MCP Server" preset (scopes it to a project).'
943
+ }
944
+ ]
945
+ },
946
+ delivery: {
947
+ mcp: {
948
+ // HTTP transport (not a spawned stdio server) — the shim relays to
949
+ // PostHog's hosted MCP with the key as a Bearer header. The key stays
950
+ // server-side of the shim, never on argv.
951
+ command: "",
952
+ args: [],
953
+ envMapping: {},
954
+ httpUrl: "https://mcp.posthog.com/mcp",
955
+ httpHeaders: { Authorization: "Bearer {accessToken}" }
956
+ }
957
+ }
958
+ },
857
959
  notion: {
858
960
  id: "notion",
859
961
  name: "Notion",
@@ -6422,7 +6524,7 @@ function readAnonId() {
6422
6524
  }
6423
6525
  function superProperties() {
6424
6526
  return {
6425
- cliVersion: true ? "2.61.44" : "0.0.0-dev",
6527
+ cliVersion: true ? "2.61.45" : "0.0.0-dev",
6426
6528
  nodeVersion: process.version,
6427
6529
  platform: process.platform,
6428
6530
  arch: process.arch,
@@ -6603,7 +6705,7 @@ var os4 = __toESM(require("os"));
6603
6705
  // package.json
6604
6706
  var package_default = {
6605
6707
  name: "codeam-cli",
6606
- version: "2.61.44",
6708
+ version: "2.61.45",
6607
6709
  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.",
6608
6710
  type: "commonjs",
6609
6711
  main: "dist/index.js",
@@ -6679,6 +6781,7 @@ var package_default = {
6679
6781
  "@agentclientprotocol/codex-acp": "1.1.4",
6680
6782
  "@agentclientprotocol/sdk": "1.2.1",
6681
6783
  "@clack/prompts": "^1.2.0",
6784
+ "@modelcontextprotocol/sdk": "1.29.0",
6682
6785
  chokidar: "^3.6.0",
6683
6786
  ignore: "^7.0.6",
6684
6787
  picocolors: "^1.1.0",
@@ -7774,7 +7877,7 @@ var CommandRelayService = class _CommandRelayService {
7774
7877
  // fresh + clear the "CLI update available" banner after a self-update
7775
7878
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
7776
7879
  // pair/reconnect). Older backends ignore the extra field.
7777
- ..."2.61.44" ? { ideVersion: "2.61.44" } : {}
7880
+ ..."2.61.45" ? { ideVersion: "2.61.45" } : {}
7778
7881
  }).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
7779
7882
  }
7780
7883
  /**
@@ -18759,7 +18862,7 @@ async function autoUpgradeBeforeCriticalCommand() {
18759
18862
  if (process.env.NODE_ENV === "test") return;
18760
18863
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
18761
18864
  if (process.env.CI) return;
18762
- const current = true ? "2.61.44" : null;
18865
+ const current = true ? "2.61.45" : null;
18763
18866
  if (!current) return;
18764
18867
  const cache = readCache();
18765
18868
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -18776,7 +18879,7 @@ function checkForUpdates() {
18776
18879
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
18777
18880
  if (process.env.CI) return;
18778
18881
  if (!process.stdout.isTTY) return;
18779
- const current = true ? "2.61.44" : null;
18882
+ const current = true ? "2.61.45" : null;
18780
18883
  if (!current) return;
18781
18884
  const cache = readCache();
18782
18885
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -18796,7 +18899,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
18796
18899
  var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
18797
18900
  var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
18798
18901
  function currentCliVersion() {
18799
- return true ? "2.61.44" : null;
18902
+ return true ? "2.61.45" : null;
18800
18903
  }
18801
18904
  function runCmd(cmd, args2, timeoutMs) {
18802
18905
  return new Promise((resolve8) => {
@@ -38922,7 +39025,7 @@ function checkChokidar() {
38922
39025
  }
38923
39026
  async function doctor(args2 = []) {
38924
39027
  const json = args2.includes("--json");
38925
- const cliVersion = true ? "2.61.44" : "0.0.0-dev";
39028
+ const cliVersion = true ? "2.61.45" : "0.0.0-dev";
38926
39029
  const apiBase2 = resolveApiBaseUrl();
38927
39030
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
38928
39031
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -39406,6 +39509,17 @@ async function mcpRun(args2) {
39406
39509
  `);
39407
39510
  process.exit(1);
39408
39511
  }
39512
+ if (delivery.httpUrl) {
39513
+ const httpClient = new IntegrationTokenClient({
39514
+ sessionId,
39515
+ pluginId,
39516
+ pluginAuthToken,
39517
+ pollSecret: process.env.CODEAM_MCP_POLL_SECRET
39518
+ });
39519
+ const { runHttpRelay: runHttpRelay2 } = await Promise.resolve().then(() => (init_http_relay(), http_relay_exports));
39520
+ await runHttpRelay2(delivery, httpClient, id);
39521
+ return;
39522
+ }
39409
39523
  ensureCommand(delivery.command);
39410
39524
  const launcher = resolveLauncherPath(delivery.command);
39411
39525
  const client3 = new IntegrationTokenClient({
@@ -39433,7 +39547,7 @@ async function mcpRun(args2) {
39433
39547
  // src/commands/version.ts
39434
39548
  var import_picocolors15 = __toESM(require("picocolors"));
39435
39549
  function version2() {
39436
- const v = true ? "2.61.44" : "unknown";
39550
+ const v = true ? "2.61.45" : "unknown";
39437
39551
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
39438
39552
  }
39439
39553
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.61.44",
3
+ "version": "2.61.45",
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",
@@ -76,6 +76,7 @@
76
76
  "@agentclientprotocol/codex-acp": "1.1.4",
77
77
  "@agentclientprotocol/sdk": "1.2.1",
78
78
  "@clack/prompts": "^1.2.0",
79
+ "@modelcontextprotocol/sdk": "1.29.0",
79
80
  "chokidar": "^3.6.0",
80
81
  "ignore": "^7.0.6",
81
82
  "picocolors": "^1.1.0",