codeam-cli 2.61.45 → 2.61.47

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.
Files changed (3) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/index.js +108 -13
  3. package/package.json +1 -1
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.46] — 2026-07-26
8
+
9
+ ### Added
10
+
11
+ - **shared,cli:** Datadog integration + httpUrl templating (2 keys + regional site)
12
+
13
+ ## [2.61.45] — 2026-07-26
14
+
15
+ ### Added
16
+
17
+ - **shared,cli:** PostHog integration + mcp-shim HTTP transport
18
+
7
19
  ## [2.61.44] — 2026-07-25
8
20
 
9
21
  ### Added
package/dist/index.js CHANGED
@@ -93,15 +93,19 @@ var require_src = __commonJS({
93
93
  var http_relay_exports = {};
94
94
  __export(http_relay_exports, {
95
95
  buildHttpHeaders: () => buildHttpHeaders,
96
+ fillTemplate: () => fillTemplate,
96
97
  runHttpRelay: () => runHttpRelay
97
98
  });
99
+ function fillTemplate(template, token) {
100
+ return template.replace(/\{(\w+)\}/g, (_m, field) => {
101
+ const v = token[field];
102
+ return typeof v === "string" ? v : "";
103
+ });
104
+ }
98
105
  function buildHttpHeaders(httpHeaders, token) {
99
106
  const headers = {};
100
107
  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
- });
108
+ headers[name] = fillTemplate(template, token);
105
109
  }
106
110
  return headers;
107
111
  }
@@ -110,7 +114,8 @@ async function runHttpRelay(delivery, client3, id) {
110
114
  const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
111
115
  const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
112
116
  const token = await client3.getToken(id);
113
- const httpTransport = new StreamableHTTPClientTransport(new URL(delivery.httpUrl), {
117
+ const url2 = new URL(fillTemplate(delivery.httpUrl, token));
118
+ const httpTransport = new StreamableHTTPClientTransport(url2, {
114
119
  requestInit: { headers: buildHttpHeaders(delivery.httpHeaders, token) }
115
120
  });
116
121
  const stdioTransport = new StdioServerTransport();
@@ -956,6 +961,60 @@ var INTEGRATION_REGISTRY = {
956
961
  }
957
962
  }
958
963
  },
964
+ datadog: {
965
+ id: "datadog",
966
+ name: "Datadog",
967
+ icon: "datadog",
968
+ category: "observability",
969
+ // LIVE — api_key: the user pastes a Datadog API key (org-scoped) + an
970
+ // Application key (user-scoped, grants the read scopes) + their regional
971
+ // site. Datadog's OFFICIAL hosted MCP (mcp.<site>) accepts these as headers
972
+ // headless (verified) — no OAuth, no GSM secret. Delivery uses the shim's
973
+ // HTTP transport with the site templated into the URL and both keys sent as
974
+ // DD-API-KEY / DD-APPLICATION-KEY headers.
975
+ enabled: true,
976
+ auth: {
977
+ kind: "api_key",
978
+ fields: [
979
+ {
980
+ key: "accessToken",
981
+ label: "API Key",
982
+ placeholder: "Datadog API key",
983
+ secret: true,
984
+ help: "Organization API key \u2014 Datadog \u2192 Organization Settings \u2192 API Keys."
985
+ },
986
+ {
987
+ key: "appKey",
988
+ label: "Application Key",
989
+ placeholder: "Datadog application key",
990
+ secret: true,
991
+ help: "User Application key (grants the read scopes) \u2014 Datadog \u2192 Organization Settings \u2192 Application Keys."
992
+ },
993
+ {
994
+ key: "host",
995
+ label: "Site",
996
+ placeholder: "datadoghq.com",
997
+ secret: false,
998
+ help: "Your Datadog site \u2014 US1: datadoghq.com \xB7 EU: datadoghq.eu \xB7 US3: us3.datadoghq.com \xB7 US5: us5.datadoghq.com \xB7 AP1: ap1.datadoghq.com."
999
+ }
1000
+ ]
1001
+ },
1002
+ delivery: {
1003
+ mcp: {
1004
+ // HTTP transport — the shim relays to Datadog's hosted MCP for the
1005
+ // user's site, with both keys as headers. Keys stay server-side of the
1006
+ // shim, never on argv.
1007
+ command: "",
1008
+ args: [],
1009
+ envMapping: {},
1010
+ httpUrl: "https://mcp.{host}/api/unstable/mcp-server/mcp",
1011
+ httpHeaders: {
1012
+ "DD-API-KEY": "{accessToken}",
1013
+ "DD-APPLICATION-KEY": "{appKey}"
1014
+ }
1015
+ }
1016
+ }
1017
+ },
959
1018
  notion: {
960
1019
  id: "notion",
961
1020
  name: "Notion",
@@ -1079,6 +1138,42 @@ var INTEGRATION_REGISTRY = {
1079
1138
  }
1080
1139
  }
1081
1140
  }
1141
+ },
1142
+ stitch: {
1143
+ id: "stitch",
1144
+ name: "Stitch",
1145
+ icon: "stitch",
1146
+ category: "design",
1147
+ // LIVE — api_key: the user pastes a Stitch API key (Google Stitch →
1148
+ // Settings → API Key). Stitch's MCP is hosted-only (stitch.googleapis.com)
1149
+ // and accepts the key as the `X-Goog-Api-Key` header headless (verified) —
1150
+ // no OAuth, no GSM secret. Delivery uses the shim's HTTP transport.
1151
+ // (Stitch ALSO supports Google OAuth 2.0, but that's a follow-up — our model
1152
+ // is one auth kind per integration and api_key is the simple, headless path.)
1153
+ enabled: true,
1154
+ auth: {
1155
+ kind: "api_key",
1156
+ fields: [
1157
+ {
1158
+ key: "accessToken",
1159
+ label: "API Key",
1160
+ placeholder: "Stitch API key",
1161
+ secret: true,
1162
+ help: "Google Stitch \u2192 profile menu \u2192 Stitch Settings \u2192 API Key \u2192 Create Key."
1163
+ }
1164
+ ]
1165
+ },
1166
+ delivery: {
1167
+ mcp: {
1168
+ // HTTP transport — the shim relays to Stitch's hosted MCP with the key
1169
+ // as the X-Goog-Api-Key header. Key stays server-side of the shim.
1170
+ command: "",
1171
+ args: [],
1172
+ envMapping: {},
1173
+ httpUrl: "https://stitch.googleapis.com/mcp",
1174
+ httpHeaders: { "X-Goog-Api-Key": "{accessToken}" }
1175
+ }
1176
+ }
1082
1177
  }
1083
1178
  };
1084
1179
  function getIntegration(id) {
@@ -6524,7 +6619,7 @@ function readAnonId() {
6524
6619
  }
6525
6620
  function superProperties() {
6526
6621
  return {
6527
- cliVersion: true ? "2.61.45" : "0.0.0-dev",
6622
+ cliVersion: true ? "2.61.47" : "0.0.0-dev",
6528
6623
  nodeVersion: process.version,
6529
6624
  platform: process.platform,
6530
6625
  arch: process.arch,
@@ -6705,7 +6800,7 @@ var os4 = __toESM(require("os"));
6705
6800
  // package.json
6706
6801
  var package_default = {
6707
6802
  name: "codeam-cli",
6708
- version: "2.61.45",
6803
+ version: "2.61.47",
6709
6804
  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.",
6710
6805
  type: "commonjs",
6711
6806
  main: "dist/index.js",
@@ -7877,7 +7972,7 @@ var CommandRelayService = class _CommandRelayService {
7877
7972
  // fresh + clear the "CLI update available" banner after a self-update
7878
7973
  // (a codespace that reinstalls @latest reconnects via heartbeat, not
7879
7974
  // pair/reconnect). Older backends ignore the extra field.
7880
- ..."2.61.45" ? { ideVersion: "2.61.45" } : {}
7975
+ ..."2.61.47" ? { ideVersion: "2.61.47" } : {}
7881
7976
  }).then(() => log.trace("relay", `heartbeat ok online=${online}`)).catch((err) => log.trace("relay", `heartbeat failed online=${online}`, err));
7882
7977
  }
7883
7978
  /**
@@ -18862,7 +18957,7 @@ async function autoUpgradeBeforeCriticalCommand() {
18862
18957
  if (process.env.NODE_ENV === "test") return;
18863
18958
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
18864
18959
  if (process.env.CI) return;
18865
- const current = true ? "2.61.45" : null;
18960
+ const current = true ? "2.61.47" : null;
18866
18961
  if (!current) return;
18867
18962
  const cache = readCache();
18868
18963
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -18879,7 +18974,7 @@ function checkForUpdates() {
18879
18974
  if (process.env.CODEAM_DISABLE_UPDATE_CHECK === "1") return;
18880
18975
  if (process.env.CI) return;
18881
18976
  if (!process.stdout.isTTY) return;
18882
- const current = true ? "2.61.45" : null;
18977
+ const current = true ? "2.61.47" : null;
18883
18978
  if (!current) return;
18884
18979
  const cache = readCache();
18885
18980
  const fresh = cache && Date.now() - cache.fetchedAt < TTL_MS;
@@ -18899,7 +18994,7 @@ var SELF_UPDATE_INTERVAL_MS = 60 * 60 * 1e3;
18899
18994
  var SELF_UPDATE_VIEW_TIMEOUT_MS = 3e4;
18900
18995
  var SELF_UPDATE_INSTALL_TIMEOUT_MS = 18e4;
18901
18996
  function currentCliVersion() {
18902
- return true ? "2.61.45" : null;
18997
+ return true ? "2.61.47" : null;
18903
18998
  }
18904
18999
  function runCmd(cmd, args2, timeoutMs) {
18905
19000
  return new Promise((resolve8) => {
@@ -39025,7 +39120,7 @@ function checkChokidar() {
39025
39120
  }
39026
39121
  async function doctor(args2 = []) {
39027
39122
  const json = args2.includes("--json");
39028
- const cliVersion = true ? "2.61.45" : "0.0.0-dev";
39123
+ const cliVersion = true ? "2.61.47" : "0.0.0-dev";
39029
39124
  const apiBase2 = resolveApiBaseUrl();
39030
39125
  const diagnosticId = (0, import_node_crypto13.randomUUID)();
39031
39126
  log.info("doctor", `run id=${diagnosticId} cli=${cliVersion}`);
@@ -39547,7 +39642,7 @@ async function mcpRun(args2) {
39547
39642
  // src/commands/version.ts
39548
39643
  var import_picocolors15 = __toESM(require("picocolors"));
39549
39644
  function version2() {
39550
- const v = true ? "2.61.45" : "unknown";
39645
+ const v = true ? "2.61.47" : "unknown";
39551
39646
  console.log(`${import_picocolors15.default.bold("codeam-cli")} ${import_picocolors15.default.cyan(v)}`);
39552
39647
  }
39553
39648
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeam-cli",
3
- "version": "2.61.45",
3
+ "version": "2.61.47",
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",