@cmmd-center/forge 0.9.13 → 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.mjs CHANGED
@@ -11,7 +11,7 @@ import { a as make$48, i as keys, n as getOption, o as makeWith$1, r as invalida
11
11
  import { S as layer$9, _ as defaultEscape, a as DeadlockError, b as makeCompiler$1, c as SqlError, d as UnknownError, g as custom, h as make$49, i as ConstraintError, l as SqlSyntaxError, m as SqlClient, n as AuthorizationError, o as LockTimeoutError, r as ConnectionError, s as SerializationError, t as AuthenticationError, u as StatementTimeoutError, v as defaultTransforms, y as fragment } from "./SqlError-B2g5pJux.mjs";
12
12
  import { r as wrapper_default, t as Mime_default } from "./Mime-Dq9IoNiV.mjs";
13
13
  import { a as diag, c as SpanKind$1, d as TraceFlags, f as ROOT_CONTEXT, i as propagation, l as isSpanContextValid, m as DiagLogLevel, n as init_esm$1, o as context$1, p as createContextKey, r as trace, s as SpanStatusCode, t as esm_exports$1 } from "./esm-wLIF-u3N.mjs";
14
- import { a as verifyCmmdAuthRuntimeTicket, c as verifyCmmdRuntimeTicketRefreshProof, d as createReadOnceFileTokenAccessor, i as sendRuntimeControlHeartbeat, l as runtimeGrantToken, n as bootstrapRuntimeControlAuthorityFromNarrowGrant, o as verifyCmmdClaudeReadinessTicket, r as readRuntimeControlAuthority, s as verifyCmmdRuntimeTicket, t as bootstrapRuntimeControlAuthority, u as setRuntimeGrantToken } from "./runtimeControlAuthority-akIBTI-S.mjs";
14
+ import { a as verifyCmmdAuthRuntimeTicket, c as verifyCmmdRuntimeTicket, d as setRuntimeGrantToken, f as createReadOnceFileTokenAccessor, i as sendRuntimeControlHeartbeat, l as verifyCmmdRuntimeTicketRefreshProof, n as bootstrapRuntimeControlAuthorityFromNarrowGrant, o as verifyCmmdClaudeReadinessTicket, r as readRuntimeControlAuthority, s as verifyCmmdClaudeUsageTicket, t as bootstrapRuntimeControlAuthority, u as runtimeGrantToken } from "./runtimeControlAuthority-COHmz_WT.mjs";
15
15
  import { n as PtySpawnError, t as PtyAdapter } from "./PTY-Cx_YKiEO.mjs";
16
16
  import { createRequire } from "node:module";
17
17
  import * as HE from "node:child_process";
@@ -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";
@@ -32066,7 +32066,7 @@ function requiredString(value, minimumLength = 1) {
32066
32066
  if (typeof value !== "string" || value.length < minimumLength) return identityCorrupt();
32067
32067
  return value;
32068
32068
  }
32069
- function positiveInteger$1(value) {
32069
+ function positiveInteger$2(value) {
32070
32070
  if (!Number.isInteger(value) || Number(value) <= 0) return identityCorrupt();
32071
32071
  return Number(value);
32072
32072
  }
@@ -32086,7 +32086,7 @@ function parseChallenge(value) {
32086
32086
  if (!value || typeof value !== "object") return identityCorrupt();
32087
32087
  const record = value;
32088
32088
  return {
32089
- deviceId: positiveInteger$1(record.deviceId),
32089
+ deviceId: positiveInteger$2(record.deviceId),
32090
32090
  challengeId: requiredString(record.challengeId, 8),
32091
32091
  signingPayload: requiredString(record.signingPayload),
32092
32092
  currentKeyId: requiredString(record.currentKeyId),
@@ -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.13";
64873
+ var version$1 = "0.9.15";
64874
64874
  //#endregion
64875
64875
  //#region src/sentry.ts
64876
64876
  const SERVER_APP_NAME = "forge-server";
@@ -65343,7 +65343,7 @@ function readCmmdAvatarUrl(raw) {
65343
65343
  function readTrimmedString$2(value) {
65344
65344
  return typeof value === "string" ? value.trim() || null : null;
65345
65345
  }
65346
- function asRecord$11(value) {
65346
+ function asRecord$12(value) {
65347
65347
  return value && typeof value === "object" ? value : null;
65348
65348
  }
65349
65349
  function readDirectPlanLabelFromRecord(obj) {
@@ -65355,26 +65355,26 @@ function readNestedPlanLabelFromRecord(obj) {
65355
65355
  function readCmmdPlanLabel(obj) {
65356
65356
  const direct = readDirectPlanLabelFromRecord(obj);
65357
65357
  if (direct) return direct;
65358
- const plan = asRecord$11(obj["plan"]);
65358
+ const plan = asRecord$12(obj["plan"]);
65359
65359
  if (plan) {
65360
65360
  const label = readNestedPlanLabelFromRecord(plan);
65361
65361
  if (label) return label;
65362
65362
  }
65363
- const subscription = asRecord$11(obj["subscription"]);
65363
+ const subscription = asRecord$12(obj["subscription"]);
65364
65364
  if (subscription) {
65365
65365
  const label = readNestedPlanLabelFromRecord(subscription);
65366
65366
  if (label) return label;
65367
- const subscriptionPlan = asRecord$11(subscription["plan"]);
65367
+ const subscriptionPlan = asRecord$12(subscription["plan"]);
65368
65368
  if (subscriptionPlan) {
65369
65369
  const nestedLabel = readNestedPlanLabelFromRecord(subscriptionPlan);
65370
65370
  if (nestedLabel) return nestedLabel;
65371
65371
  }
65372
65372
  }
65373
- const billing = asRecord$11(obj["billing"]);
65373
+ const billing = asRecord$12(obj["billing"]);
65374
65374
  if (billing) {
65375
65375
  const label = readNestedPlanLabelFromRecord(billing);
65376
65376
  if (label) return label;
65377
- const billingPlan = asRecord$11(billing["plan"]);
65377
+ const billingPlan = asRecord$12(billing["plan"]);
65378
65378
  if (billingPlan) return readNestedPlanLabelFromRecord(billingPlan);
65379
65379
  }
65380
65380
  return null;
@@ -65511,7 +65511,7 @@ function constantTimeEqual(left, right) {
65511
65511
  function integerSeconds(value) {
65512
65512
  return Number.isSafeInteger(value) && value >= 0 ? value : null;
65513
65513
  }
65514
- function positiveInteger(value) {
65514
+ function positiveInteger$1(value) {
65515
65515
  return Number.isSafeInteger(value) && value > 0 ? value : null;
65516
65516
  }
65517
65517
  function parseAssertion(token) {
@@ -65538,7 +65538,7 @@ function hasExpectedPayloadContext(payload) {
65538
65538
  function readRequiredClaims(payload) {
65539
65539
  const subject = nonEmptyString$1(payload["sub"]);
65540
65540
  if (!subject) return null;
65541
- const userId = positiveInteger(payload["user_id"]);
65541
+ const userId = positiveInteger$1(payload["user_id"]);
65542
65542
  if (!userId) return null;
65543
65543
  const jti = nonEmptyString$1(payload["jti"]);
65544
65544
  if (!jti) return null;
@@ -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
@@ -69135,22 +69152,22 @@ const EMPTY_PARSED_ERROR = {
69135
69152
  message: null,
69136
69153
  raw: null
69137
69154
  };
69138
- function asRecord$10(value) {
69155
+ function asRecord$11(value) {
69139
69156
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
69140
69157
  }
69141
69158
  function readTrimmedString$1(value) {
69142
69159
  return (typeof value === "string" ? value.trim() : "") || null;
69143
69160
  }
69144
69161
  function readErrorEnvelope(record) {
69145
- return asRecord$10(record["error"]);
69162
+ return asRecord$11(record["error"]);
69146
69163
  }
69147
69164
  function readUpstreamErrorCode(body) {
69148
- const record = asRecord$10(body);
69165
+ const record = asRecord$11(body);
69149
69166
  if (record === null) return null;
69150
69167
  return readTrimmedString$1(record["code"]) ?? readTrimmedString$1(readErrorEnvelope(record)?.["code"]);
69151
69168
  }
69152
69169
  function readErrorMessage$2(raw) {
69153
- const record = asRecord$10(raw);
69170
+ const record = asRecord$11(raw);
69154
69171
  if (record === null) return null;
69155
69172
  const error = record["error"];
69156
69173
  const nestedMessage = readErrorEnvelope(record)?.["message"];
@@ -69782,7 +69799,7 @@ function buildProxyErrorResponse(error) {
69782
69799
  code: error.code
69783
69800
  }, { status: 403 });
69784
69801
  if (error instanceof CmmdProxyRequestError) {
69785
- const status = error.status >= 500 ? 502 : error.status;
69802
+ const status = error.status === 503 ? 503 : error.status >= 500 ? 502 : error.status;
69786
69803
  return jsonUnsafe({
69787
69804
  error: error.detail ?? "CMMD REST request failed.",
69788
69805
  code: error.code,
@@ -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]
@@ -96479,7 +96494,7 @@ const EMPTY_PLAN_VALUES = new Set([
96479
96494
  "none",
96480
96495
  "null"
96481
96496
  ]);
96482
- function asRecord$9(value) {
96497
+ function asRecord$10(value) {
96483
96498
  if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
96484
96499
  return value;
96485
96500
  }
@@ -96496,7 +96511,7 @@ function decodeJwtClaims(token) {
96496
96511
  try {
96497
96512
  const decoded = Buffer.from(payload, "base64url");
96498
96513
  if (decoded.byteLength > MAX_CLAIMS_BYTES) return void 0;
96499
- return asRecord$9(JSON.parse(decoded.toString("utf8")));
96514
+ return asRecord$10(JSON.parse(decoded.toString("utf8")));
96500
96515
  } catch {
96501
96516
  return;
96502
96517
  }
@@ -96518,7 +96533,7 @@ function findPlanType(claims) {
96518
96533
  const direct = fromRecord(claims);
96519
96534
  if (direct) return direct;
96520
96535
  for (const value of Object.values(claims)) {
96521
- const nested = asRecord$9(value);
96536
+ const nested = asRecord$10(value);
96522
96537
  if (!nested) continue;
96523
96538
  const found = fromRecord(nested);
96524
96539
  if (found) return found;
@@ -96535,7 +96550,7 @@ function readCodexAuthIdentity(authJson) {
96535
96550
  } catch {
96536
96551
  return {};
96537
96552
  }
96538
- const claims = decodeJwtClaims(asRecord$9(asRecord$9(parsed)?.tokens)?.id_token);
96553
+ const claims = decodeJwtClaims(asRecord$10(asRecord$10(parsed)?.tokens)?.id_token);
96539
96554
  if (!claims) return {};
96540
96555
  const email = findEmail(claims);
96541
96556
  const planType = findPlanType(claims);
@@ -96732,11 +96747,6 @@ function recordClaudeRateLimitTelemetry(info, generationHash = currentClaudeUsag
96732
96747
  observedAt: [fiveHourObservedAt, sevenDayObservedAt].filter((value) => value !== null).toSorted()[0]
96733
96748
  });
96734
96749
  }
96735
- function getLatestClaudeRateLimitTelemetry(generationHash = currentClaudeUsageGenerationHash(), providerAccountId) {
96736
- if (generationHash === null) return null;
96737
- const cacheKey = providerAccountId ? `${providerAccountId}:${generationHash}` : generationHash;
96738
- return cachedSnapshots.get(cacheKey) ?? null;
96739
- }
96740
96750
  //#endregion
96741
96751
  //#region src/providerAuth/ClaudeDeviceAuth.ts
96742
96752
  const AUTHORIZE_URL_PATTERN = /https:\/\/[^\s]*\/oauth\/authorize\?[^\s]+/u;
@@ -97115,17 +97125,23 @@ async function loadClaudeAccountMetadataFromCli(homePath) {
97115
97125
  function extractClaudeCredentialGenerationId(response) {
97116
97126
  if (typeof response !== "object" || response === null || !("data" in response)) return null;
97117
97127
  const data = response.data;
97118
- if (typeof data !== "object" || data === null || !("connected" in data) || !data.connected) return null;
97119
- if (!("generationId" in data) || typeof data.generationId !== "string") return null;
97120
- const generationId = data.generationId.trim();
97128
+ if (typeof data !== "object" || data === null) return null;
97129
+ if ("connected" in data && data.connected === true && "generationId" in data && typeof data.generationId === "string") {
97130
+ const generationId = data.generationId.trim();
97131
+ return generationId.length > 0 ? generationId : null;
97132
+ }
97133
+ if (!("account" in data) || typeof data.account !== "object" || data.account === null) return null;
97134
+ const account = data.account;
97135
+ if (!("credentialGenerationId" in account) || typeof account.credentialGenerationId !== "string") return null;
97136
+ const generationId = account.credentialGenerationId.trim();
97121
97137
  return generationId.length > 0 ? generationId : null;
97122
97138
  }
97123
97139
  function extractClaudeProviderAccountId(response) {
97124
- const generationId = extractClaudeCredentialGenerationId(response);
97125
- if (generationId !== null) return generationId;
97126
97140
  if (typeof response !== "object" || response === null || !("data" in response)) return null;
97127
97141
  const data = response.data;
97128
- if (typeof data !== "object" || data === null || !("account" in data)) return null;
97142
+ if (typeof data !== "object" || data === null) return null;
97143
+ if ("connected" in data && data.connected === true) return extractClaudeCredentialGenerationId(response);
97144
+ if (!("account" in data)) return null;
97129
97145
  const account = data.account;
97130
97146
  if (typeof account !== "object" || account === null || !("providerAccountId" in account) || typeof account.providerAccountId !== "string") return null;
97131
97147
  const providerAccountId = account.providerAccountId.trim();
@@ -97153,7 +97169,7 @@ async function publishClaudeUsageAfterSync(input) {
97153
97169
  path: input.auth.path === AUTH_RUNTIME_CLAUDE_CREDENTIAL_PATH ? AUTH_RUNTIME_CLAUDE_USAGE_PATH : USER_CLAUDE_USAGE_PATH,
97154
97170
  body: {
97155
97171
  providerAccountId: input.providerAccountId,
97156
- credentialGenerationId: input.providerAccountId,
97172
+ credentialGenerationId: input.credentialGenerationId,
97157
97173
  accountEmail: input.accountEmail,
97158
97174
  accountDisplayName: input.accountDisplayName,
97159
97175
  planType: input.planType,
@@ -97170,11 +97186,13 @@ async function publishClaudeUsageAfterSync(input) {
97170
97186
  }
97171
97187
  async function finalizeClaudeCredentialSync(input) {
97172
97188
  const providerAccountId = extractClaudeProviderAccountId(input.response);
97173
- if (providerAccountId === null) return null;
97174
- if (input.auth.path === USER_CLAUDE_CREDENTIAL_PATH) setLocalClaudeUsageGeneration(providerAccountId);
97189
+ const credentialGenerationId = extractClaudeCredentialGenerationId(input.response);
97190
+ if (providerAccountId === null || credentialGenerationId === null) return null;
97191
+ if (input.auth.path === USER_CLAUDE_CREDENTIAL_PATH) setLocalClaudeUsageGeneration(credentialGenerationId);
97175
97192
  return publishClaudeUsageAfterSync({
97176
97193
  auth: input.auth,
97177
97194
  providerAccountId,
97195
+ credentialGenerationId,
97178
97196
  accountEmail: input.accountEmail,
97179
97197
  accountDisplayName: input.accountDisplayName,
97180
97198
  planType: input.planType,
@@ -184355,7 +184373,7 @@ var Vce = {
184355
184373
  function Ve() {
184356
184374
  return Vce;
184357
184375
  }
184358
- 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) => {
184359
184377
  let t = path.join(Us, "Library");
184360
184378
  return {
184361
184379
  data: path.join(t, "Application Support", e),
@@ -194555,12 +194573,12 @@ function qZ(e, t) {
194555
194573
  }
194556
194574
  return n;
194557
194575
  }
194558
- var os$2 = "https://code.claude.com/docs/en", kKe = [
194576
+ var os$1 = "https://code.claude.com/docs/en", kKe = [
194559
194577
  {
194560
194578
  matches: (e) => e.path === "permissions.defaultMode" && e.code === "invalid_value",
194561
194579
  tip: {
194562
194580
  suggestion: "Valid modes: \"acceptEdits\" (ask before file changes), \"plan\" (analysis only), \"bypassPermissions\" (auto-accept all), or \"default\" (standard behavior)",
194563
- docLink: `${os$2}/iam#permission-modes`
194581
+ docLink: `${os$1}/iam#permission-modes`
194564
194582
  }
194565
194583
  },
194566
194584
  {
@@ -194575,7 +194593,7 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
194575
194593
  matches: (e) => e.path.startsWith("env.") && e.code === "invalid_type",
194576
194594
  tip: {
194577
194595
  suggestion: "Environment variables must be strings. Wrap numbers and booleans in quotes. Example: \"DEBUG\": \"true\", \"PORT\": \"3000\"",
194578
- docLink: `${os$2}/settings#environment-variables`
194596
+ docLink: `${os$1}/settings#environment-variables`
194579
194597
  }
194580
194598
  },
194581
194599
  {
@@ -194586,14 +194604,14 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
194586
194604
  matches: (e) => e.path.startsWith("hooks.") && e.code === "invalid_key",
194587
194605
  tip: {
194588
194606
  suggestion: "Not a recognized hook event. Common events: PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, SessionEnd, Stop. Check spelling and capitalization.",
194589
- docLink: `${os$2}/hooks`
194607
+ docLink: `${os$1}/hooks`
194590
194608
  }
194591
194609
  },
194592
194610
  {
194593
194611
  matches: (e) => /\.hooks\.\d+\.command$/.test(e.path) && e.code === "invalid_type" && e.received === "undefined",
194594
194612
  tip: {
194595
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\"}.",
194596
- docLink: `${os$2}/hooks#exec-form-and-shell-form`
194614
+ docLink: `${os$1}/hooks#exec-form-and-shell-form`
194597
194615
  }
194598
194616
  },
194599
194617
  {
@@ -194608,7 +194626,7 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
194608
194626
  matches: (e) => e.code === "unrecognized_keys",
194609
194627
  tip: {
194610
194628
  suggestion: "Check for typos or refer to the documentation for valid fields",
194611
- docLink: `${os$2}/settings`
194629
+ docLink: `${os$1}/settings`
194612
194630
  }
194613
194631
  },
194614
194632
  {
@@ -194623,13 +194641,13 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
194623
194641
  matches: (e) => e.path === "permissions.additionalDirectories" && e.code === "invalid_type",
194624
194642
  tip: {
194625
194643
  suggestion: "Must be an array of directory paths. Example: [\"~/projects\", \"/tmp/workspace\"]. You can also use --add-dir flag or /add-dir command",
194626
- docLink: `${os$2}/iam#working-directories`
194644
+ docLink: `${os$1}/iam#working-directories`
194627
194645
  }
194628
194646
  }
194629
194647
  ], AKe = {
194630
- permissions: `${os$2}/iam#configuring-permissions`,
194631
- env: `${os$2}/settings#environment-variables`,
194632
- hooks: `${os$2}/hooks`
194648
+ permissions: `${os$1}/iam#configuring-permissions`,
194649
+ env: `${os$1}/settings#environment-variables`,
194650
+ hooks: `${os$1}/hooks`
194633
194651
  };
194634
194652
  function GZ(e) {
194635
194653
  let t = kKe.find((r) => r.matches(e));
@@ -203517,7 +203535,7 @@ const collectStreamAsString = (stream) => stream.pipe(decodeText$1(), runFold(()
203517
203535
  //#region src/orchestration/WorkerPlanCodexTools.ts
203518
203536
  const FORGE_PROPOSE_WORKER_TASKS_TOOL = "forge_propose_worker_tasks";
203519
203537
  const MAX_WORKER_PLAN_ITEMS = 5;
203520
- function asRecord$8(value) {
203538
+ function asRecord$9(value) {
203521
203539
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
203522
203540
  }
203523
203541
  function readTrimmedString(value) {
@@ -203533,7 +203551,7 @@ function isValidWorkerSummary(value) {
203533
203551
  return value !== void 0 && value.length > 0 && value.length <= 4e3;
203534
203552
  }
203535
203553
  function decodeWorkerPlanItem(value) {
203536
- const item = asRecord$8(value);
203554
+ const item = asRecord$9(value);
203537
203555
  const slug = readTrimmedString(item?.slug);
203538
203556
  const title = readTrimmedString(item?.title);
203539
203557
  const summary = readTrimmedString(item?.summary);
@@ -203597,7 +203615,7 @@ function createWorkerPlanDynamicTools() {
203597
203615
  function createWorkerPlanDynamicToolHandler() {
203598
203616
  return async (input) => {
203599
203617
  if (input.tool !== "forge_propose_worker_tasks") throw new Error(`Unsupported worker-plan tool: ${input.tool}`);
203600
- if (!decodeWorkerPlanItems(asRecord$8(input.arguments)?.items)) throw new Error("Worker plans require one to five unique, fully described items.");
203618
+ if (!decodeWorkerPlanItems(asRecord$9(input.arguments)?.items)) throw new Error("Worker plans require one to five unique, fully described items.");
203601
203619
  return {
203602
203620
  success: true,
203603
203621
  contentItems: [{
@@ -205315,25 +205333,25 @@ const AUTH_METHOD_CONTAINER_KEYS = [
205315
205333
  /** Lift an unknown value into `Option<string>` if it is a non-empty string. */
205316
205334
  const asNonEmptyString = (v) => typeof v === "string" && v.length > 0 ? some(v) : none$4();
205317
205335
  /** Lift an unknown value into `Option<Record>` if it is a plain object. */
205318
- const asRecord$7 = (v) => typeof v === "object" && v !== null && !globalThis.Array.isArray(v) ? some(v) : none$4();
205336
+ const asRecord$8 = (v) => typeof v === "object" && v !== null && !globalThis.Array.isArray(v) ? some(v) : none$4();
205319
205337
  /**
205320
205338
  * Walk an unknown parsed JSON value looking for a subscription/plan
205321
205339
  * identifier, returning the first match as an `Option`.
205322
205340
  */
205323
205341
  function findSubscriptionType(value) {
205324
205342
  if (globalThis.Array.isArray(value)) return firstSomeOf(value.map(findSubscriptionType));
205325
- return asRecord$7(value).pipe(flatMap$2((record) => {
205343
+ return asRecord$8(value).pipe(flatMap$2((record) => {
205326
205344
  const direct = firstSomeOf(SUBSCRIPTION_TYPE_KEYS.map((key) => asNonEmptyString(record[key])));
205327
205345
  if (isSome(direct)) return direct;
205328
- return firstSomeOf(SUBSCRIPTION_CONTAINER_KEYS.map((key) => asRecord$7(record[key]).pipe(flatMap$2(findSubscriptionType))));
205346
+ return firstSomeOf(SUBSCRIPTION_CONTAINER_KEYS.map((key) => asRecord$8(record[key]).pipe(flatMap$2(findSubscriptionType))));
205329
205347
  }));
205330
205348
  }
205331
205349
  function findAuthMethod(value) {
205332
205350
  if (globalThis.Array.isArray(value)) return firstSomeOf(value.map(findAuthMethod));
205333
- return asRecord$7(value).pipe(flatMap$2((record) => {
205351
+ return asRecord$8(value).pipe(flatMap$2((record) => {
205334
205352
  const direct = firstSomeOf(AUTH_METHOD_KEYS.map((key) => asNonEmptyString(record[key])));
205335
205353
  if (isSome(direct)) return direct;
205336
- return firstSomeOf(AUTH_METHOD_CONTAINER_KEYS.map((key) => asRecord$7(record[key]).pipe(flatMap$2(findAuthMethod))));
205354
+ return firstSomeOf(AUTH_METHOD_CONTAINER_KEYS.map((key) => asRecord$8(record[key]).pipe(flatMap$2(findAuthMethod))));
205337
205355
  }));
205338
205356
  }
205339
205357
  /**
@@ -206481,7 +206499,7 @@ function userInputQuestionsFromToolInput(toolInput) {
206481
206499
  return (Array.isArray(toolInput.questions) ? toolInput.questions : []).map((question, idx) => userInputQuestionFromUnknown(question, idx));
206482
206500
  }
206483
206501
  function userInputQuestionFromUnknown(question, idx) {
206484
- const value = asRecord$6(question) ?? {};
206502
+ const value = asRecord$7(question) ?? {};
206485
206503
  return {
206486
206504
  id: typeof value.header === "string" ? value.header : `q-${idx}`,
206487
206505
  header: typeof value.header === "string" ? value.header : `Question ${idx + 1}`,
@@ -206491,13 +206509,13 @@ function userInputQuestionFromUnknown(question, idx) {
206491
206509
  };
206492
206510
  }
206493
206511
  function userInputOptionFromUnknown(option) {
206494
- const value = asRecord$6(option) ?? {};
206512
+ const value = asRecord$7(option) ?? {};
206495
206513
  return {
206496
206514
  label: typeof value.label === "string" ? value.label : "",
206497
206515
  description: typeof value.description === "string" ? value.description : ""
206498
206516
  };
206499
206517
  }
206500
- function asRecord$6(value) {
206518
+ function asRecord$7(value) {
206501
206519
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
206502
206520
  }
206503
206521
  function permissionResultFromDecision(decision, toolInput, suggestions) {
@@ -207304,7 +207322,7 @@ const makeClaudeAdapter = fn$1("makeClaudeAdapter")(function* (options) {
207304
207322
  const updateResumeCursor = fn$1("updateResumeCursor")(function* (context) {
207305
207323
  const threadId = context.session.threadId;
207306
207324
  if (!threadId) return;
207307
- const providerDeliveryBinding = readProviderDeliveryBinding(asRecord$6(context.session.resumeCursor)?.providerDeliveryBinding);
207325
+ const providerDeliveryBinding = readProviderDeliveryBinding(asRecord$7(context.session.resumeCursor)?.providerDeliveryBinding);
207308
207326
  const resumeCursor = {
207309
207327
  threadId,
207310
207328
  ...context.resumeSessionId ? { resume: context.resumeSessionId } : {},
@@ -212370,7 +212388,7 @@ function makeAcpContentDeltaEvent(input) {
212370
212388
  }
212371
212389
  //#endregion
212372
212390
  //#region ../../packages/shared/src/toolActivity.ts
212373
- function asRecord$5(value) {
212391
+ function asRecord$6(value) {
212374
212392
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
212375
212393
  }
212376
212394
  function asTrimmedString(value) {
@@ -212396,10 +212414,10 @@ function extractCommandFromTitle$1(title) {
212396
212414
  return /`([^`]+)`/u.exec(title)?.[1]?.trim() || void 0;
212397
212415
  }
212398
212416
  function extractToolCommand(data, title) {
212399
- const item = asRecord$5(data?.item);
212400
- const itemInput = asRecord$5(item?.input);
212401
- const itemResult = asRecord$5(item?.result);
212402
- const rawInput = asRecord$5(data?.rawInput);
212417
+ const item = asRecord$6(data?.item);
212418
+ const itemInput = asRecord$6(item?.input);
212419
+ const itemResult = asRecord$6(item?.result);
212420
+ const rawInput = asRecord$6(data?.rawInput);
212403
212421
  const direct = [
212404
212422
  normalizeCommandValue$1(item?.command),
212405
212423
  normalizeCommandValue$1(itemInput?.command),
@@ -212427,7 +212445,7 @@ function collectPaths(value, paths, seen, depth) {
212427
212445
  }
212428
212446
  return;
212429
212447
  }
212430
- const record = asRecord$5(value);
212448
+ const record = asRecord$6(value);
212431
212449
  if (!record) return;
212432
212450
  for (const key of [
212433
212451
  "path",
@@ -212486,7 +212504,7 @@ function deriveToolActivityPresentation(input) {
212486
212504
  const title = asTrimmedString(input.title);
212487
212505
  const detail = stripTrailingExitCode(asTrimmedString(input.detail));
212488
212506
  const fallbackSummary = asTrimmedString(input.fallbackSummary) ?? "Tool";
212489
- const data = asRecord$5(input.data);
212507
+ const data = asRecord$6(input.data);
212490
212508
  const command = extractToolCommand(data, title);
212491
212509
  const primaryPath = extractPrimaryPath(data);
212492
212510
  const action = classifyToolAction({
@@ -212510,7 +212528,7 @@ function deriveToolActivityPresentation(input) {
212510
212528
  ...primaryPath ? { detail: primaryPath } : {}
212511
212529
  };
212512
212530
  if (action === "search") {
212513
- const query = asTrimmedString(asRecord$5(data?.rawInput)?.query) ?? asTrimmedString(asRecord$5(data?.rawInput)?.pattern) ?? asTrimmedString(asRecord$5(data?.rawInput)?.searchTerm);
212531
+ const query = asTrimmedString(asRecord$6(data?.rawInput)?.query) ?? asTrimmedString(asRecord$6(data?.rawInput)?.pattern) ?? asTrimmedString(asRecord$6(data?.rawInput)?.searchTerm);
212514
212532
  return {
212515
212533
  summary: "Searched files",
212516
212534
  ...query ? { detail: query } : {}
@@ -258882,7 +258900,7 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
258882
258900
  var dgram = __require("dgram");
258883
258901
  var thunky = require_thunky();
258884
258902
  var events = __require("events");
258885
- var os$1 = __require("os");
258903
+ var os = __require("os");
258886
258904
  var noop = function() {};
258887
258905
  module.exports = function(opts) {
258888
258906
  if (!opts) opts = {};
@@ -259013,14 +259031,14 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
259013
259031
  return that;
259014
259032
  };
259015
259033
  function defaultInterface() {
259016
- var networks = os$1.networkInterfaces();
259034
+ var networks = os.networkInterfaces();
259017
259035
  var names = Object.keys(networks);
259018
259036
  for (var i = 0; i < names.length; i++) {
259019
259037
  var net = networks[names[i]];
259020
259038
  for (var j = 0; j < net.length; j++) {
259021
259039
  var iface = net[j];
259022
259040
  if (isIPv4(iface.family) && !iface.internal) {
259023
- if (os$1.platform() === "darwin" && names[i] === "en0") return iface.address;
259041
+ if (os.platform() === "darwin" && names[i] === "en0") return iface.address;
259024
259042
  return "0.0.0.0";
259025
259043
  }
259026
259044
  }
@@ -259028,7 +259046,7 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
259028
259046
  return "127.0.0.1";
259029
259047
  }
259030
259048
  function allInterfaces() {
259031
- var networks = os$1.networkInterfaces();
259049
+ var networks = os.networkInterfaces();
259032
259050
  var names = Object.keys(networks);
259033
259051
  var res = [];
259034
259052
  for (var i = 0; i < names.length; i++) {
@@ -278901,7 +278919,7 @@ function makeApprovedWorkerPlanEventState() {
278901
278919
  function promptKey(masterThreadId, promptId) {
278902
278920
  return `${masterThreadId}\n${promptId}`;
278903
278921
  }
278904
- function asRecord$4(value) {
278922
+ function asRecord$5(value) {
278905
278923
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
278906
278924
  }
278907
278925
  function exactMaterializedTaskIds(value, expectedCount) {
@@ -278911,7 +278929,7 @@ function exactMaterializedTaskIds(value, expectedCount) {
278911
278929
  }
278912
278930
  function readyBatchFromActivity(state, event) {
278913
278931
  if (event.payload.activity.kind !== "plan.task-creation.batch-succeeded") return null;
278914
- const payload = asRecord$4(event.payload.activity.payload);
278932
+ const payload = asRecord$5(event.payload.activity.payload);
278915
278933
  const promptId = payload?.["promptId"];
278916
278934
  if (typeof promptId !== "string") return null;
278917
278935
  const key = promptKey(event.payload.threadId, promptId);
@@ -280049,7 +280067,7 @@ function runtimeGrantNeedsRefresh(token, identity, nowSeconds = Math.floor(Date.
280049
280067
  return claims.expiresAtSeconds - nowSeconds <= RUNTIME_GRANT_REFRESH_SKEW_SECONDS;
280050
280068
  }
280051
280069
  /** Narrow an unknown to a plain object, or null. */
280052
- function asRecord$3(value) {
280070
+ function asRecord$4(value) {
280053
280071
  return value !== null && typeof value === "object" ? value : null;
280054
280072
  }
280055
280073
  /** The raw (untrimmed) string when it is present and not blank, else null. */
@@ -280061,7 +280079,7 @@ function asTimestamp(value) {
280061
280079
  return typeof value === "string" && Number.isFinite(Date.parse(value)) ? value : null;
280062
280080
  }
280063
280081
  function parseRuntimeGrantRefreshResponse(runtimeId, value) {
280064
- const data = asRecord$3(asRecord$3(value)?.data);
280082
+ const data = asRecord$4(asRecord$4(value)?.data);
280065
280083
  if (!data || data.runtimeId !== runtimeId) return null;
280066
280084
  const grantToken = asNonBlankString(data.grantToken);
280067
280085
  const expiresAt = asTimestamp(data.expiresAt);
@@ -296157,6 +296175,74 @@ const LocalAutomationSchedulerLive = effectDiscard(gen(function* () {
296157
296175
  yield* forkScoped(startup.awaitCommandReady.pipe(andThen(forever$1(tick.pipe(andThen(sleep$4("60 seconds")))))));
296158
296176
  }));
296159
296177
  //#endregion
296178
+ //#region src/command/providerUsageEnvironment.ts
296179
+ function asRecord$3(value) {
296180
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
296181
+ }
296182
+ function positiveInteger(value) {
296183
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : null;
296184
+ }
296185
+ function readEnvironmentId(value) {
296186
+ return typeof value === "string" && value.trim() !== "" ? value : null;
296187
+ }
296188
+ function readEligibleStatus(value) {
296189
+ return value === "running" || value === "suspended" ? value : null;
296190
+ }
296191
+ function isOwnedRuntime(row, ownerUserId) {
296192
+ return positiveInteger(row["userId"]) === ownerUserId;
296193
+ }
296194
+ function readRuntimeId(row) {
296195
+ const runtimeId = row["runtimeId"];
296196
+ return typeof runtimeId === "string" && runtimeId.trim() !== "" ? runtimeId : null;
296197
+ }
296198
+ function readCandidate(runtime, ownerUserId) {
296199
+ const row = asRecord$3(runtime);
296200
+ if (row === null || !isOwnedRuntime(row, ownerUserId) || row["desiredState"] !== "running") return null;
296201
+ const organizationId = positiveInteger(row["organizationId"]);
296202
+ const environmentId = readEnvironmentId(row["environmentId"]);
296203
+ const runtimeId = readRuntimeId(row);
296204
+ const status = readEligibleStatus(row["status"]);
296205
+ if (organizationId === null || environmentId === null || runtimeId === null || status === null) return null;
296206
+ return {
296207
+ organizationId,
296208
+ environmentId,
296209
+ runtimeId,
296210
+ status
296211
+ };
296212
+ }
296213
+ function candidateKey(candidate) {
296214
+ return `${candidate.organizationId}:${candidate.environmentId ?? ""}`;
296215
+ }
296216
+ function statusRank(status) {
296217
+ return status === "running" ? 0 : 1;
296218
+ }
296219
+ function deduplicateCandidates(candidates) {
296220
+ const byEnvironment = /* @__PURE__ */ new Map();
296221
+ for (const candidate of candidates) {
296222
+ const key = candidateKey(candidate);
296223
+ const existing = byEnvironment.get(key);
296224
+ if (existing === void 0 || statusRank(candidate.status) < statusRank(existing.status)) byEnvironment.set(key, candidate);
296225
+ }
296226
+ return [...byEnvironment.values()];
296227
+ }
296228
+ /**
296229
+ * Selects one authenticated owner's Environment from CMMD's projectless runtime
296230
+ * catalog. A tied best candidate fails closed, so Forge never chooses an
296231
+ * organization from browser input.
296232
+ */
296233
+ function selectProviderUsageEnvironment(rawCatalog, ownerUserId) {
296234
+ const runtimes = asRecord$3(asRecord$3(rawCatalog)?.["data"])?.["runtimes"];
296235
+ if (!Array.isArray(runtimes)) return { kind: "unavailable" };
296236
+ const candidates = deduplicateCandidates(runtimes.map((runtime) => readCandidate(runtime, ownerUserId)).filter((candidate) => candidate !== null));
296237
+ const bestRank = Math.min(...candidates.map((candidate) => statusRank(candidate.status)));
296238
+ const bestCandidates = candidates.filter((candidate) => statusRank(candidate.status) === bestRank);
296239
+ if (bestCandidates.length !== 1) return { kind: "unavailable" };
296240
+ return {
296241
+ kind: "ready",
296242
+ organizationId: bestCandidates[0].organizationId
296243
+ };
296244
+ }
296245
+ //#endregion
296160
296246
  //#region src/command/wsToken.ts
296161
296247
  /**
296162
296248
  * Build the WS token response given an optional PAT and the configured CMMD
@@ -296193,13 +296279,13 @@ function resolveWsUrl(baseUrl) {
296193
296279
  const callCmmdTool = legacyCmmdToolBridge.callTool;
296194
296280
  const extractMcpToolText = legacyCmmdToolBridge.extractText;
296195
296281
  const isCmmdMcpAuthError = legacyCmmdToolBridge.isAuthError;
296196
- var ClaudeUsageReadError = class extends TaggedError("ClaudeUsageReadError") {};
296197
296282
  /**
296198
296283
  * CMMD-side path for the PROJECT-keyed Forge Cloud catalog. Shared by the list
296199
296284
  * proxy, the SSE poll-and-emit proxy, and the register/unregister proxies so the
296200
296285
  * upstream contract lives in exactly one place.
296201
296286
  */
296202
296287
  const CMMD_CLOUD_PROJECTS_PATH = "/api/forge/context/cloud-projects";
296288
+ const CMMD_RUNTIMES_PATH = "/api/forge/context/runtimes";
296203
296289
  /**
296204
296290
  * Authenticate the browser session and resolve the CMMD JWT to forward
296205
296291
  * upstream. Returns null when no token could be resolved, which every caller
@@ -296323,6 +296409,10 @@ const cmmdBillingSeriesRouteLayer = registerProxyRoute({
296323
296409
  const cmmdRestUnavailable = () => new CmmdProxyAuthenticationRequiredError("CMMD connection required. Reconnect CMMD to continue.");
296324
296410
  function runCmmdRestProxy(session, proxy, dependencies = {}) {
296325
296411
  return gen(function* () {
296412
+ if (dependencies.jwt !== void 0) {
296413
+ const explicitJwt = dependencies.jwt;
296414
+ return yield* promise(() => (dependencies.runProxy ?? runProxy)(() => proxy(explicitJwt)));
296415
+ }
296326
296416
  const resolveJwt = dependencies.resolveJwt ?? resolveCmmdJwtForSession;
296327
296417
  const jwt = yield* resolveJwt({
296328
296418
  sessionId: session.sessionId,
@@ -297863,59 +297953,6 @@ const cmmdSetProviderAccountDefaultRouteLayer = registerProxyRoute({
297863
297953
  orgIdSource: "none",
297864
297954
  responseShape: "unwrapData"
297865
297955
  });
297866
- const resolveConnectedClaudeGeneration = (session) => gen(function* () {
297867
- const outcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
297868
- method: "GET",
297869
- jwt,
297870
- path: "/api/forge/context/providers/claude/credential"
297871
- }));
297872
- if (!outcome.ok) return outcome;
297873
- const state = unwrapForgeEnvelope(outcome.value);
297874
- if (state === null || typeof state !== "object" || !("connected" in state) || state.connected !== true || !("generationId" in state) || typeof state.generationId !== "string") return {
297875
- ok: true,
297876
- value: null
297877
- };
297878
- return {
297879
- ok: true,
297880
- value: {
297881
- generationId: state.generationId,
297882
- generationHash: createHash("sha256").update(state.generationId).digest("hex")
297883
- }
297884
- };
297885
- });
297886
- /**
297887
- * The GET path is read-only. The explicit per-account POST refresh invokes
297888
- * this helper and propagates any CMMD forward failure to the caller.
297889
- */
297890
- const forwardClaudeUsageTelemetry = (session, requestedProviderAccountId, activelyPoll = false, fetchClaudeUsage = fetchClaudeUsageViaOfficialClient) => gen(function* () {
297891
- const credentialOutcome = yield* resolveConnectedClaudeGeneration(session);
297892
- if (!credentialOutcome.ok) return credentialOutcome;
297893
- if (credentialOutcome.value === null) return null;
297894
- const { generationId, generationHash } = credentialOutcome.value;
297895
- const providerAccountId = requestedProviderAccountId ?? generationId;
297896
- const activeSnapshot = activelyPoll && providerAccountId === generationId ? yield* tryPromise({
297897
- try: () => fetchClaudeUsage({ binaryPath: resolveClaudeBinaryPath("claude") }),
297898
- catch: (cause) => new ClaudeUsageReadError({ cause })
297899
- }).pipe(orElseSucceed(() => null)) : null;
297900
- const snapshot = activeSnapshot ? {
297901
- ...activeSnapshot,
297902
- observedAt: (/* @__PURE__ */ new Date()).toISOString()
297903
- } : getLatestClaudeRateLimitTelemetry(generationHash, providerAccountId);
297904
- if (!snapshot) return null;
297905
- return yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
297906
- method: "POST",
297907
- jwt,
297908
- path: "/api/forge/context/providers/usage/claude/telemetry",
297909
- body: {
297910
- providerAccountId,
297911
- credentialGenerationId: generationId,
297912
- source: activeSnapshot ? "active_poll" : "passive_sdk_telemetry",
297913
- fiveHour: snapshot.fiveHour,
297914
- sevenDay: snapshot.sevenDay,
297915
- observedAt: snapshot.observedAt
297916
- }
297917
- }));
297918
- });
297919
297956
  const cmmdGetProviderUsageRouteLayer = add$1("GET", "/api/cmmd/providers/usage", gen(function* () {
297920
297957
  const request = yield* HttpServerRequest;
297921
297958
  const outcome = yield* runCmmdRestProxy(yield* (yield* ServerAuth).authenticateHttpRequest(request), (jwt) => cmmdGateway.request({
@@ -297936,15 +297973,62 @@ function parseProviderUsageRefreshInput(rawBody) {
297936
297973
  providerAccountId: body.providerAccountId
297937
297974
  };
297938
297975
  }
297939
- const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/usage/refresh", gen(function* () {
297940
- const request = yield* HttpServerRequest;
297941
- const session = yield* (yield* ServerAuth).authenticateHttpRequest(request);
297942
- const input = parseProviderUsageRefreshInput(yield* request.json);
297943
- if (input === null) return jsonUnsafe({ error: "provider and providerAccountId must identify a connected provider account" }, { status: 400 });
297944
- const claudeOutcome = input.provider === "claude" ? yield* forwardClaudeUsageTelemetry(session, input.providerAccountId, true) : null;
297945
- if (input.provider === "claude" && claudeOutcome !== null && !claudeOutcome.ok) return buildProxyErrorResponse(claudeOutcome.error);
297946
- if (input.provider === "claude" && claudeOutcome === null) return jsonUnsafe({ error: "No exact-account Claude usage observation is available in this runtime." }, { status: 503 });
297947
- if (input.provider === "codex") {
297976
+ function resolveProviderUsageOwnerUserId(session) {
297977
+ const identity = readCmmdUserIdentityForSession(session.sessionId);
297978
+ const userId = identity === null ? NaN : Number(identity.id);
297979
+ return Number.isSafeInteger(userId) && userId > 0 ? userId : null;
297980
+ }
297981
+ function buildClaudeUsageRefreshErrorResponse(error) {
297982
+ return jsonUnsafe({
297983
+ error: "Claude usage refresh is unavailable.",
297984
+ code: "CLAUDE_USAGE_REFRESH_UNAVAILABLE"
297985
+ }, { status: error instanceof CmmdProxyRequestError && error.status === 503 ? 503 : 502 });
297986
+ }
297987
+ function makeRefreshProviderUsageHandler(dependencies = {}) {
297988
+ return gen(function* () {
297989
+ const request = yield* HttpServerRequest;
297990
+ const session = yield* (yield* ServerAuth).authenticateHttpRequest(request);
297991
+ const input = parseProviderUsageRefreshInput(yield* request.json);
297992
+ if (input === null) return jsonUnsafe({ error: "provider and providerAccountId must identify a connected provider account" }, { status: 400 });
297993
+ if (input.provider === "claude") {
297994
+ const requestJwt = yield* (dependencies.resolveJwt ?? resolveCmmdJwtForSession)({
297995
+ sessionId: session.sessionId,
297996
+ subject: session.subject,
297997
+ logPrefix: "claude-usage-refresh"
297998
+ });
297999
+ if (!requestJwt) return buildClaudeUsageRefreshErrorResponse(/* @__PURE__ */ new Error("CMMD authentication required."));
298000
+ const ownerUserId = resolveProviderUsageOwnerUserId(session);
298001
+ if (ownerUserId === null) return jsonUnsafe({
298002
+ error: "CMMD owner identity is unavailable for Claude usage refresh.",
298003
+ code: "CLAUDE_USAGE_ENVIRONMENT_UNAVAILABLE"
298004
+ }, { status: 503 });
298005
+ const catalogOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
298006
+ method: "GET",
298007
+ jwt,
298008
+ path: CMMD_RUNTIMES_PATH
298009
+ }), { jwt: requestJwt });
298010
+ if (!catalogOutcome.ok) return buildClaudeUsageRefreshErrorResponse(catalogOutcome.error);
298011
+ const target = selectProviderUsageEnvironment(catalogOutcome.value, ownerUserId);
298012
+ if (target.kind === "unavailable") return jsonUnsafe({
298013
+ error: "No owned Environment with running intent is available for Claude usage refresh.",
298014
+ code: "CLAUDE_USAGE_ENVIRONMENT_UNAVAILABLE"
298015
+ }, { status: 503 });
298016
+ const refreshOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
298017
+ method: "POST",
298018
+ jwt,
298019
+ path: "/api/forge/context/providers/usage/claude/refresh",
298020
+ body: { providerAccountId: input.providerAccountId },
298021
+ orgId: String(target.organizationId)
298022
+ }), { jwt: requestJwt });
298023
+ if (!refreshOutcome.ok) return buildClaudeUsageRefreshErrorResponse(refreshOutcome.error);
298024
+ const snapshotOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
298025
+ method: "GET",
298026
+ jwt,
298027
+ path: "/api/forge/context/providers/usage"
298028
+ }), { jwt: requestJwt });
298029
+ if (!snapshotOutcome.ok) return buildClaudeUsageRefreshErrorResponse(snapshotOutcome.error);
298030
+ return jsonUnsafe(unwrapForgeEnvelope(snapshotOutcome.value), { status: 200 });
298031
+ }
297948
298032
  const refreshOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
297949
298033
  method: "POST",
297950
298034
  jwt,
@@ -297952,16 +298036,16 @@ const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/us
297952
298036
  body: { providerAccountId: input.providerAccountId }
297953
298037
  }));
297954
298038
  if (!refreshOutcome.ok) return buildProxyErrorResponse(refreshOutcome.error);
297955
- if (claudeOutcome !== null && !claudeOutcome.ok) return buildProxyErrorResponse(claudeOutcome.error);
297956
- }
297957
- const outcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
297958
- method: "GET",
297959
- jwt,
297960
- path: "/api/forge/context/providers/usage"
297961
- }));
297962
- if (!outcome.ok) return buildProxyErrorResponse(outcome.error);
297963
- return jsonUnsafe(unwrapForgeEnvelope(outcome.value), { status: 200 });
297964
- }).pipe(catchTag("AuthError", (error) => respondToAuthError(error))));
298039
+ const snapshotOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
298040
+ method: "GET",
298041
+ jwt,
298042
+ path: "/api/forge/context/providers/usage"
298043
+ }));
298044
+ if (!snapshotOutcome.ok) return buildProxyErrorResponse(snapshotOutcome.error);
298045
+ return jsonUnsafe(unwrapForgeEnvelope(snapshotOutcome.value), { status: 200 });
298046
+ }).pipe(catchTag("AuthError", (error) => respondToAuthError(error)));
298047
+ }
298048
+ const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/usage/refresh", makeRefreshProviderUsageHandler());
297965
298049
  const cmmdGetUserCodexCredentialRouteLayer = registerProxyRoute({
297966
298050
  forgePath: "/api/cmmd/providers/codex/credential",
297967
298051
  method: "GET",
@@ -308993,6 +309077,82 @@ const claudeNativeGenerationProofRouteLayer = add$1("GET", "/api/runtime/provide
308993
309077
  generationHash: yield* readUsableClaudeGenerationHash(config)
308994
309078
  });
308995
309079
  }));
309080
+ const defaultClaudeUsageRouteDependencies = {
309081
+ readCredential: async (token) => {
309082
+ const base = process.env.FORGE_CMMD_RUNTIME_CONTROL_PLANE_URL?.trim() ?? "";
309083
+ if (!base) return null;
309084
+ const response = await fetch(`${base.replace(/\/+$/u, "")}/api/forge/context/auth-runtime-claude-credential`, {
309085
+ headers: {
309086
+ authorization: `Bearer ${token}`,
309087
+ accept: "application/json"
309088
+ },
309089
+ signal: AbortSignal.timeout(2e4)
309090
+ });
309091
+ return response.ok ? response.text() : null;
309092
+ },
309093
+ createDirectory: () => mkdtemp(join(tmpdir(), "forge-claude-usage-")),
309094
+ writeCredential: (directory, credential) => writeFile(join(directory, ".credentials.json"), credential, { mode: 384 }),
309095
+ loadUsage: (directory) => fetchClaudeUsageViaOfficialClient({
309096
+ binaryPath: resolveClaudeBinaryPath("claude"),
309097
+ claudeConfigDir: directory
309098
+ }),
309099
+ removeDirectory: (directory) => rm(directory, {
309100
+ recursive: true,
309101
+ force: false
309102
+ }),
309103
+ now: () => /* @__PURE__ */ new Date()
309104
+ };
309105
+ const claudeUsageHandler = (dependencies) => gen(function* () {
309106
+ const request = yield* HttpServerRequest;
309107
+ const config = yield* ServerConfig;
309108
+ const token = claudeReadinessToken(request.headers.authorization);
309109
+ const required = completeClaudeReadinessExpectations(config);
309110
+ if (!token || !required) return unauthorizedClaudeReadinessResponse();
309111
+ const claims = verifyCmmdClaudeUsageTicket(token, required);
309112
+ if (!claims) return unauthorizedClaudeReadinessResponse();
309113
+ const claimed = claimClaudeReadinessJti({
309114
+ jti: claims.jti,
309115
+ expiresAtSeconds: claims.expiresAtSeconds,
309116
+ nowSeconds: Math.floor(Date.now() / 1e3)
309117
+ });
309118
+ if (claimed === "replayed") return unauthorizedClaudeReadinessResponse();
309119
+ if (claimed === "capacity_exhausted") return jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
309120
+ return yield* promise(async () => {
309121
+ let directory = null;
309122
+ let response = jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
309123
+ try {
309124
+ directory = await dependencies.createDirectory();
309125
+ const credentialJson = await dependencies.readCredential(token);
309126
+ if (credentialJson !== null && isClaudeSubscriptionCredential(credentialJson)) {
309127
+ await dependencies.writeCredential(directory, credentialJson);
309128
+ const usage = await dependencies.loadUsage(directory);
309129
+ response = jsonUnsafe({
309130
+ fiveHour: usage.fiveHour,
309131
+ sevenDay: usage.sevenDay,
309132
+ observedAt: dependencies.now().toISOString(),
309133
+ receipt: {
309134
+ orgId: claims.orgId,
309135
+ userId: claims.userId,
309136
+ runtimeId: claims.runtimeId,
309137
+ machineId: claims.machineId,
309138
+ credentialEpoch: claims.credentialEpoch,
309139
+ providerAccountId: claims.providerAccountId,
309140
+ credentialGenerationId: claims.generationId
309141
+ }
309142
+ }, { headers: { "cache-control": "no-store" } });
309143
+ }
309144
+ } catch {}
309145
+ if (directory === null) return response;
309146
+ try {
309147
+ await dependencies.removeDirectory(directory);
309148
+ } catch {
309149
+ return jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
309150
+ }
309151
+ return response;
309152
+ });
309153
+ });
309154
+ const createClaudeUsageRouteLayer = (dependencies = defaultClaudeUsageRouteDependencies) => add$1("POST", "/api/runtime/provider-usage/claude", claudeUsageHandler(dependencies));
309155
+ const claudeUsageRouteLayer = createClaudeUsageRouteLayer();
308996
309156
  /**
308997
309157
  * FINDING-CB1 — workspace readiness SSE endpoint.
308998
309158
  *
@@ -309336,7 +309496,7 @@ const MiscRuntimeLayerLive = mergeAll(AnalyticsServiceLayerLive, OpenLive, Serve
309336
309496
  const RuntimeDependenciesWithoutPullRequestsLive = ReactorLayerLive.pipe(provideMerge(CheckpointingLayerLive), provideMerge(GitLayerLive), provideMerge(OrchestrationLayerLive), provideMerge(ProviderLayerLive), provideMerge(TerminalLayerLive), provideMerge(AgentBrowserManagerLive), provideMerge(mergeAll(ThreadDevRuntimeLive, DevTunnelLive.pipe(provide$1(ThreadDevRuntimeLive)))), provideMerge(PersistenceLayerLive), provideMerge(KeybindingsLive), provideMerge(ProviderRegistryLive), provideMerge(mergeAll(ServerSettingsLive, UsageServiceLive.pipe(provide$1(ServerSettingsLive)))), provideMerge(WorkspaceLayerLive), provideMerge(WorkspaceReadinessStateLive), provideMerge(ProjectFaviconResolverLive), provideMerge(RepositoryIdentityResolverLive), provideMerge(ServerEnvironmentLive), provideMerge(AuthLayerLive), provideMerge(ServerSecretStoreLayerLive), provideMerge(mergeAll(CloudRedisCoordinationLive, CloudStateSyncLive.pipe(provide$1(PersistenceLayerLive)))), provideMerge(MiscRuntimeLayerLive));
309337
309497
  const RuntimeDependenciesLive = pullRequestServiceFactoryLayer.pipe(provideMerge(RuntimeDependenciesWithoutPullRequestsLive), provideMerge(cmmdProjectIdentityResolverLive.pipe(provide$1(RuntimeDependenciesWithoutPullRequestsLive))), provideMerge(pullRequestProviderRuntimeLive));
309338
309498
  const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(provideMerge(RuntimeDependenciesLive));
309339
- const makeRoutesLayer = mergeAll(authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authCommandBearerBootstrapRouteLayer, authCommandBootstrapRouteLayer, authOAuthTokenExchangeRouteLayer, authWebSocketTicketRouteLayer, authCmmdOAuthDeviceRouteLayer, authCmmdOAuthTokenRouteLayer, authCmmdPasswordTokenRouteLayer, authClientsRevokeOthersRouteLayer, authClientsRevokeRouteLayer, authClientsRouteLayer, authLogoutRouteLayer, authPairingLinksRevokeRouteLayer, authPairingLinksRouteLayer, authPairingCredentialRouteLayer, authSessionRouteLayer, authWebSocketTokenRouteLayer, authWebLoginRouteLayer, authWebCallbackRouteLayer, desktopLocalWebBridgePublishRouteLayer, desktopLocalWebBridgeBootstrapRouteLayer, desktopRelayControlPlaneRouteLayer, apiDocsHtmlRouteLayer, apiDocsOpenApiRouteLayer, pulseSignalStateListRouteLayer, pulseSignalStateUpsertRouteLayer, cmmdProfileRouteLayer, cmmdCreateBrainDocRouteLayer, cmmdUpdateTaskRouteLayer, cmmdUpsertTaskPullRequestRouteLayer, ...cmmdPullRequestRouteLayers, cmmdAddTaskCommentRouteLayer, cmmdWorkIntakeRouteLayer, cmmdWsTokenRouteLayer, cmmdSearchTasksRouteLayer, cmmdGetTaskCommentsRouteLayer, cmmdGetProjectCommentsRouteLayer, cmmdAddProjectCommentRouteLayer, cmmdUpdateProjectRouteLayer, cmmdGetOrgMembersRouteLayer, cmmdSimHostsRouteLayer, cmmdSimLeaseReadRouteLayer, cmmdSimLeaseClaimRouteLayer, cmmdSimLeaseReleaseRouteLayer, cmmdSimLeaseRenewRouteLayer, cmmdUploadTaskAttachmentRouteLayer, cmmdGetTaskAttachmentsRouteLayer, cmmdUpdateTaskCommentRouteLayer, cmmdDeleteTaskCommentRouteLayer, cmmdGetProjectRepositoryRouteLayer, cmmdListProjectRepositoriesRouteLayer, cmmdArchiveTaskRouteLayer, cmmdUnarchiveTaskRouteLayer, cmmdListTasksRouteLayer, cmmdCreateTaskRouteLayer, cmmdListCampaignsRouteLayer, cmmdGetCampaignRouteLayer, cmmdCreateCampaignRouteLayer, cmmdUpdateCampaignRouteLayer, cmmdDeleteCampaignRouteLayer, cmmdListSavedViewsRouteLayer, cmmdCreateSavedViewRouteLayer, cmmdImportSavedViewRouteLayer, cmmdUpdateSavedViewRouteLayer, cmmdDeleteSavedViewRouteLayer, cmmdListProjectsRouteLayer, cmmdGetProjectRouteLayer, cmmdCreateProjectRouteLayer, cmmdDeleteProjectRouteLayer, cmmdMoveProjectRouteLayer, cmmdGetProjectMembersRouteLayer, cmmdListWorkspaceMembersRouteLayer, cmmdAddProjectMemberRouteLayer, cmmdGetProjectMilestonesRouteLayer, cmmdCreateProjectMilestoneRouteLayer, cmmdUpdateProjectMilestoneRouteLayer, cmmdDeleteProjectMilestoneRouteLayer, cmmdGetProjectUpdatesRouteLayer, cmmdCreateProjectUpdateRouteLayer, cmmdUpdateProjectUpdateRouteLayer, cmmdDeleteProjectUpdateRouteLayer, cmmdImproveProjectContentRouteLayer, cmmdCreateProjectTaskDraftRouteLayer, cmmdGetProjectTaskDraftRouteLayer, cmmdUpdateProjectTaskDraftRouteLayer, cmmdPreviewProjectTaskDraftRouteLayer, cmmdCommitProjectTaskDraftRouteLayer, cmmdDiscardProjectTaskDraftRouteLayer, cmmdGetProjectLeadPlanRouteLayer, cmmdActivateProjectLeadAuthorityRouteLayer, cmmdGetProjectLeadReadinessRouteLayer, cmmdGetProjectLeadCapabilitiesRouteLayer, cmmdGetProjectLeadSummaryRouteLayer, cmmdGetProjectLeadDetailRouteLayer, cmmdGetProjectLeadBriefingRouteLayer, cmmdListProjectLeadEventsRouteLayer, cmmdExplainProjectLeadRouteLayer, cmmdPauseProjectLeadRouteLayer, cmmdResumeProjectLeadRouteLayer, cmmdReserveProjectLeadTaskRouteLayer, cmmdReleaseProjectLeadReservationRouteLayer, cmmdReconcileProjectLeadRouteLayer, cmmdResolveProjectLeadAttentionRouteLayer, cmmdClaimProjectLeadControllerRouteLayer, cmmdRenewProjectLeadControllerClaimRouteLayer, cmmdYieldProjectLeadControllerClaimRouteLayer, cmmdAcknowledgeProjectLeadControllerEventRouteLayer, cmmdRecordProjectLeadControllerDecisionRouteLayer, cmmdListForgeAutomationPresetsRouteLayer, cmmdListUserForgeAutomationRulesRouteLayer, cmmdCreateUserForgeAutomationRuleRouteLayer, cmmdUpdateUserForgeAutomationRuleRouteLayer, cmmdListUserForgeAutomationRunsRouteLayer, cmmdStartUserForgeAutomationRunRouteLayer, cmmdListForgeAutomationRulesRouteLayer, cmmdCreateForgeAutomationRuleRouteLayer, cmmdUpdateForgeAutomationRuleRouteLayer, cmmdListForgeAutomationRunsRouteLayer, cmmdStartForgeAutomationRunRouteLayer, cmmdGetForgeAutomationRunRouteLayer, cmmdRetryForgeAutomationRunRouteLayer, cmmdCancelForgeAutomationRunRouteLayer, cmmdApproveForgeAutomationEscalationRouteLayer, cmmdRejectForgeAutomationEscalationRouteLayer, cmmdListProjectAgentMembersRouteLayer, cmmdCreateProjectAgentMemberRouteLayer, cmmdGetProjectAgentMemberRouteLayer, cmmdRenameProjectAgentMemberRouteLayer, cmmdRetireProjectAgentMemberRouteLayer, cmmdUpdateProjectAgentMemberAvatarRouteLayer, cmmdListProjectAgentMemberInstancesRouteLayer, cmmdPreviewProjectAgentMemberConsolidationRouteLayer, cmmdApplyProjectAgentMemberConsolidationRouteLayer, cmmdPutProjectTaskAssignmentRouteLayer, cmmdListProjectBoardRouteLayer, cmmdGetProjectTaskWorkflowRouteLayer, cmmdUpdateProjectTaskWorkflowRouteLayer, cmmdCreateProjectBoardTaskRouteLayer, cmmdUpdateProjectBoardTaskRouteLayer, cmmdUpdateProjectBoardTaskStatusRouteLayer, cmmdListTaskExecutionOptionsRouteLayer, cmmdCreateTaskWorkSessionRouteLayer, cmmdListProjectWorkSessionsRouteLayer, cmmdGetWorkSessionRouteLayer, cmmdUpdateWorkSessionRouteLayer, cmmdAttachWorkSessionThreadRouteLayer, cmmdListTaskConversationsRouteLayer, cmmdLinkTaskConversationRouteLayer, cmmdGetTaskHistoryRouteLayer, cmmdGetTaskConversationRouteLayer, cmmdSpawnForgeThreadFromBoardTaskRouteLayer, cmmdListCenterBoardRouteLayer, cmmdCreateCenterBoardTaskRouteLayer, cmmdCreateFeedbackRouteLayer, cmmdUpdateCenterBoardTaskRouteLayer, cmmdMoveCenterBoardTaskRouteLayer, cmmdMoveProjectBoardTaskRouteLayer, cmmdArchiveProjectBoardTaskRouteLayer, cmmdUnarchiveProjectBoardTaskRouteLayer, cmmdArchiveCenterBoardTaskRouteLayer, cmmdUnarchiveCenterBoardTaskRouteLayer, cmmdBootstrapRouteLayer, cmmdGetAccountPreferencesRouteLayer, cmmdUpdateAccountPreferencesRouteLayer, cmmdGetOrgProviderPolicyRouteLayer, cmmdListChatsRouteLayer, cmmdGetChatRouteLayer, cmmdListDevicesRouteLayer, runtimeReplicationStatusRouteLayer, cmmdRegisterDeviceRouteLayer, cmmdHeartbeatRuntimeRouteLayer, cmmdGrantRuntimeAccessRouteLayer, cmmdRevokeRuntimeAccessRouteLayer, cmmdCreateRelayControlRouteLayer, cmmdCreateRelayActionGrantRouteLayer, cmmdReplaceRuntimeInventoryRouteLayer, cmmdListRuntimeInventoryRouteLayer, cmmdGetRuntimeDiagnosticsRouteLayer, cmmdProvisionAuthRuntimeRouteLayer, cmmdGetAuthRuntimeRouteLayer, cmmdDestroyAuthRuntimeRouteLayer, cmmdConnectAuthRuntimeRouteLayer, cmmdGetProviderAccountsRouteLayer, cmmdDeleteProviderAccountRouteLayer, cmmdSetProviderAccountDefaultRouteLayer, cmmdGetProviderUsageRouteLayer, cmmdRefreshProviderUsageRouteLayer, cmmdGetUserCodexCredentialRouteLayer, cmmdDeleteUserCodexCredentialRouteLayer, cmmdGetUserClaudeCredentialRouteLayer, cmmdDeleteUserClaudeCredentialRouteLayer, cmmdGetClaudeRuntimeReadinessRouteLayer, cmmdAppendRuntimeThreadEventsRouteLayer, cmmdGetRuntimeThreadReplicaRouteLayer, cmmdRenameDeviceRouteLayer, cmmdRevokeDeviceRouteLayer, cmmdInstallConnectorRouteLayer, cmmdListConnectorsRouteLayer, cmmdForgeCloudProjectsListRouteLayer, cmmdForgeCloudProjectsEventsRouteLayer, cmmdForgeCloudProjectRegisterRouteLayer, cmmdForgeCloudProjectUnregisterRouteLayer, cmmdForgeCloudProjectLifecyclePreflightRouteLayer, cmmdForgeCloudProjectRemovalRouteLayer, cmmdForgeCloudProjectRemovalPreviewRouteLayer, cmmdForgeCloudProjectRemovalReceiptRouteLayer, cmmdForgeRuntimesEnsureRouteLayer, cmmdForgeRuntimesConnectRouteLayer, ownerRuntimeCodexReadinessRouteLayer, cmmdForgeRuntimesStatusRouteLayer, cmmdForgeRuntimesStartRouteLayer, cmmdForgeRuntimesStopRouteLayer, cmmdForgeRuntimesRecycleRouteLayer, cmmdForgeRuntimesUpdateCommitRouteLayer, cmmdForgeRuntimesDestroyRouteLayer, cmmdGetTaskRouteLayer, commandUpdateTaskRouteLayer, mobileProviderCatalogRouteLayer, cmmdUsageSummaryRouteLayer, cmmdBillingRouteLayer, cmmdBillingSeriesRouteLayer, attachmentsRouteLayer, orchestrationDispatchRouteLayer, orchestrationCmmdWorkRunEventRouteLayer, orchestrationAutomationStartThreadRouteLayer, orchestrationAutomationRebindRouteLayer, orchestrationAutomationTerminalReconcileRouteLayer, mobileGitRunStackedActionRouteLayer, pullRequestDiffRouteLayer, orchestrationSnapshotRouteLayer, localAutomationListRouteLayer, localAutomationCreateRouteLayer, localAutomationUpdateRouteLayer, localAutomationDeleteRouteLayer, localAutomationRunRouteLayer, otlpTracesProxyRouteLayer, devTunnelProxyRouteLayer, devTunnelLocalPortProxyRouteLayer, projectFaviconRouteLayer, serverEnvironmentRouteLayer, browserWebRtcReadinessRouteLayer, staticAndDevRouteLayer, githubStatusRouteLayer, githubAuthorizeUrlRouteLayer, githubDisconnectRouteLayer, githubReposRouteLayer, githubCloneRouteLayer, githubCloneJobStartRouteLayer, githubCloneJobStatusRouteLayer, githubRefreshCredentialsRouteLayer, githubToolConfirmationApproveRouteLayer, projectLinkGetRouteLayer, projectLinkListRouteLayer, projectLinkSetRouteLayer, projectLinkDeleteRouteLayer, cmmdWorkspacesRouteLayer, cmmdCampaignsRouteLayer, cmmdProjectLinksRouteLayer, cmmdEnsureGitHubProjectContextRouteLayer, cmmdProjectRepositoryEnsureRouteLayer, cmmdProjectsGetRouteLayer, cmmdProjectsCreateRouteLayer, workspaceReadinessRouteLayer, runtimeLivenessRouteLayer, claudeNativeGenerationProofRouteLayer, codexRuntimeProviderReadinessRouteLayer, runtimeDiagnosticsRouteLayer, cloudFoldersRouteLayer, cloudProjectCreateRouteLayer, gitUrlCloneRouteLayer, websocketRpcRouteLayer).pipe(provide$1(browserApiCorsLayer));
309499
+ const makeRoutesLayer = mergeAll(authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authCommandBearerBootstrapRouteLayer, authCommandBootstrapRouteLayer, authOAuthTokenExchangeRouteLayer, authWebSocketTicketRouteLayer, authCmmdOAuthDeviceRouteLayer, authCmmdOAuthTokenRouteLayer, authCmmdPasswordTokenRouteLayer, authClientsRevokeOthersRouteLayer, authClientsRevokeRouteLayer, authClientsRouteLayer, authLogoutRouteLayer, authPairingLinksRevokeRouteLayer, authPairingLinksRouteLayer, authPairingCredentialRouteLayer, authSessionRouteLayer, authWebSocketTokenRouteLayer, authWebLoginRouteLayer, authWebCallbackRouteLayer, desktopLocalWebBridgePublishRouteLayer, desktopLocalWebBridgeBootstrapRouteLayer, desktopRelayControlPlaneRouteLayer, apiDocsHtmlRouteLayer, apiDocsOpenApiRouteLayer, pulseSignalStateListRouteLayer, pulseSignalStateUpsertRouteLayer, cmmdProfileRouteLayer, cmmdCreateBrainDocRouteLayer, cmmdUpdateTaskRouteLayer, cmmdUpsertTaskPullRequestRouteLayer, ...cmmdPullRequestRouteLayers, cmmdAddTaskCommentRouteLayer, cmmdWorkIntakeRouteLayer, cmmdWsTokenRouteLayer, cmmdSearchTasksRouteLayer, cmmdGetTaskCommentsRouteLayer, cmmdGetProjectCommentsRouteLayer, cmmdAddProjectCommentRouteLayer, cmmdUpdateProjectRouteLayer, cmmdGetOrgMembersRouteLayer, cmmdSimHostsRouteLayer, cmmdSimLeaseReadRouteLayer, cmmdSimLeaseClaimRouteLayer, cmmdSimLeaseReleaseRouteLayer, cmmdSimLeaseRenewRouteLayer, cmmdUploadTaskAttachmentRouteLayer, cmmdGetTaskAttachmentsRouteLayer, cmmdUpdateTaskCommentRouteLayer, cmmdDeleteTaskCommentRouteLayer, cmmdGetProjectRepositoryRouteLayer, cmmdListProjectRepositoriesRouteLayer, cmmdArchiveTaskRouteLayer, cmmdUnarchiveTaskRouteLayer, cmmdListTasksRouteLayer, cmmdCreateTaskRouteLayer, cmmdListCampaignsRouteLayer, cmmdGetCampaignRouteLayer, cmmdCreateCampaignRouteLayer, cmmdUpdateCampaignRouteLayer, cmmdDeleteCampaignRouteLayer, cmmdListSavedViewsRouteLayer, cmmdCreateSavedViewRouteLayer, cmmdImportSavedViewRouteLayer, cmmdUpdateSavedViewRouteLayer, cmmdDeleteSavedViewRouteLayer, cmmdListProjectsRouteLayer, cmmdGetProjectRouteLayer, cmmdCreateProjectRouteLayer, cmmdDeleteProjectRouteLayer, cmmdMoveProjectRouteLayer, cmmdGetProjectMembersRouteLayer, cmmdListWorkspaceMembersRouteLayer, cmmdAddProjectMemberRouteLayer, cmmdGetProjectMilestonesRouteLayer, cmmdCreateProjectMilestoneRouteLayer, cmmdUpdateProjectMilestoneRouteLayer, cmmdDeleteProjectMilestoneRouteLayer, cmmdGetProjectUpdatesRouteLayer, cmmdCreateProjectUpdateRouteLayer, cmmdUpdateProjectUpdateRouteLayer, cmmdDeleteProjectUpdateRouteLayer, cmmdImproveProjectContentRouteLayer, cmmdCreateProjectTaskDraftRouteLayer, cmmdGetProjectTaskDraftRouteLayer, cmmdUpdateProjectTaskDraftRouteLayer, cmmdPreviewProjectTaskDraftRouteLayer, cmmdCommitProjectTaskDraftRouteLayer, cmmdDiscardProjectTaskDraftRouteLayer, cmmdGetProjectLeadPlanRouteLayer, cmmdActivateProjectLeadAuthorityRouteLayer, cmmdGetProjectLeadReadinessRouteLayer, cmmdGetProjectLeadCapabilitiesRouteLayer, cmmdGetProjectLeadSummaryRouteLayer, cmmdGetProjectLeadDetailRouteLayer, cmmdGetProjectLeadBriefingRouteLayer, cmmdListProjectLeadEventsRouteLayer, cmmdExplainProjectLeadRouteLayer, cmmdPauseProjectLeadRouteLayer, cmmdResumeProjectLeadRouteLayer, cmmdReserveProjectLeadTaskRouteLayer, cmmdReleaseProjectLeadReservationRouteLayer, cmmdReconcileProjectLeadRouteLayer, cmmdResolveProjectLeadAttentionRouteLayer, cmmdClaimProjectLeadControllerRouteLayer, cmmdRenewProjectLeadControllerClaimRouteLayer, cmmdYieldProjectLeadControllerClaimRouteLayer, cmmdAcknowledgeProjectLeadControllerEventRouteLayer, cmmdRecordProjectLeadControllerDecisionRouteLayer, cmmdListForgeAutomationPresetsRouteLayer, cmmdListUserForgeAutomationRulesRouteLayer, cmmdCreateUserForgeAutomationRuleRouteLayer, cmmdUpdateUserForgeAutomationRuleRouteLayer, cmmdListUserForgeAutomationRunsRouteLayer, cmmdStartUserForgeAutomationRunRouteLayer, cmmdListForgeAutomationRulesRouteLayer, cmmdCreateForgeAutomationRuleRouteLayer, cmmdUpdateForgeAutomationRuleRouteLayer, cmmdListForgeAutomationRunsRouteLayer, cmmdStartForgeAutomationRunRouteLayer, cmmdGetForgeAutomationRunRouteLayer, cmmdRetryForgeAutomationRunRouteLayer, cmmdCancelForgeAutomationRunRouteLayer, cmmdApproveForgeAutomationEscalationRouteLayer, cmmdRejectForgeAutomationEscalationRouteLayer, cmmdListProjectAgentMembersRouteLayer, cmmdCreateProjectAgentMemberRouteLayer, cmmdGetProjectAgentMemberRouteLayer, cmmdRenameProjectAgentMemberRouteLayer, cmmdRetireProjectAgentMemberRouteLayer, cmmdUpdateProjectAgentMemberAvatarRouteLayer, cmmdListProjectAgentMemberInstancesRouteLayer, cmmdPreviewProjectAgentMemberConsolidationRouteLayer, cmmdApplyProjectAgentMemberConsolidationRouteLayer, cmmdPutProjectTaskAssignmentRouteLayer, cmmdListProjectBoardRouteLayer, cmmdGetProjectTaskWorkflowRouteLayer, cmmdUpdateProjectTaskWorkflowRouteLayer, cmmdCreateProjectBoardTaskRouteLayer, cmmdUpdateProjectBoardTaskRouteLayer, cmmdUpdateProjectBoardTaskStatusRouteLayer, cmmdListTaskExecutionOptionsRouteLayer, cmmdCreateTaskWorkSessionRouteLayer, cmmdListProjectWorkSessionsRouteLayer, cmmdGetWorkSessionRouteLayer, cmmdUpdateWorkSessionRouteLayer, cmmdAttachWorkSessionThreadRouteLayer, cmmdListTaskConversationsRouteLayer, cmmdLinkTaskConversationRouteLayer, cmmdGetTaskHistoryRouteLayer, cmmdGetTaskConversationRouteLayer, cmmdSpawnForgeThreadFromBoardTaskRouteLayer, cmmdListCenterBoardRouteLayer, cmmdCreateCenterBoardTaskRouteLayer, cmmdCreateFeedbackRouteLayer, cmmdUpdateCenterBoardTaskRouteLayer, cmmdMoveCenterBoardTaskRouteLayer, cmmdMoveProjectBoardTaskRouteLayer, cmmdArchiveProjectBoardTaskRouteLayer, cmmdUnarchiveProjectBoardTaskRouteLayer, cmmdArchiveCenterBoardTaskRouteLayer, cmmdUnarchiveCenterBoardTaskRouteLayer, cmmdBootstrapRouteLayer, cmmdGetAccountPreferencesRouteLayer, cmmdUpdateAccountPreferencesRouteLayer, cmmdGetOrgProviderPolicyRouteLayer, cmmdListChatsRouteLayer, cmmdGetChatRouteLayer, cmmdListDevicesRouteLayer, runtimeReplicationStatusRouteLayer, cmmdRegisterDeviceRouteLayer, cmmdHeartbeatRuntimeRouteLayer, cmmdGrantRuntimeAccessRouteLayer, cmmdRevokeRuntimeAccessRouteLayer, cmmdCreateRelayControlRouteLayer, cmmdCreateRelayActionGrantRouteLayer, cmmdReplaceRuntimeInventoryRouteLayer, cmmdListRuntimeInventoryRouteLayer, cmmdGetRuntimeDiagnosticsRouteLayer, cmmdProvisionAuthRuntimeRouteLayer, cmmdGetAuthRuntimeRouteLayer, cmmdDestroyAuthRuntimeRouteLayer, cmmdConnectAuthRuntimeRouteLayer, cmmdGetProviderAccountsRouteLayer, cmmdDeleteProviderAccountRouteLayer, cmmdSetProviderAccountDefaultRouteLayer, cmmdGetProviderUsageRouteLayer, cmmdRefreshProviderUsageRouteLayer, cmmdGetUserCodexCredentialRouteLayer, cmmdDeleteUserCodexCredentialRouteLayer, cmmdGetUserClaudeCredentialRouteLayer, cmmdDeleteUserClaudeCredentialRouteLayer, cmmdGetClaudeRuntimeReadinessRouteLayer, cmmdAppendRuntimeThreadEventsRouteLayer, cmmdGetRuntimeThreadReplicaRouteLayer, cmmdRenameDeviceRouteLayer, cmmdRevokeDeviceRouteLayer, cmmdInstallConnectorRouteLayer, cmmdListConnectorsRouteLayer, cmmdForgeCloudProjectsListRouteLayer, cmmdForgeCloudProjectsEventsRouteLayer, cmmdForgeCloudProjectRegisterRouteLayer, cmmdForgeCloudProjectUnregisterRouteLayer, cmmdForgeCloudProjectLifecyclePreflightRouteLayer, cmmdForgeCloudProjectRemovalRouteLayer, cmmdForgeCloudProjectRemovalPreviewRouteLayer, cmmdForgeCloudProjectRemovalReceiptRouteLayer, cmmdForgeRuntimesEnsureRouteLayer, cmmdForgeRuntimesConnectRouteLayer, ownerRuntimeCodexReadinessRouteLayer, cmmdForgeRuntimesStatusRouteLayer, cmmdForgeRuntimesStartRouteLayer, cmmdForgeRuntimesStopRouteLayer, cmmdForgeRuntimesRecycleRouteLayer, cmmdForgeRuntimesUpdateCommitRouteLayer, cmmdForgeRuntimesDestroyRouteLayer, cmmdGetTaskRouteLayer, commandUpdateTaskRouteLayer, mobileProviderCatalogRouteLayer, cmmdUsageSummaryRouteLayer, cmmdBillingRouteLayer, cmmdBillingSeriesRouteLayer, attachmentsRouteLayer, orchestrationDispatchRouteLayer, orchestrationCmmdWorkRunEventRouteLayer, orchestrationAutomationStartThreadRouteLayer, orchestrationAutomationRebindRouteLayer, orchestrationAutomationTerminalReconcileRouteLayer, mobileGitRunStackedActionRouteLayer, pullRequestDiffRouteLayer, orchestrationSnapshotRouteLayer, localAutomationListRouteLayer, localAutomationCreateRouteLayer, localAutomationUpdateRouteLayer, localAutomationDeleteRouteLayer, localAutomationRunRouteLayer, otlpTracesProxyRouteLayer, devTunnelProxyRouteLayer, devTunnelLocalPortProxyRouteLayer, projectFaviconRouteLayer, serverEnvironmentRouteLayer, browserWebRtcReadinessRouteLayer, staticAndDevRouteLayer, githubStatusRouteLayer, githubAuthorizeUrlRouteLayer, githubDisconnectRouteLayer, githubReposRouteLayer, githubCloneRouteLayer, githubCloneJobStartRouteLayer, githubCloneJobStatusRouteLayer, githubRefreshCredentialsRouteLayer, githubToolConfirmationApproveRouteLayer, projectLinkGetRouteLayer, projectLinkListRouteLayer, projectLinkSetRouteLayer, projectLinkDeleteRouteLayer, cmmdWorkspacesRouteLayer, cmmdCampaignsRouteLayer, cmmdProjectLinksRouteLayer, cmmdEnsureGitHubProjectContextRouteLayer, cmmdProjectRepositoryEnsureRouteLayer, cmmdProjectsGetRouteLayer, cmmdProjectsCreateRouteLayer, workspaceReadinessRouteLayer, runtimeLivenessRouteLayer, claudeNativeGenerationProofRouteLayer, claudeUsageRouteLayer, codexRuntimeProviderReadinessRouteLayer, runtimeDiagnosticsRouteLayer, cloudFoldersRouteLayer, cloudProjectCreateRouteLayer, gitUrlCloneRouteLayer, websocketRpcRouteLayer).pipe(provide$1(browserApiCorsLayer));
309340
309500
  const runServer = launch$1(unwrap(gen(function* () {
309341
309501
  const config = yield* ServerConfig;
309342
309502
  fixPath();
@@ -310266,7 +310426,7 @@ const connectLoginCommand = make$32("login", {
310266
310426
  })).json();
310267
310427
  },
310268
310428
  openBrowser: async (url) => {
310269
- const open = (await import("./open-FIgTDosf.mjs")).default;
310429
+ const open = (await import("./open-D8mGyWmt.mjs")).default;
310270
310430
  await open(url);
310271
310431
  return true;
310272
310432
  },