@cmmd-center/forge 0.9.14 → 0.9.15

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/dist/bin.cjs CHANGED
@@ -65123,7 +65123,7 @@ function normalizeNumberish(value) {
65123
65123
  }
65124
65124
  //#endregion
65125
65125
  //#region package.json
65126
- var version$1 = "0.9.14";
65126
+ var version$1 = "0.9.15";
65127
65127
  //#endregion
65128
65128
  //#region src/sentry.ts
65129
65129
  const SERVER_APP_NAME = "forge-server";
@@ -66945,13 +66945,13 @@ function validateCommandBootstrapPayload(payload) {
66945
66945
  });
66946
66946
  const payloadIdentity = normalizeCmmdUserIdentity(payload.user);
66947
66947
  if (payloadIdentity) {
66948
- const cmmdIdentity = payloadIdentity.avatarUrl ? payloadIdentity : mergeCmmdUserIdentity(payloadIdentity, yield* fetchOptionalCmmdIdentityForAccessToken(payload.accessToken));
66948
+ const cmmdIdentity = payloadIdentity.avatarUrl ? payloadIdentity : mergeCmmdUserIdentity(payloadIdentity, yield* fetchOptionalCmmdIdentityForAccessToken(cmmdUserCredential(payload)));
66949
66949
  return {
66950
66950
  subjectUserId: cmmdIdentity.id,
66951
66951
  cmmdIdentity
66952
66952
  };
66953
66953
  }
66954
- const tokenIdentity = yield* fetchCmmdIdentityForAccessToken(payload.accessToken);
66954
+ const tokenIdentity = yield* fetchCmmdIdentityForAccessToken(cmmdUserCredential(payload));
66955
66955
  if (tokenIdentity) return {
66956
66956
  subjectUserId: tokenIdentity.id,
66957
66957
  cmmdIdentity: tokenIdentity
@@ -67044,6 +67044,23 @@ function isCmmdJwtToken(token) {
67044
67044
  return token?.startsWith("eyJ") ?? false;
67045
67045
  }
67046
67046
  /**
67047
+ * The credential CMMD's userinfo accepts.
67048
+ *
67049
+ * Since CMMD's OAuth update, `access_token` is a JWT and the personal access
67050
+ * token arrives separately as `mcp_token`. userinfo authenticates the PAT and
67051
+ * rejects the JWT with `INVALID_OR_NON_USER_TOKEN`, so presenting the JWT
67052
+ * resolves no identity: the bootstrap then finds no subject and answers 401,
67053
+ * even though the sign-in itself succeeded and the caller did nothing wrong.
67054
+ *
67055
+ * `resolveCmmdTokenBundleCredentials` already draws this distinction for the
67056
+ * owner lanes. This is the same rule for the bootstrap lane, which had only ever
67057
+ * seen the pre-update shape where `access_token` was itself the PAT.
67058
+ */
67059
+ function cmmdUserCredential(payload) {
67060
+ const pat = payload.mcpToken?.trim();
67061
+ return isCmmdJwtToken(payload.accessToken) && pat ? pat : payload.accessToken;
67062
+ }
67063
+ /**
67047
67064
  * Read one CMMD token-exchange response into the credential set Forge stores.
67048
67065
  *
67049
67066
  * Both owner lanes redeem the same `cmmd-forge-web` authorization code — the
@@ -92830,7 +92847,7 @@ function hasValidRuntimeIdentity(value) {
92830
92847
  }
92831
92848
  function decodeRuntime$1(value) {
92832
92849
  if (!isRecord$16(value) || !hasValidRuntimeIdentity(value)) return null;
92833
- if (!nullableString(value.endpointUrl) || value.endpointUrl !== null && !URL.canParse(value.endpointUrl) || !nullableInteger(value.deviceId) || !nullableInteger(value.projectId) || !nullableString(value.projectName) || !nullableString(value.workspaceRoot) || !nullableString(value.githubRepoFullName) || !(value.lastSeenAt === null || isIsoDateTime(value.lastSeenAt)) || !(value.metadata === null || isRecord$16(value.metadata))) return null;
92850
+ if (!nullableString(value.endpointUrl) || value.endpointUrl !== null && !URL.canParse(value.endpointUrl) || !nullableInteger(value.deviceId) || !nullableString(value.workspaceRoot) || !nullableString(value.githubRepoFullName) || !(value.lastSeenAt === null || isIsoDateTime(value.lastSeenAt)) || !(value.metadata === null || isRecord$16(value.metadata))) return null;
92834
92851
  return value;
92835
92852
  }
92836
92853
  function decodeProject(value) {
@@ -93141,8 +93158,6 @@ function replicaRuntimeMatches(left, right) {
93141
93158
  [left.status, right.status],
93142
93159
  [left.endpointUrl, right.endpointUrl],
93143
93160
  [left.deviceId, right.deviceId],
93144
- [left.projectId, right.projectId],
93145
- [left.projectName, right.projectName],
93146
93161
  [left.workspaceRoot, right.workspaceRoot],
93147
93162
  [left.githubRepoFullName, right.githubRepoFullName],
93148
93163
  [left.lastSeenAt, right.lastSeenAt]
package/dist/bin.mjs CHANGED
@@ -22,7 +22,7 @@ import { createCipheriv, createDecipheriv, createHash, createHmac, createPublicK
22
22
  import * as FS$1 from "node:fs";
23
23
  import fs, { accessSync, chmodSync, constants, createReadStream, existsSync, mkdirSync, mkdtempSync, promises, readFile, readFileSync, readdir, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
24
24
  import * as NodeOS from "node:os";
25
- import os, { homedir, networkInterfaces, tmpdir } from "node:os";
25
+ import $U, { homedir, networkInterfaces, tmpdir } from "node:os";
26
26
  import * as Path$1 from "node:path";
27
27
  import path, { basename, delimiter, dirname, extname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
28
28
  import { pathToFileURL } from "node:url";
@@ -49482,7 +49482,7 @@ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
49482
49482
  const min = forceColor || 0;
49483
49483
  if (env.TERM === "dumb") return min;
49484
49484
  if (process$1.platform === "win32") {
49485
- const osRelease = os.release().split(".");
49485
+ const osRelease = $U.release().split(".");
49486
49486
  if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) return Number(osRelease[2]) >= 14931 ? 3 : 2;
49487
49487
  return 1;
49488
49488
  }
@@ -51925,7 +51925,7 @@ var require_ProcessDetector = /* @__PURE__ */ __commonJSMin(((exports) => {
51925
51925
  exports.processDetector = void 0;
51926
51926
  const api_1 = (init_esm$1(), __toCommonJS(esm_exports$1));
51927
51927
  const semconv_1 = require_semconv$1();
51928
- const os$4 = __require("os");
51928
+ const os$3 = __require("os");
51929
51929
  /**
51930
51930
  * ProcessDetector will be used to detect the resources related current process running
51931
51931
  * and being instrumented from the NodeJS Process module.
@@ -51947,7 +51947,7 @@ var require_ProcessDetector = /* @__PURE__ */ __commonJSMin(((exports) => {
51947
51947
  };
51948
51948
  if (process.argv.length > 1) attributes[semconv_1.ATTR_PROCESS_COMMAND] = process.argv[1];
51949
51949
  try {
51950
- const userInfo = os$4.userInfo();
51950
+ const userInfo = os$3.userInfo();
51951
51951
  attributes[semconv_1.ATTR_PROCESS_OWNER] = userInfo.username;
51952
51952
  } catch (e) {
51953
51953
  api_1.diag.debug(`error obtaining process owner: ${e}`);
@@ -64870,7 +64870,7 @@ function normalizeNumberish(value) {
64870
64870
  }
64871
64871
  //#endregion
64872
64872
  //#region package.json
64873
- var version$1 = "0.9.14";
64873
+ var version$1 = "0.9.15";
64874
64874
  //#endregion
64875
64875
  //#region src/sentry.ts
64876
64876
  const SERVER_APP_NAME = "forge-server";
@@ -66692,13 +66692,13 @@ function validateCommandBootstrapPayload(payload) {
66692
66692
  });
66693
66693
  const payloadIdentity = normalizeCmmdUserIdentity(payload.user);
66694
66694
  if (payloadIdentity) {
66695
- const cmmdIdentity = payloadIdentity.avatarUrl ? payloadIdentity : mergeCmmdUserIdentity(payloadIdentity, yield* fetchOptionalCmmdIdentityForAccessToken(payload.accessToken));
66695
+ const cmmdIdentity = payloadIdentity.avatarUrl ? payloadIdentity : mergeCmmdUserIdentity(payloadIdentity, yield* fetchOptionalCmmdIdentityForAccessToken(cmmdUserCredential(payload)));
66696
66696
  return {
66697
66697
  subjectUserId: cmmdIdentity.id,
66698
66698
  cmmdIdentity
66699
66699
  };
66700
66700
  }
66701
- const tokenIdentity = yield* fetchCmmdIdentityForAccessToken(payload.accessToken);
66701
+ const tokenIdentity = yield* fetchCmmdIdentityForAccessToken(cmmdUserCredential(payload));
66702
66702
  if (tokenIdentity) return {
66703
66703
  subjectUserId: tokenIdentity.id,
66704
66704
  cmmdIdentity: tokenIdentity
@@ -66791,6 +66791,23 @@ function isCmmdJwtToken(token) {
66791
66791
  return token?.startsWith("eyJ") ?? false;
66792
66792
  }
66793
66793
  /**
66794
+ * The credential CMMD's userinfo accepts.
66795
+ *
66796
+ * Since CMMD's OAuth update, `access_token` is a JWT and the personal access
66797
+ * token arrives separately as `mcp_token`. userinfo authenticates the PAT and
66798
+ * rejects the JWT with `INVALID_OR_NON_USER_TOKEN`, so presenting the JWT
66799
+ * resolves no identity: the bootstrap then finds no subject and answers 401,
66800
+ * even though the sign-in itself succeeded and the caller did nothing wrong.
66801
+ *
66802
+ * `resolveCmmdTokenBundleCredentials` already draws this distinction for the
66803
+ * owner lanes. This is the same rule for the bootstrap lane, which had only ever
66804
+ * seen the pre-update shape where `access_token` was itself the PAT.
66805
+ */
66806
+ function cmmdUserCredential(payload) {
66807
+ const pat = payload.mcpToken?.trim();
66808
+ return isCmmdJwtToken(payload.accessToken) && pat ? pat : payload.accessToken;
66809
+ }
66810
+ /**
66794
66811
  * Read one CMMD token-exchange response into the credential set Forge stores.
66795
66812
  *
66796
66813
  * Both owner lanes redeem the same `cmmd-forge-web` authorization code — the
@@ -73483,7 +73500,7 @@ var require_node_gyp_build = /* @__PURE__ */ __commonJSMin(((exports, module) =>
73483
73500
  var fs$6 = __require("fs");
73484
73501
  var path$5 = __require("path");
73485
73502
  var url$1 = __require("url");
73486
- var os$3 = __require("os");
73503
+ var os$2 = __require("os");
73487
73504
  var runtimeRequire = typeof __webpack_require__ === "function" ? __non_webpack_require__ : __require;
73488
73505
  var vars = process.config && process.config.variables || {};
73489
73506
  var prebuildsOnly = !!process.env.PREBUILDS_ONLY;
@@ -73491,8 +73508,8 @@ var require_node_gyp_build = /* @__PURE__ */ __commonJSMin(((exports, module) =>
73491
73508
  var abi = versions.modules;
73492
73509
  if (versions.deno || process.isBun) abi = "unsupported";
73493
73510
  var runtime = isElectron() ? "electron" : isNwjs() ? "node-webkit" : "node";
73494
- var arch = process.env.npm_config_arch || os$3.arch();
73495
- var platform = process.env.npm_config_platform || os$3.platform();
73511
+ var arch = process.env.npm_config_arch || os$2.arch();
73512
+ var platform = process.env.npm_config_platform || os$2.platform();
73496
73513
  var libc = process.env.LIBC || (isMusl(platform) ? "musl" : "glibc");
73497
73514
  var armv = process.env.ARM_VERSION || (arch === "arm64" ? "8" : vars.arm_version) || "";
73498
73515
  var uv = (versions.uv || "").split(".")[0];
@@ -91150,7 +91167,7 @@ const launchDetached = (launch) => gen(function* () {
91150
91167
  });
91151
91168
  const OpenLive = effect(Open, gen(function* () {
91152
91169
  const open = yield* tryPromise({
91153
- try: () => import("./open-FIgTDosf.mjs"),
91170
+ try: () => import("./open-D8mGyWmt.mjs"),
91154
91171
  catch: (cause) => new OpenError$1({
91155
91172
  message: "failed to load browser opener",
91156
91173
  cause
@@ -92509,7 +92526,7 @@ function hasValidRuntimeIdentity(value) {
92509
92526
  }
92510
92527
  function decodeRuntime$1(value) {
92511
92528
  if (!isRecord$16(value) || !hasValidRuntimeIdentity(value)) return null;
92512
- if (!nullableString(value.endpointUrl) || value.endpointUrl !== null && !URL.canParse(value.endpointUrl) || !nullableInteger(value.deviceId) || !nullableInteger(value.projectId) || !nullableString(value.projectName) || !nullableString(value.workspaceRoot) || !nullableString(value.githubRepoFullName) || !(value.lastSeenAt === null || isIsoDateTime(value.lastSeenAt)) || !(value.metadata === null || isRecord$16(value.metadata))) return null;
92529
+ if (!nullableString(value.endpointUrl) || value.endpointUrl !== null && !URL.canParse(value.endpointUrl) || !nullableInteger(value.deviceId) || !nullableString(value.workspaceRoot) || !nullableString(value.githubRepoFullName) || !(value.lastSeenAt === null || isIsoDateTime(value.lastSeenAt)) || !(value.metadata === null || isRecord$16(value.metadata))) return null;
92513
92530
  return value;
92514
92531
  }
92515
92532
  function decodeProject(value) {
@@ -92820,8 +92837,6 @@ function replicaRuntimeMatches(left, right) {
92820
92837
  [left.status, right.status],
92821
92838
  [left.endpointUrl, right.endpointUrl],
92822
92839
  [left.deviceId, right.deviceId],
92823
- [left.projectId, right.projectId],
92824
- [left.projectName, right.projectName],
92825
92840
  [left.workspaceRoot, right.workspaceRoot],
92826
92841
  [left.githubRepoFullName, right.githubRepoFullName],
92827
92842
  [left.lastSeenAt, right.lastSeenAt]
@@ -184358,7 +184373,7 @@ var Vce = {
184358
184373
  function Ve() {
184359
184374
  return Vce;
184360
184375
  }
184361
- var Us = os.homedir(), lk = os.tmpdir(), { env: Vc } = process$1, Yce = (e) => {
184376
+ var Us = $U.homedir(), lk = $U.tmpdir(), { env: Vc } = process$1, Yce = (e) => {
184362
184377
  let t = path.join(Us, "Library");
184363
184378
  return {
184364
184379
  data: path.join(t, "Application Support", e),
@@ -194558,12 +194573,12 @@ function qZ(e, t) {
194558
194573
  }
194559
194574
  return n;
194560
194575
  }
194561
- var os$2 = "https://code.claude.com/docs/en", kKe = [
194576
+ var os$1 = "https://code.claude.com/docs/en", kKe = [
194562
194577
  {
194563
194578
  matches: (e) => e.path === "permissions.defaultMode" && e.code === "invalid_value",
194564
194579
  tip: {
194565
194580
  suggestion: "Valid modes: \"acceptEdits\" (ask before file changes), \"plan\" (analysis only), \"bypassPermissions\" (auto-accept all), or \"default\" (standard behavior)",
194566
- docLink: `${os$2}/iam#permission-modes`
194581
+ docLink: `${os$1}/iam#permission-modes`
194567
194582
  }
194568
194583
  },
194569
194584
  {
@@ -194578,7 +194593,7 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
194578
194593
  matches: (e) => e.path.startsWith("env.") && e.code === "invalid_type",
194579
194594
  tip: {
194580
194595
  suggestion: "Environment variables must be strings. Wrap numbers and booleans in quotes. Example: \"DEBUG\": \"true\", \"PORT\": \"3000\"",
194581
- docLink: `${os$2}/settings#environment-variables`
194596
+ docLink: `${os$1}/settings#environment-variables`
194582
194597
  }
194583
194598
  },
194584
194599
  {
@@ -194589,14 +194604,14 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
194589
194604
  matches: (e) => e.path.startsWith("hooks.") && e.code === "invalid_key",
194590
194605
  tip: {
194591
194606
  suggestion: "Not a recognized hook event. Common events: PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, SessionEnd, Stop. Check spelling and capitalization.",
194592
- docLink: `${os$2}/hooks`
194607
+ docLink: `${os$1}/hooks`
194593
194608
  }
194594
194609
  },
194595
194610
  {
194596
194611
  matches: (e) => /\.hooks\.\d+\.command$/.test(e.path) && e.code === "invalid_type" && e.received === "undefined",
194597
194612
  tip: {
194598
194613
  suggestion: "Command hooks require `command`. For exec form (no shell), set `command` to the executable and `args` to its arguments: {\"type\": \"command\", \"command\": \"echo\", \"args\": [\"hi\"]}. For shell form, set `command` to the full shell string: {\"type\": \"command\", \"command\": \"echo hi\"}.",
194599
- docLink: `${os$2}/hooks#exec-form-and-shell-form`
194614
+ docLink: `${os$1}/hooks#exec-form-and-shell-form`
194600
194615
  }
194601
194616
  },
194602
194617
  {
@@ -194611,7 +194626,7 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
194611
194626
  matches: (e) => e.code === "unrecognized_keys",
194612
194627
  tip: {
194613
194628
  suggestion: "Check for typos or refer to the documentation for valid fields",
194614
- docLink: `${os$2}/settings`
194629
+ docLink: `${os$1}/settings`
194615
194630
  }
194616
194631
  },
194617
194632
  {
@@ -194626,13 +194641,13 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
194626
194641
  matches: (e) => e.path === "permissions.additionalDirectories" && e.code === "invalid_type",
194627
194642
  tip: {
194628
194643
  suggestion: "Must be an array of directory paths. Example: [\"~/projects\", \"/tmp/workspace\"]. You can also use --add-dir flag or /add-dir command",
194629
- docLink: `${os$2}/iam#working-directories`
194644
+ docLink: `${os$1}/iam#working-directories`
194630
194645
  }
194631
194646
  }
194632
194647
  ], AKe = {
194633
- permissions: `${os$2}/iam#configuring-permissions`,
194634
- env: `${os$2}/settings#environment-variables`,
194635
- hooks: `${os$2}/hooks`
194648
+ permissions: `${os$1}/iam#configuring-permissions`,
194649
+ env: `${os$1}/settings#environment-variables`,
194650
+ hooks: `${os$1}/hooks`
194636
194651
  };
194637
194652
  function GZ(e) {
194638
194653
  let t = kKe.find((r) => r.matches(e));
@@ -258885,7 +258900,7 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
258885
258900
  var dgram = __require("dgram");
258886
258901
  var thunky = require_thunky();
258887
258902
  var events = __require("events");
258888
- var os$1 = __require("os");
258903
+ var os = __require("os");
258889
258904
  var noop = function() {};
258890
258905
  module.exports = function(opts) {
258891
258906
  if (!opts) opts = {};
@@ -259016,14 +259031,14 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
259016
259031
  return that;
259017
259032
  };
259018
259033
  function defaultInterface() {
259019
- var networks = os$1.networkInterfaces();
259034
+ var networks = os.networkInterfaces();
259020
259035
  var names = Object.keys(networks);
259021
259036
  for (var i = 0; i < names.length; i++) {
259022
259037
  var net = networks[names[i]];
259023
259038
  for (var j = 0; j < net.length; j++) {
259024
259039
  var iface = net[j];
259025
259040
  if (isIPv4(iface.family) && !iface.internal) {
259026
- if (os$1.platform() === "darwin" && names[i] === "en0") return iface.address;
259041
+ if (os.platform() === "darwin" && names[i] === "en0") return iface.address;
259027
259042
  return "0.0.0.0";
259028
259043
  }
259029
259044
  }
@@ -259031,7 +259046,7 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
259031
259046
  return "127.0.0.1";
259032
259047
  }
259033
259048
  function allInterfaces() {
259034
- var networks = os$1.networkInterfaces();
259049
+ var networks = os.networkInterfaces();
259035
259050
  var names = Object.keys(networks);
259036
259051
  var res = [];
259037
259052
  for (var i = 0; i < names.length; i++) {
@@ -310411,7 +310426,7 @@ const connectLoginCommand = make$32("login", {
310411
310426
  })).json();
310412
310427
  },
310413
310428
  openBrowser: async (url) => {
310414
- const open = (await import("./open-FIgTDosf.mjs")).default;
310429
+ const open = (await import("./open-D8mGyWmt.mjs")).default;
310415
310430
  await open(url);
310416
310431
  return true;
310417
310432
  },
@@ -2,7 +2,7 @@
2
2
 
3
3
  import childProcess, { execFile } from "node:child_process";
4
4
  import fs from "node:fs";
5
- import os from "node:os";
5
+ import $U from "node:os";
6
6
  import path from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
8
  import process from "node:process";
@@ -49,7 +49,7 @@ function isInsideContainer() {
49
49
  //#region ../../node_modules/.bun/is-wsl@3.1.1/node_modules/is-wsl/index.js
50
50
  const isWsl = () => {
51
51
  if (process.platform !== "linux") return false;
52
- if (os.release().toLowerCase().includes("microsoft")) {
52
+ if ($U.release().toLowerCase().includes("microsoft")) {
53
53
  if (isInsideContainer()) return false;
54
54
  return true;
55
55
  }
@@ -589,4 +589,4 @@ defineLazyProperty(apps, "safari", () => detectPlatformBinary({ darwin: "Safari"
589
589
  //#endregion
590
590
  export { apps, open as default, openApp };
591
591
 
592
- //# sourceMappingURL=open-FIgTDosf.mjs.map
592
+ //# sourceMappingURL=open-D8mGyWmt.mjs.map
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "cmmd-forge": "dist/bin.mjs"
10
10
  },
11
11
  "type": "module",
12
- "version": "0.9.14",
12
+ "version": "0.9.15",
13
13
  "engines": {
14
14
  "node": "^22.16 || ^23.11 || >=24.10"
15
15
  },