@cmmd-center/forge 0.9.12 → 0.9.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/bin.cjs +331 -140
  2. package/dist/bin.mjs +328 -138
  3. package/dist/client/assets/{CanvasPanel-CNtJjkFi.js → CanvasPanel-Dc8j2ouo.js} +2 -2
  4. package/dist/client/assets/{CompositeItem-BYLWaYF6.js → CompositeItem-Cn5DdObI.js} +2 -2
  5. package/dist/client/assets/{DiffPanel-BilYcllQ.js → DiffPanel-CRdkVPEz.js} +3 -3
  6. package/dist/client/assets/{DiffPanel.logic-Caky6F_f.js → DiffPanel.logic-BIPcNz_o.js} +2 -2
  7. package/dist/client/assets/DiffPanelShell-tIdXu7mn.js +2531 -0
  8. package/dist/client/assets/{DiffWorkerPoolProvider-CTUAka0e.js → DiffWorkerPoolProvider-tFSGuVfC.js} +51 -51
  9. package/dist/client/assets/PullRequestCodePanel-inwJYfZC.js +5 -0
  10. package/dist/client/assets/{Virtualizer-CFg_81uW.js → Virtualizer-DeKxnAeU.js} +2 -2
  11. package/dist/client/assets/{canvasStateStore-BdDORpO9.js → canvasStateStore-Dlm4tanv.js} +2 -2
  12. package/dist/client/assets/{cmmdAuthRedirect-CrxxHqHr.js → cmmdAuthRedirect-C1FjO86g.js} +2 -2
  13. package/dist/client/assets/index-4a61qSZ4.css +1 -0
  14. package/dist/client/assets/{index-BUY6pZDx.js → index-Bublmabf.js} +59 -59
  15. package/dist/client/assets/src-DljvAdHI.js +3 -0
  16. package/dist/client/assets/{toggle-BUlphA25.js → toggle-It2CvaLA.js} +2 -2
  17. package/dist/client/assets/{useTriggerFocusGuards-D2jbdUMe.js → useTriggerFocusGuards-DfUh9uvu.js} +2 -2
  18. package/dist/client/index.html +11 -11
  19. package/dist/runtimeBootstrap.cjs +1 -1
  20. package/dist/runtimeBootstrap.mjs +1 -1
  21. package/dist/{runtimeControlAuthority-45DPznyK.cjs → runtimeControlAuthority-BdIovv-r.cjs} +28 -1
  22. package/dist/{runtimeControlAuthority-akIBTI-S.mjs → runtimeControlAuthority-COHmz_WT.mjs} +23 -2
  23. package/package.json +3 -2
  24. package/dist/client/assets/DiffPanelShell-DXP_jwHj.js +0 -2531
  25. package/dist/client/assets/PullRequestCodePanel-4bf4PYHp.js +0 -5
  26. package/dist/client/assets/index-BydoCpMZ.css +0 -1
  27. package/dist/client/assets/src-Dqe_-4FQ.js +0 -3
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";
@@ -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),
@@ -64870,7 +64870,7 @@ function normalizeNumberish(value) {
64870
64870
  }
64871
64871
  //#endregion
64872
64872
  //#region package.json
64873
- var version$1 = "0.9.12";
64873
+ var version$1 = "0.9.14";
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;
@@ -69135,22 +69135,22 @@ const EMPTY_PARSED_ERROR = {
69135
69135
  message: null,
69136
69136
  raw: null
69137
69137
  };
69138
- function asRecord$10(value) {
69138
+ function asRecord$11(value) {
69139
69139
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
69140
69140
  }
69141
69141
  function readTrimmedString$1(value) {
69142
69142
  return (typeof value === "string" ? value.trim() : "") || null;
69143
69143
  }
69144
69144
  function readErrorEnvelope(record) {
69145
- return asRecord$10(record["error"]);
69145
+ return asRecord$11(record["error"]);
69146
69146
  }
69147
69147
  function readUpstreamErrorCode(body) {
69148
- const record = asRecord$10(body);
69148
+ const record = asRecord$11(body);
69149
69149
  if (record === null) return null;
69150
69150
  return readTrimmedString$1(record["code"]) ?? readTrimmedString$1(readErrorEnvelope(record)?.["code"]);
69151
69151
  }
69152
69152
  function readErrorMessage$2(raw) {
69153
- const record = asRecord$10(raw);
69153
+ const record = asRecord$11(raw);
69154
69154
  if (record === null) return null;
69155
69155
  const error = record["error"];
69156
69156
  const nestedMessage = readErrorEnvelope(record)?.["message"];
@@ -69782,7 +69782,7 @@ function buildProxyErrorResponse(error) {
69782
69782
  code: error.code
69783
69783
  }, { status: 403 });
69784
69784
  if (error instanceof CmmdProxyRequestError) {
69785
- const status = error.status >= 500 ? 502 : error.status;
69785
+ const status = error.status === 503 ? 503 : error.status >= 500 ? 502 : error.status;
69786
69786
  return jsonUnsafe({
69787
69787
  error: error.detail ?? "CMMD REST request failed.",
69788
69788
  code: error.code,
@@ -96479,7 +96479,7 @@ const EMPTY_PLAN_VALUES = new Set([
96479
96479
  "none",
96480
96480
  "null"
96481
96481
  ]);
96482
- function asRecord$9(value) {
96482
+ function asRecord$10(value) {
96483
96483
  if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
96484
96484
  return value;
96485
96485
  }
@@ -96496,7 +96496,7 @@ function decodeJwtClaims(token) {
96496
96496
  try {
96497
96497
  const decoded = Buffer.from(payload, "base64url");
96498
96498
  if (decoded.byteLength > MAX_CLAIMS_BYTES) return void 0;
96499
- return asRecord$9(JSON.parse(decoded.toString("utf8")));
96499
+ return asRecord$10(JSON.parse(decoded.toString("utf8")));
96500
96500
  } catch {
96501
96501
  return;
96502
96502
  }
@@ -96518,7 +96518,7 @@ function findPlanType(claims) {
96518
96518
  const direct = fromRecord(claims);
96519
96519
  if (direct) return direct;
96520
96520
  for (const value of Object.values(claims)) {
96521
- const nested = asRecord$9(value);
96521
+ const nested = asRecord$10(value);
96522
96522
  if (!nested) continue;
96523
96523
  const found = fromRecord(nested);
96524
96524
  if (found) return found;
@@ -96535,7 +96535,7 @@ function readCodexAuthIdentity(authJson) {
96535
96535
  } catch {
96536
96536
  return {};
96537
96537
  }
96538
- const claims = decodeJwtClaims(asRecord$9(asRecord$9(parsed)?.tokens)?.id_token);
96538
+ const claims = decodeJwtClaims(asRecord$10(asRecord$10(parsed)?.tokens)?.id_token);
96539
96539
  if (!claims) return {};
96540
96540
  const email = findEmail(claims);
96541
96541
  const planType = findPlanType(claims);
@@ -96732,11 +96732,6 @@ function recordClaudeRateLimitTelemetry(info, generationHash = currentClaudeUsag
96732
96732
  observedAt: [fiveHourObservedAt, sevenDayObservedAt].filter((value) => value !== null).toSorted()[0]
96733
96733
  });
96734
96734
  }
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
96735
  //#endregion
96741
96736
  //#region src/providerAuth/ClaudeDeviceAuth.ts
96742
96737
  const AUTHORIZE_URL_PATTERN = /https:\/\/[^\s]*\/oauth\/authorize\?[^\s]+/u;
@@ -96825,6 +96820,7 @@ const runClaudeLogout = (runtime) => new Promise((resolve, reject) => {
96825
96820
  const execFileAsync$4 = promisify$1(execFile);
96826
96821
  const USAGE_ARGS = [
96827
96822
  "--safe-mode",
96823
+ "--no-session-persistence",
96828
96824
  "-p",
96829
96825
  "/usage",
96830
96826
  "--output-format",
@@ -96892,7 +96888,7 @@ function zonedDateTimeToUtc(input) {
96892
96888
  }
96893
96889
  }
96894
96890
  function parseResetAt(value, now) {
96895
- const match = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{1,2}) at (\d{1,2})(?::(\d{2}))?(am|pm) \(([^)]+)\)$/.exec(value);
96891
+ const match = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{1,2})(?:,| at) (\d{1,2})(?::(\d{2}))?(am|pm) \(([^)]+)\)$/.exec(value);
96896
96892
  if (!match) return null;
96897
96893
  const month = MONTH_BY_NAME[match[1]];
96898
96894
  if (month === void 0) return null;
@@ -97114,17 +97110,23 @@ async function loadClaudeAccountMetadataFromCli(homePath) {
97114
97110
  function extractClaudeCredentialGenerationId(response) {
97115
97111
  if (typeof response !== "object" || response === null || !("data" in response)) return null;
97116
97112
  const data = response.data;
97117
- if (typeof data !== "object" || data === null || !("connected" in data) || !data.connected) return null;
97118
- if (!("generationId" in data) || typeof data.generationId !== "string") return null;
97119
- const generationId = data.generationId.trim();
97113
+ if (typeof data !== "object" || data === null) return null;
97114
+ if ("connected" in data && data.connected === true && "generationId" in data && typeof data.generationId === "string") {
97115
+ const generationId = data.generationId.trim();
97116
+ return generationId.length > 0 ? generationId : null;
97117
+ }
97118
+ if (!("account" in data) || typeof data.account !== "object" || data.account === null) return null;
97119
+ const account = data.account;
97120
+ if (!("credentialGenerationId" in account) || typeof account.credentialGenerationId !== "string") return null;
97121
+ const generationId = account.credentialGenerationId.trim();
97120
97122
  return generationId.length > 0 ? generationId : null;
97121
97123
  }
97122
97124
  function extractClaudeProviderAccountId(response) {
97123
- const generationId = extractClaudeCredentialGenerationId(response);
97124
- if (generationId !== null) return generationId;
97125
97125
  if (typeof response !== "object" || response === null || !("data" in response)) return null;
97126
97126
  const data = response.data;
97127
- if (typeof data !== "object" || data === null || !("account" in data)) return null;
97127
+ if (typeof data !== "object" || data === null) return null;
97128
+ if ("connected" in data && data.connected === true) return extractClaudeCredentialGenerationId(response);
97129
+ if (!("account" in data)) return null;
97128
97130
  const account = data.account;
97129
97131
  if (typeof account !== "object" || account === null || !("providerAccountId" in account) || typeof account.providerAccountId !== "string") return null;
97130
97132
  const providerAccountId = account.providerAccountId.trim();
@@ -97152,7 +97154,7 @@ async function publishClaudeUsageAfterSync(input) {
97152
97154
  path: input.auth.path === AUTH_RUNTIME_CLAUDE_CREDENTIAL_PATH ? AUTH_RUNTIME_CLAUDE_USAGE_PATH : USER_CLAUDE_USAGE_PATH,
97153
97155
  body: {
97154
97156
  providerAccountId: input.providerAccountId,
97155
- credentialGenerationId: input.providerAccountId,
97157
+ credentialGenerationId: input.credentialGenerationId,
97156
97158
  accountEmail: input.accountEmail,
97157
97159
  accountDisplayName: input.accountDisplayName,
97158
97160
  planType: input.planType,
@@ -97169,11 +97171,13 @@ async function publishClaudeUsageAfterSync(input) {
97169
97171
  }
97170
97172
  async function finalizeClaudeCredentialSync(input) {
97171
97173
  const providerAccountId = extractClaudeProviderAccountId(input.response);
97172
- if (providerAccountId === null) return null;
97173
- if (input.auth.path === USER_CLAUDE_CREDENTIAL_PATH) setLocalClaudeUsageGeneration(providerAccountId);
97174
+ const credentialGenerationId = extractClaudeCredentialGenerationId(input.response);
97175
+ if (providerAccountId === null || credentialGenerationId === null) return null;
97176
+ if (input.auth.path === USER_CLAUDE_CREDENTIAL_PATH) setLocalClaudeUsageGeneration(credentialGenerationId);
97174
97177
  return publishClaudeUsageAfterSync({
97175
97178
  auth: input.auth,
97176
97179
  providerAccountId,
97180
+ credentialGenerationId,
97177
97181
  accountEmail: input.accountEmail,
97178
97182
  accountDisplayName: input.accountDisplayName,
97179
97183
  planType: input.planType,
@@ -203516,7 +203520,7 @@ const collectStreamAsString = (stream) => stream.pipe(decodeText$1(), runFold(()
203516
203520
  //#region src/orchestration/WorkerPlanCodexTools.ts
203517
203521
  const FORGE_PROPOSE_WORKER_TASKS_TOOL = "forge_propose_worker_tasks";
203518
203522
  const MAX_WORKER_PLAN_ITEMS = 5;
203519
- function asRecord$8(value) {
203523
+ function asRecord$9(value) {
203520
203524
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
203521
203525
  }
203522
203526
  function readTrimmedString(value) {
@@ -203532,7 +203536,7 @@ function isValidWorkerSummary(value) {
203532
203536
  return value !== void 0 && value.length > 0 && value.length <= 4e3;
203533
203537
  }
203534
203538
  function decodeWorkerPlanItem(value) {
203535
- const item = asRecord$8(value);
203539
+ const item = asRecord$9(value);
203536
203540
  const slug = readTrimmedString(item?.slug);
203537
203541
  const title = readTrimmedString(item?.title);
203538
203542
  const summary = readTrimmedString(item?.summary);
@@ -203596,7 +203600,7 @@ function createWorkerPlanDynamicTools() {
203596
203600
  function createWorkerPlanDynamicToolHandler() {
203597
203601
  return async (input) => {
203598
203602
  if (input.tool !== "forge_propose_worker_tasks") throw new Error(`Unsupported worker-plan tool: ${input.tool}`);
203599
- if (!decodeWorkerPlanItems(asRecord$8(input.arguments)?.items)) throw new Error("Worker plans require one to five unique, fully described items.");
203603
+ if (!decodeWorkerPlanItems(asRecord$9(input.arguments)?.items)) throw new Error("Worker plans require one to five unique, fully described items.");
203600
203604
  return {
203601
203605
  success: true,
203602
203606
  contentItems: [{
@@ -205314,25 +205318,25 @@ const AUTH_METHOD_CONTAINER_KEYS = [
205314
205318
  /** Lift an unknown value into `Option<string>` if it is a non-empty string. */
205315
205319
  const asNonEmptyString = (v) => typeof v === "string" && v.length > 0 ? some(v) : none$4();
205316
205320
  /** Lift an unknown value into `Option<Record>` if it is a plain object. */
205317
- const asRecord$7 = (v) => typeof v === "object" && v !== null && !globalThis.Array.isArray(v) ? some(v) : none$4();
205321
+ const asRecord$8 = (v) => typeof v === "object" && v !== null && !globalThis.Array.isArray(v) ? some(v) : none$4();
205318
205322
  /**
205319
205323
  * Walk an unknown parsed JSON value looking for a subscription/plan
205320
205324
  * identifier, returning the first match as an `Option`.
205321
205325
  */
205322
205326
  function findSubscriptionType(value) {
205323
205327
  if (globalThis.Array.isArray(value)) return firstSomeOf(value.map(findSubscriptionType));
205324
- return asRecord$7(value).pipe(flatMap$2((record) => {
205328
+ return asRecord$8(value).pipe(flatMap$2((record) => {
205325
205329
  const direct = firstSomeOf(SUBSCRIPTION_TYPE_KEYS.map((key) => asNonEmptyString(record[key])));
205326
205330
  if (isSome(direct)) return direct;
205327
- return firstSomeOf(SUBSCRIPTION_CONTAINER_KEYS.map((key) => asRecord$7(record[key]).pipe(flatMap$2(findSubscriptionType))));
205331
+ return firstSomeOf(SUBSCRIPTION_CONTAINER_KEYS.map((key) => asRecord$8(record[key]).pipe(flatMap$2(findSubscriptionType))));
205328
205332
  }));
205329
205333
  }
205330
205334
  function findAuthMethod(value) {
205331
205335
  if (globalThis.Array.isArray(value)) return firstSomeOf(value.map(findAuthMethod));
205332
- return asRecord$7(value).pipe(flatMap$2((record) => {
205336
+ return asRecord$8(value).pipe(flatMap$2((record) => {
205333
205337
  const direct = firstSomeOf(AUTH_METHOD_KEYS.map((key) => asNonEmptyString(record[key])));
205334
205338
  if (isSome(direct)) return direct;
205335
- return firstSomeOf(AUTH_METHOD_CONTAINER_KEYS.map((key) => asRecord$7(record[key]).pipe(flatMap$2(findAuthMethod))));
205339
+ return firstSomeOf(AUTH_METHOD_CONTAINER_KEYS.map((key) => asRecord$8(record[key]).pipe(flatMap$2(findAuthMethod))));
205336
205340
  }));
205337
205341
  }
205338
205342
  /**
@@ -206480,7 +206484,7 @@ function userInputQuestionsFromToolInput(toolInput) {
206480
206484
  return (Array.isArray(toolInput.questions) ? toolInput.questions : []).map((question, idx) => userInputQuestionFromUnknown(question, idx));
206481
206485
  }
206482
206486
  function userInputQuestionFromUnknown(question, idx) {
206483
- const value = asRecord$6(question) ?? {};
206487
+ const value = asRecord$7(question) ?? {};
206484
206488
  return {
206485
206489
  id: typeof value.header === "string" ? value.header : `q-${idx}`,
206486
206490
  header: typeof value.header === "string" ? value.header : `Question ${idx + 1}`,
@@ -206490,13 +206494,13 @@ function userInputQuestionFromUnknown(question, idx) {
206490
206494
  };
206491
206495
  }
206492
206496
  function userInputOptionFromUnknown(option) {
206493
- const value = asRecord$6(option) ?? {};
206497
+ const value = asRecord$7(option) ?? {};
206494
206498
  return {
206495
206499
  label: typeof value.label === "string" ? value.label : "",
206496
206500
  description: typeof value.description === "string" ? value.description : ""
206497
206501
  };
206498
206502
  }
206499
- function asRecord$6(value) {
206503
+ function asRecord$7(value) {
206500
206504
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
206501
206505
  }
206502
206506
  function permissionResultFromDecision(decision, toolInput, suggestions) {
@@ -207303,7 +207307,7 @@ const makeClaudeAdapter = fn$1("makeClaudeAdapter")(function* (options) {
207303
207307
  const updateResumeCursor = fn$1("updateResumeCursor")(function* (context) {
207304
207308
  const threadId = context.session.threadId;
207305
207309
  if (!threadId) return;
207306
- const providerDeliveryBinding = readProviderDeliveryBinding(asRecord$6(context.session.resumeCursor)?.providerDeliveryBinding);
207310
+ const providerDeliveryBinding = readProviderDeliveryBinding(asRecord$7(context.session.resumeCursor)?.providerDeliveryBinding);
207307
207311
  const resumeCursor = {
207308
207312
  threadId,
207309
207313
  ...context.resumeSessionId ? { resume: context.resumeSessionId } : {},
@@ -212369,7 +212373,7 @@ function makeAcpContentDeltaEvent(input) {
212369
212373
  }
212370
212374
  //#endregion
212371
212375
  //#region ../../packages/shared/src/toolActivity.ts
212372
- function asRecord$5(value) {
212376
+ function asRecord$6(value) {
212373
212377
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
212374
212378
  }
212375
212379
  function asTrimmedString(value) {
@@ -212395,10 +212399,10 @@ function extractCommandFromTitle$1(title) {
212395
212399
  return /`([^`]+)`/u.exec(title)?.[1]?.trim() || void 0;
212396
212400
  }
212397
212401
  function extractToolCommand(data, title) {
212398
- const item = asRecord$5(data?.item);
212399
- const itemInput = asRecord$5(item?.input);
212400
- const itemResult = asRecord$5(item?.result);
212401
- const rawInput = asRecord$5(data?.rawInput);
212402
+ const item = asRecord$6(data?.item);
212403
+ const itemInput = asRecord$6(item?.input);
212404
+ const itemResult = asRecord$6(item?.result);
212405
+ const rawInput = asRecord$6(data?.rawInput);
212402
212406
  const direct = [
212403
212407
  normalizeCommandValue$1(item?.command),
212404
212408
  normalizeCommandValue$1(itemInput?.command),
@@ -212426,7 +212430,7 @@ function collectPaths(value, paths, seen, depth) {
212426
212430
  }
212427
212431
  return;
212428
212432
  }
212429
- const record = asRecord$5(value);
212433
+ const record = asRecord$6(value);
212430
212434
  if (!record) return;
212431
212435
  for (const key of [
212432
212436
  "path",
@@ -212485,7 +212489,7 @@ function deriveToolActivityPresentation(input) {
212485
212489
  const title = asTrimmedString(input.title);
212486
212490
  const detail = stripTrailingExitCode(asTrimmedString(input.detail));
212487
212491
  const fallbackSummary = asTrimmedString(input.fallbackSummary) ?? "Tool";
212488
- const data = asRecord$5(input.data);
212492
+ const data = asRecord$6(input.data);
212489
212493
  const command = extractToolCommand(data, title);
212490
212494
  const primaryPath = extractPrimaryPath(data);
212491
212495
  const action = classifyToolAction({
@@ -212509,7 +212513,7 @@ function deriveToolActivityPresentation(input) {
212509
212513
  ...primaryPath ? { detail: primaryPath } : {}
212510
212514
  };
212511
212515
  if (action === "search") {
212512
- const query = asTrimmedString(asRecord$5(data?.rawInput)?.query) ?? asTrimmedString(asRecord$5(data?.rawInput)?.pattern) ?? asTrimmedString(asRecord$5(data?.rawInput)?.searchTerm);
212516
+ const query = asTrimmedString(asRecord$6(data?.rawInput)?.query) ?? asTrimmedString(asRecord$6(data?.rawInput)?.pattern) ?? asTrimmedString(asRecord$6(data?.rawInput)?.searchTerm);
212513
212517
  return {
212514
212518
  summary: "Searched files",
212515
212519
  ...query ? { detail: query } : {}
@@ -224524,6 +224528,9 @@ function isMissingGitCwdError(error) {
224524
224528
  const normalized = `${error.detail}\n${error.message}`.toLowerCase();
224525
224529
  return normalized.includes("no such file or directory") || normalized.includes("notfound: filesystem.access") || normalized.includes("enoent") || normalized.includes("not a directory");
224526
224530
  }
224531
+ function isUnregisteredWorktreeError(error) {
224532
+ return `${error.detail}\n${error.message}`.toLowerCase().includes("is not a working tree");
224533
+ }
224527
224534
  function toGitCommandError(input, detail) {
224528
224535
  return (cause) => is$1(GitCommandError)(cause) ? cause : new GitCommandError({
224529
224536
  operation: input.operation,
@@ -224919,6 +224926,20 @@ const GitCoreLive = effect(GitCore, fn$1("makeGitCore")(function* (options) {
224919
224926
  if (firstRemote) return firstRemote;
224920
224927
  return yield* createGitCommandError("GitCore.resolvePrimaryRemoteName", cwd, ["remote"], "No git remote is configured for this repository.");
224921
224928
  });
224929
+ const resolveNormalizedPrimaryRemoteUrl = fn$1("resolveNormalizedPrimaryRemoteUrl")(function* (cwd) {
224930
+ const remoteName = yield* resolvePrimaryRemoteName(cwd);
224931
+ const remoteUrl = yield* runGitStdout("GitCore.resolvePrimaryRemoteUrl", cwd, [
224932
+ "remote",
224933
+ "get-url",
224934
+ remoteName
224935
+ ]).pipe(map$3((stdout) => normalizeRemoteUrl(stdout)));
224936
+ if (remoteUrl.length > 0) return remoteUrl;
224937
+ return yield* createGitCommandError("GitCore.resolvePrimaryRemoteUrl", cwd, [
224938
+ "remote",
224939
+ "get-url",
224940
+ remoteName
224941
+ ], `Remote '${remoteName}' has no URL.`);
224942
+ });
224922
224943
  const resolvePushRemoteName = fn$1("resolvePushRemoteName")(function* (cwd, branch) {
224923
224944
  const branchPushRemote = yield* runGitStdout("GitCore.resolvePushRemoteName.branchPushRemote", cwd, [
224924
224945
  "config",
@@ -225590,10 +225611,33 @@ const GitCoreLive = effect(GitCore, fn$1("makeGitCore")(function* (options) {
225590
225611
  const args = ["worktree", "remove"];
225591
225612
  if (input.force) args.push("--force");
225592
225613
  args.push(input.path);
225593
- yield* executeGit("GitCore.removeWorktree", input.cwd, args, {
225614
+ const executeRemoval = (cwd, removalArgs) => executeGit("GitCore.removeWorktree", cwd, removalArgs, {
225594
225615
  timeoutMs: 15e3,
225595
225616
  fallbackErrorMessage: "git worktree remove failed"
225596
- }).pipe(mapError((error) => createGitCommandError("GitCore.removeWorktree", input.cwd, args, `${commandLabel(args)} failed (cwd: ${input.cwd}): ${error.message}`, error)));
225617
+ }).pipe(mapError((error) => createGitCommandError("GitCore.removeWorktree", cwd, removalArgs, `${commandLabel(removalArgs)} failed (cwd: ${cwd}): ${error.message}`, error)), asVoid);
225618
+ yield* executeRemoval(input.cwd, args).pipe(catch_((originalError) => {
225619
+ if (!input.force || !isUnregisteredWorktreeError(originalError)) return fail(originalError);
225620
+ return gen(function* () {
225621
+ const targetExists = yield* option(fileSystem.exists(input.path));
225622
+ if (isNone(targetExists)) return yield* originalError;
225623
+ if (!targetExists.value) return;
225624
+ const ownerContext = yield* option(all({
225625
+ callerRemoteUrl: resolveNormalizedPrimaryRemoteUrl(input.cwd),
225626
+ targetRemoteUrl: resolveNormalizedPrimaryRemoteUrl(input.path),
225627
+ targetGitCommonDir: resolveGitCommonDir(input.path)
225628
+ }));
225629
+ if (isNone(ownerContext) || ownerContext.value.callerRemoteUrl !== ownerContext.value.targetRemoteUrl) return yield* originalError;
225630
+ const ownerArgs = [
225631
+ "--git-dir",
225632
+ ownerContext.value.targetGitCommonDir,
225633
+ "worktree",
225634
+ "remove",
225635
+ "--force",
225636
+ input.path
225637
+ ];
225638
+ yield* executeRemoval(input.cwd, ownerArgs);
225639
+ });
225640
+ }));
225597
225641
  });
225598
225642
  const pruneWorktrees = fn$1("pruneWorktrees")(function* (cwd) {
225599
225643
  yield* executeGit("GitCore.pruneWorktrees", cwd, [
@@ -278860,7 +278904,7 @@ function makeApprovedWorkerPlanEventState() {
278860
278904
  function promptKey(masterThreadId, promptId) {
278861
278905
  return `${masterThreadId}\n${promptId}`;
278862
278906
  }
278863
- function asRecord$4(value) {
278907
+ function asRecord$5(value) {
278864
278908
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
278865
278909
  }
278866
278910
  function exactMaterializedTaskIds(value, expectedCount) {
@@ -278870,7 +278914,7 @@ function exactMaterializedTaskIds(value, expectedCount) {
278870
278914
  }
278871
278915
  function readyBatchFromActivity(state, event) {
278872
278916
  if (event.payload.activity.kind !== "plan.task-creation.batch-succeeded") return null;
278873
- const payload = asRecord$4(event.payload.activity.payload);
278917
+ const payload = asRecord$5(event.payload.activity.payload);
278874
278918
  const promptId = payload?.["promptId"];
278875
278919
  if (typeof promptId !== "string") return null;
278876
278920
  const key = promptKey(event.payload.threadId, promptId);
@@ -280008,7 +280052,7 @@ function runtimeGrantNeedsRefresh(token, identity, nowSeconds = Math.floor(Date.
280008
280052
  return claims.expiresAtSeconds - nowSeconds <= RUNTIME_GRANT_REFRESH_SKEW_SECONDS;
280009
280053
  }
280010
280054
  /** Narrow an unknown to a plain object, or null. */
280011
- function asRecord$3(value) {
280055
+ function asRecord$4(value) {
280012
280056
  return value !== null && typeof value === "object" ? value : null;
280013
280057
  }
280014
280058
  /** The raw (untrimmed) string when it is present and not blank, else null. */
@@ -280020,7 +280064,7 @@ function asTimestamp(value) {
280020
280064
  return typeof value === "string" && Number.isFinite(Date.parse(value)) ? value : null;
280021
280065
  }
280022
280066
  function parseRuntimeGrantRefreshResponse(runtimeId, value) {
280023
- const data = asRecord$3(asRecord$3(value)?.data);
280067
+ const data = asRecord$4(asRecord$4(value)?.data);
280024
280068
  if (!data || data.runtimeId !== runtimeId) return null;
280025
280069
  const grantToken = asNonBlankString(data.grantToken);
280026
280070
  const expiresAt = asTimestamp(data.expiresAt);
@@ -296116,6 +296160,74 @@ const LocalAutomationSchedulerLive = effectDiscard(gen(function* () {
296116
296160
  yield* forkScoped(startup.awaitCommandReady.pipe(andThen(forever$1(tick.pipe(andThen(sleep$4("60 seconds")))))));
296117
296161
  }));
296118
296162
  //#endregion
296163
+ //#region src/command/providerUsageEnvironment.ts
296164
+ function asRecord$3(value) {
296165
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
296166
+ }
296167
+ function positiveInteger(value) {
296168
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : null;
296169
+ }
296170
+ function readEnvironmentId(value) {
296171
+ return typeof value === "string" && value.trim() !== "" ? value : null;
296172
+ }
296173
+ function readEligibleStatus(value) {
296174
+ return value === "running" || value === "suspended" ? value : null;
296175
+ }
296176
+ function isOwnedRuntime(row, ownerUserId) {
296177
+ return positiveInteger(row["userId"]) === ownerUserId;
296178
+ }
296179
+ function readRuntimeId(row) {
296180
+ const runtimeId = row["runtimeId"];
296181
+ return typeof runtimeId === "string" && runtimeId.trim() !== "" ? runtimeId : null;
296182
+ }
296183
+ function readCandidate(runtime, ownerUserId) {
296184
+ const row = asRecord$3(runtime);
296185
+ if (row === null || !isOwnedRuntime(row, ownerUserId) || row["desiredState"] !== "running") return null;
296186
+ const organizationId = positiveInteger(row["organizationId"]);
296187
+ const environmentId = readEnvironmentId(row["environmentId"]);
296188
+ const runtimeId = readRuntimeId(row);
296189
+ const status = readEligibleStatus(row["status"]);
296190
+ if (organizationId === null || environmentId === null || runtimeId === null || status === null) return null;
296191
+ return {
296192
+ organizationId,
296193
+ environmentId,
296194
+ runtimeId,
296195
+ status
296196
+ };
296197
+ }
296198
+ function candidateKey(candidate) {
296199
+ return `${candidate.organizationId}:${candidate.environmentId ?? ""}`;
296200
+ }
296201
+ function statusRank(status) {
296202
+ return status === "running" ? 0 : 1;
296203
+ }
296204
+ function deduplicateCandidates(candidates) {
296205
+ const byEnvironment = /* @__PURE__ */ new Map();
296206
+ for (const candidate of candidates) {
296207
+ const key = candidateKey(candidate);
296208
+ const existing = byEnvironment.get(key);
296209
+ if (existing === void 0 || statusRank(candidate.status) < statusRank(existing.status)) byEnvironment.set(key, candidate);
296210
+ }
296211
+ return [...byEnvironment.values()];
296212
+ }
296213
+ /**
296214
+ * Selects one authenticated owner's Environment from CMMD's projectless runtime
296215
+ * catalog. A tied best candidate fails closed, so Forge never chooses an
296216
+ * organization from browser input.
296217
+ */
296218
+ function selectProviderUsageEnvironment(rawCatalog, ownerUserId) {
296219
+ const runtimes = asRecord$3(asRecord$3(rawCatalog)?.["data"])?.["runtimes"];
296220
+ if (!Array.isArray(runtimes)) return { kind: "unavailable" };
296221
+ const candidates = deduplicateCandidates(runtimes.map((runtime) => readCandidate(runtime, ownerUserId)).filter((candidate) => candidate !== null));
296222
+ const bestRank = Math.min(...candidates.map((candidate) => statusRank(candidate.status)));
296223
+ const bestCandidates = candidates.filter((candidate) => statusRank(candidate.status) === bestRank);
296224
+ if (bestCandidates.length !== 1) return { kind: "unavailable" };
296225
+ return {
296226
+ kind: "ready",
296227
+ organizationId: bestCandidates[0].organizationId
296228
+ };
296229
+ }
296230
+ //#endregion
296119
296231
  //#region src/command/wsToken.ts
296120
296232
  /**
296121
296233
  * Build the WS token response given an optional PAT and the configured CMMD
@@ -296152,13 +296264,13 @@ function resolveWsUrl(baseUrl) {
296152
296264
  const callCmmdTool = legacyCmmdToolBridge.callTool;
296153
296265
  const extractMcpToolText = legacyCmmdToolBridge.extractText;
296154
296266
  const isCmmdMcpAuthError = legacyCmmdToolBridge.isAuthError;
296155
- var ClaudeUsageReadError = class extends TaggedError("ClaudeUsageReadError") {};
296156
296267
  /**
296157
296268
  * CMMD-side path for the PROJECT-keyed Forge Cloud catalog. Shared by the list
296158
296269
  * proxy, the SSE poll-and-emit proxy, and the register/unregister proxies so the
296159
296270
  * upstream contract lives in exactly one place.
296160
296271
  */
296161
296272
  const CMMD_CLOUD_PROJECTS_PATH = "/api/forge/context/cloud-projects";
296273
+ const CMMD_RUNTIMES_PATH = "/api/forge/context/runtimes";
296162
296274
  /**
296163
296275
  * Authenticate the browser session and resolve the CMMD JWT to forward
296164
296276
  * upstream. Returns null when no token could be resolved, which every caller
@@ -296282,6 +296394,10 @@ const cmmdBillingSeriesRouteLayer = registerProxyRoute({
296282
296394
  const cmmdRestUnavailable = () => new CmmdProxyAuthenticationRequiredError("CMMD connection required. Reconnect CMMD to continue.");
296283
296395
  function runCmmdRestProxy(session, proxy, dependencies = {}) {
296284
296396
  return gen(function* () {
296397
+ if (dependencies.jwt !== void 0) {
296398
+ const explicitJwt = dependencies.jwt;
296399
+ return yield* promise(() => (dependencies.runProxy ?? runProxy)(() => proxy(explicitJwt)));
296400
+ }
296285
296401
  const resolveJwt = dependencies.resolveJwt ?? resolveCmmdJwtForSession;
296286
296402
  const jwt = yield* resolveJwt({
296287
296403
  sessionId: session.sessionId,
@@ -297822,59 +297938,6 @@ const cmmdSetProviderAccountDefaultRouteLayer = registerProxyRoute({
297822
297938
  orgIdSource: "none",
297823
297939
  responseShape: "unwrapData"
297824
297940
  });
297825
- const resolveConnectedClaudeGeneration = (session) => gen(function* () {
297826
- const outcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
297827
- method: "GET",
297828
- jwt,
297829
- path: "/api/forge/context/providers/claude/credential"
297830
- }));
297831
- if (!outcome.ok) return outcome;
297832
- const state = unwrapForgeEnvelope(outcome.value);
297833
- if (state === null || typeof state !== "object" || !("connected" in state) || state.connected !== true || !("generationId" in state) || typeof state.generationId !== "string") return {
297834
- ok: true,
297835
- value: null
297836
- };
297837
- return {
297838
- ok: true,
297839
- value: {
297840
- generationId: state.generationId,
297841
- generationHash: createHash("sha256").update(state.generationId).digest("hex")
297842
- }
297843
- };
297844
- });
297845
- /**
297846
- * The GET path is read-only. The explicit per-account POST refresh invokes
297847
- * this helper and propagates any CMMD forward failure to the caller.
297848
- */
297849
- const forwardClaudeUsageTelemetry = (session, requestedProviderAccountId, activelyPoll = false, fetchClaudeUsage = fetchClaudeUsageViaOfficialClient) => gen(function* () {
297850
- const credentialOutcome = yield* resolveConnectedClaudeGeneration(session);
297851
- if (!credentialOutcome.ok) return credentialOutcome;
297852
- if (credentialOutcome.value === null) return null;
297853
- const { generationId, generationHash } = credentialOutcome.value;
297854
- const providerAccountId = requestedProviderAccountId ?? generationId;
297855
- const activeSnapshot = activelyPoll && providerAccountId === generationId ? yield* tryPromise({
297856
- try: () => fetchClaudeUsage({ binaryPath: resolveClaudeBinaryPath("claude") }),
297857
- catch: (cause) => new ClaudeUsageReadError({ cause })
297858
- }).pipe(orElseSucceed(() => null)) : null;
297859
- const snapshot = activeSnapshot ? {
297860
- ...activeSnapshot,
297861
- observedAt: (/* @__PURE__ */ new Date()).toISOString()
297862
- } : getLatestClaudeRateLimitTelemetry(generationHash, providerAccountId);
297863
- if (!snapshot) return null;
297864
- return yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
297865
- method: "POST",
297866
- jwt,
297867
- path: "/api/forge/context/providers/usage/claude/telemetry",
297868
- body: {
297869
- providerAccountId,
297870
- credentialGenerationId: generationId,
297871
- source: activeSnapshot ? "active_poll" : "passive_sdk_telemetry",
297872
- fiveHour: snapshot.fiveHour,
297873
- sevenDay: snapshot.sevenDay,
297874
- observedAt: snapshot.observedAt
297875
- }
297876
- }));
297877
- });
297878
297941
  const cmmdGetProviderUsageRouteLayer = add$1("GET", "/api/cmmd/providers/usage", gen(function* () {
297879
297942
  const request = yield* HttpServerRequest;
297880
297943
  const outcome = yield* runCmmdRestProxy(yield* (yield* ServerAuth).authenticateHttpRequest(request), (jwt) => cmmdGateway.request({
@@ -297895,15 +297958,62 @@ function parseProviderUsageRefreshInput(rawBody) {
297895
297958
  providerAccountId: body.providerAccountId
297896
297959
  };
297897
297960
  }
297898
- const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/usage/refresh", gen(function* () {
297899
- const request = yield* HttpServerRequest;
297900
- const session = yield* (yield* ServerAuth).authenticateHttpRequest(request);
297901
- const input = parseProviderUsageRefreshInput(yield* request.json);
297902
- if (input === null) return jsonUnsafe({ error: "provider and providerAccountId must identify a connected provider account" }, { status: 400 });
297903
- const claudeOutcome = input.provider === "claude" ? yield* forwardClaudeUsageTelemetry(session, input.providerAccountId, true) : null;
297904
- if (input.provider === "claude" && claudeOutcome !== null && !claudeOutcome.ok) return buildProxyErrorResponse(claudeOutcome.error);
297905
- if (input.provider === "claude" && claudeOutcome === null) return jsonUnsafe({ error: "No exact-account Claude usage observation is available in this runtime." }, { status: 503 });
297906
- if (input.provider === "codex") {
297961
+ function resolveProviderUsageOwnerUserId(session) {
297962
+ const identity = readCmmdUserIdentityForSession(session.sessionId);
297963
+ const userId = identity === null ? NaN : Number(identity.id);
297964
+ return Number.isSafeInteger(userId) && userId > 0 ? userId : null;
297965
+ }
297966
+ function buildClaudeUsageRefreshErrorResponse(error) {
297967
+ return jsonUnsafe({
297968
+ error: "Claude usage refresh is unavailable.",
297969
+ code: "CLAUDE_USAGE_REFRESH_UNAVAILABLE"
297970
+ }, { status: error instanceof CmmdProxyRequestError && error.status === 503 ? 503 : 502 });
297971
+ }
297972
+ function makeRefreshProviderUsageHandler(dependencies = {}) {
297973
+ return gen(function* () {
297974
+ const request = yield* HttpServerRequest;
297975
+ const session = yield* (yield* ServerAuth).authenticateHttpRequest(request);
297976
+ const input = parseProviderUsageRefreshInput(yield* request.json);
297977
+ if (input === null) return jsonUnsafe({ error: "provider and providerAccountId must identify a connected provider account" }, { status: 400 });
297978
+ if (input.provider === "claude") {
297979
+ const requestJwt = yield* (dependencies.resolveJwt ?? resolveCmmdJwtForSession)({
297980
+ sessionId: session.sessionId,
297981
+ subject: session.subject,
297982
+ logPrefix: "claude-usage-refresh"
297983
+ });
297984
+ if (!requestJwt) return buildClaudeUsageRefreshErrorResponse(/* @__PURE__ */ new Error("CMMD authentication required."));
297985
+ const ownerUserId = resolveProviderUsageOwnerUserId(session);
297986
+ if (ownerUserId === null) return jsonUnsafe({
297987
+ error: "CMMD owner identity is unavailable for Claude usage refresh.",
297988
+ code: "CLAUDE_USAGE_ENVIRONMENT_UNAVAILABLE"
297989
+ }, { status: 503 });
297990
+ const catalogOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
297991
+ method: "GET",
297992
+ jwt,
297993
+ path: CMMD_RUNTIMES_PATH
297994
+ }), { jwt: requestJwt });
297995
+ if (!catalogOutcome.ok) return buildClaudeUsageRefreshErrorResponse(catalogOutcome.error);
297996
+ const target = selectProviderUsageEnvironment(catalogOutcome.value, ownerUserId);
297997
+ if (target.kind === "unavailable") return jsonUnsafe({
297998
+ error: "No owned Environment with running intent is available for Claude usage refresh.",
297999
+ code: "CLAUDE_USAGE_ENVIRONMENT_UNAVAILABLE"
298000
+ }, { status: 503 });
298001
+ const refreshOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
298002
+ method: "POST",
298003
+ jwt,
298004
+ path: "/api/forge/context/providers/usage/claude/refresh",
298005
+ body: { providerAccountId: input.providerAccountId },
298006
+ orgId: String(target.organizationId)
298007
+ }), { jwt: requestJwt });
298008
+ if (!refreshOutcome.ok) return buildClaudeUsageRefreshErrorResponse(refreshOutcome.error);
298009
+ const snapshotOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
298010
+ method: "GET",
298011
+ jwt,
298012
+ path: "/api/forge/context/providers/usage"
298013
+ }), { jwt: requestJwt });
298014
+ if (!snapshotOutcome.ok) return buildClaudeUsageRefreshErrorResponse(snapshotOutcome.error);
298015
+ return jsonUnsafe(unwrapForgeEnvelope(snapshotOutcome.value), { status: 200 });
298016
+ }
297907
298017
  const refreshOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
297908
298018
  method: "POST",
297909
298019
  jwt,
@@ -297911,16 +298021,16 @@ const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/us
297911
298021
  body: { providerAccountId: input.providerAccountId }
297912
298022
  }));
297913
298023
  if (!refreshOutcome.ok) return buildProxyErrorResponse(refreshOutcome.error);
297914
- if (claudeOutcome !== null && !claudeOutcome.ok) return buildProxyErrorResponse(claudeOutcome.error);
297915
- }
297916
- const outcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
297917
- method: "GET",
297918
- jwt,
297919
- path: "/api/forge/context/providers/usage"
297920
- }));
297921
- if (!outcome.ok) return buildProxyErrorResponse(outcome.error);
297922
- return jsonUnsafe(unwrapForgeEnvelope(outcome.value), { status: 200 });
297923
- }).pipe(catchTag("AuthError", (error) => respondToAuthError(error))));
298024
+ const snapshotOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
298025
+ method: "GET",
298026
+ jwt,
298027
+ path: "/api/forge/context/providers/usage"
298028
+ }));
298029
+ if (!snapshotOutcome.ok) return buildProxyErrorResponse(snapshotOutcome.error);
298030
+ return jsonUnsafe(unwrapForgeEnvelope(snapshotOutcome.value), { status: 200 });
298031
+ }).pipe(catchTag("AuthError", (error) => respondToAuthError(error)));
298032
+ }
298033
+ const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/usage/refresh", makeRefreshProviderUsageHandler());
297924
298034
  const cmmdGetUserCodexCredentialRouteLayer = registerProxyRoute({
297925
298035
  forgePath: "/api/cmmd/providers/codex/credential",
297926
298036
  method: "GET",
@@ -298086,9 +298196,10 @@ const cmmdForgeCloudProjectRemovalReceiptRouteLayer = registerProxyRoute({
298086
298196
  });
298087
298197
  const FORGE_RUNTIMES_POLL_INTERVAL = seconds(5);
298088
298198
  const FORGE_RUNTIMES_KEEPALIVE_INTERVAL = seconds(25);
298089
- function encodeForgeCloudProjectsFrame(projects, capacity = null) {
298199
+ function encodeForgeCloudProjectsFrame(projects, environments, capacity = null) {
298090
298200
  return new TextEncoder().encode(`event: cloud-projects\ndata: ${JSON.stringify({
298091
298201
  projects,
298202
+ environments,
298092
298203
  capacity
298093
298204
  })}\n\n`);
298094
298205
  }
@@ -298132,7 +298243,10 @@ function makeFetchCloudProjectsFrameEffect(upstreamUrl, accessToken) {
298132
298243
  }
298133
298244
  const json = await res.json();
298134
298245
  const unwrapped = json && typeof json === "object" && "data" in json && json["data"] ? json["data"] : json;
298135
- return encodeForgeCloudProjectsFrame(Array.isArray(unwrapped?.["projects"]) ? unwrapped["projects"] : [], unwrapped?.["capacity"] ?? null);
298246
+ const projects = unwrapped?.["projects"];
298247
+ const environments = unwrapped?.["environments"];
298248
+ if (!Array.isArray(projects) || !Array.isArray(environments)) return null;
298249
+ return encodeForgeCloudProjectsFrame(projects, environments, unwrapped?.["capacity"] ?? null);
298136
298250
  })).pipe(catch_(() => succeed(null)));
298137
298251
  }
298138
298252
  const cmmdForgeCloudProjectsEventsRouteLayer = add$1("GET", "/api/cmmd/forge-cloud-projects/events", gen(function* () {
@@ -308948,6 +309062,82 @@ const claudeNativeGenerationProofRouteLayer = add$1("GET", "/api/runtime/provide
308948
309062
  generationHash: yield* readUsableClaudeGenerationHash(config)
308949
309063
  });
308950
309064
  }));
309065
+ const defaultClaudeUsageRouteDependencies = {
309066
+ readCredential: async (token) => {
309067
+ const base = process.env.FORGE_CMMD_RUNTIME_CONTROL_PLANE_URL?.trim() ?? "";
309068
+ if (!base) return null;
309069
+ const response = await fetch(`${base.replace(/\/+$/u, "")}/api/forge/context/auth-runtime-claude-credential`, {
309070
+ headers: {
309071
+ authorization: `Bearer ${token}`,
309072
+ accept: "application/json"
309073
+ },
309074
+ signal: AbortSignal.timeout(2e4)
309075
+ });
309076
+ return response.ok ? response.text() : null;
309077
+ },
309078
+ createDirectory: () => mkdtemp(join(tmpdir(), "forge-claude-usage-")),
309079
+ writeCredential: (directory, credential) => writeFile(join(directory, ".credentials.json"), credential, { mode: 384 }),
309080
+ loadUsage: (directory) => fetchClaudeUsageViaOfficialClient({
309081
+ binaryPath: resolveClaudeBinaryPath("claude"),
309082
+ claudeConfigDir: directory
309083
+ }),
309084
+ removeDirectory: (directory) => rm(directory, {
309085
+ recursive: true,
309086
+ force: false
309087
+ }),
309088
+ now: () => /* @__PURE__ */ new Date()
309089
+ };
309090
+ const claudeUsageHandler = (dependencies) => gen(function* () {
309091
+ const request = yield* HttpServerRequest;
309092
+ const config = yield* ServerConfig;
309093
+ const token = claudeReadinessToken(request.headers.authorization);
309094
+ const required = completeClaudeReadinessExpectations(config);
309095
+ if (!token || !required) return unauthorizedClaudeReadinessResponse();
309096
+ const claims = verifyCmmdClaudeUsageTicket(token, required);
309097
+ if (!claims) return unauthorizedClaudeReadinessResponse();
309098
+ const claimed = claimClaudeReadinessJti({
309099
+ jti: claims.jti,
309100
+ expiresAtSeconds: claims.expiresAtSeconds,
309101
+ nowSeconds: Math.floor(Date.now() / 1e3)
309102
+ });
309103
+ if (claimed === "replayed") return unauthorizedClaudeReadinessResponse();
309104
+ if (claimed === "capacity_exhausted") return jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
309105
+ return yield* promise(async () => {
309106
+ let directory = null;
309107
+ let response = jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
309108
+ try {
309109
+ directory = await dependencies.createDirectory();
309110
+ const credentialJson = await dependencies.readCredential(token);
309111
+ if (credentialJson !== null && isClaudeSubscriptionCredential(credentialJson)) {
309112
+ await dependencies.writeCredential(directory, credentialJson);
309113
+ const usage = await dependencies.loadUsage(directory);
309114
+ response = jsonUnsafe({
309115
+ fiveHour: usage.fiveHour,
309116
+ sevenDay: usage.sevenDay,
309117
+ observedAt: dependencies.now().toISOString(),
309118
+ receipt: {
309119
+ orgId: claims.orgId,
309120
+ userId: claims.userId,
309121
+ runtimeId: claims.runtimeId,
309122
+ machineId: claims.machineId,
309123
+ credentialEpoch: claims.credentialEpoch,
309124
+ providerAccountId: claims.providerAccountId,
309125
+ credentialGenerationId: claims.generationId
309126
+ }
309127
+ }, { headers: { "cache-control": "no-store" } });
309128
+ }
309129
+ } catch {}
309130
+ if (directory === null) return response;
309131
+ try {
309132
+ await dependencies.removeDirectory(directory);
309133
+ } catch {
309134
+ return jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
309135
+ }
309136
+ return response;
309137
+ });
309138
+ });
309139
+ const createClaudeUsageRouteLayer = (dependencies = defaultClaudeUsageRouteDependencies) => add$1("POST", "/api/runtime/provider-usage/claude", claudeUsageHandler(dependencies));
309140
+ const claudeUsageRouteLayer = createClaudeUsageRouteLayer();
308951
309141
  /**
308952
309142
  * FINDING-CB1 — workspace readiness SSE endpoint.
308953
309143
  *
@@ -309291,7 +309481,7 @@ const MiscRuntimeLayerLive = mergeAll(AnalyticsServiceLayerLive, OpenLive, Serve
309291
309481
  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));
309292
309482
  const RuntimeDependenciesLive = pullRequestServiceFactoryLayer.pipe(provideMerge(RuntimeDependenciesWithoutPullRequestsLive), provideMerge(cmmdProjectIdentityResolverLive.pipe(provide$1(RuntimeDependenciesWithoutPullRequestsLive))), provideMerge(pullRequestProviderRuntimeLive));
309293
309483
  const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(provideMerge(RuntimeDependenciesLive));
309294
- 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));
309484
+ 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));
309295
309485
  const runServer = launch$1(unwrap(gen(function* () {
309296
309486
  const config = yield* ServerConfig;
309297
309487
  fixPath();