@cmmd-center/forge 0.9.4 → 0.9.6

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 (41) hide show
  1. package/dist/{BunHttpServer-BgNCpQzV.mjs → BunHttpServer-C_855q3m.mjs} +6 -6
  2. package/dist/{BunHttpServer-DOAuw4Iq.cjs → BunHttpServer-Dxx0kzQc.cjs} +6 -6
  3. package/dist/{BunPTY-D-Klry5N.mjs → BunPTY-B7ThejfA.mjs} +3 -3
  4. package/dist/{BunPTY-2icf7sRj.cjs → BunPTY-BjHFZATJ.cjs} +3 -3
  5. package/dist/{BunServices-ChM4mYH9.mjs → BunServices-BFygTrvx.mjs} +3 -3
  6. package/dist/{BunServices-CiNXNzHD.cjs → BunServices-U1VBnEJS.cjs} +3 -3
  7. package/dist/{Cache-XSj5g7uG.cjs → Cache-BRhFH80U.cjs} +3 -3
  8. package/dist/{Cache-Cm78WiyU.mjs → Cache-CHvh_vWI.mjs} +3 -3
  9. package/dist/{Config-DMA9WqtC.cjs → Config-BHRBB8XM.cjs} +2 -2
  10. package/dist/{Config-DrOyN3WS.mjs → Config-To1VEqlB.mjs} +2 -2
  11. package/dist/{HttpServer-aJkhz6yu.cjs → HttpServer-BTcgkY38.cjs} +123 -4
  12. package/dist/{HttpServer-ByyNdEXm.mjs → HttpServer-DV-x5DVo.mjs} +118 -4
  13. package/dist/{NodeHttpServer-D_ismXpd.cjs → NodeHttpServer-D6YVHsL8.cjs} +7 -7
  14. package/dist/{NodeHttpServer-C_wePPV0.mjs → NodeHttpServer-DgD75IAg.mjs} +7 -7
  15. package/dist/{NodePTY-cb7HIasY.cjs → NodePTY-Bd9mvI6U.cjs} +4 -4
  16. package/dist/{NodePTY-BMUFdM93.mjs → NodePTY-RnitYPTs.mjs} +4 -4
  17. package/dist/{NodeServices-BAl07hlH.cjs → NodeServices-BcQL_53W.cjs} +1 -1
  18. package/dist/{NodeServices-BISZRY3e.cjs → NodeServices-BjmXNhpe.cjs} +3 -3
  19. package/dist/{NodeServices-Bqqy4DuH.mjs → NodeServices-Da5rUDDE.mjs} +3 -3
  20. package/dist/{NodeSqliteClient-SsUCk9mA.cjs → NodeSqliteClient-CG_mPdVp.cjs} +6 -6
  21. package/dist/{NodeSqliteClient-OdI1TawL.mjs → NodeSqliteClient-CcLD4Zvr.mjs} +6 -6
  22. package/dist/{NodeTerminal-B9u7fFYa.cjs → NodeTerminal-D86oor5_.cjs} +3 -3
  23. package/dist/{NodeTerminal-_XekCzf-.mjs → NodeTerminal-Ke6chk0A.mjs} +3 -3
  24. package/dist/{PTY-U3JQnLXS.cjs → PTY-BB84iC10.cjs} +2 -2
  25. package/dist/{PTY-CBkE5akF.mjs → PTY-X-4Tv31s.mjs} +2 -2
  26. package/dist/{Path-Bwl3ltR5.mjs → Path-DJTwK58E.mjs} +2 -2
  27. package/dist/{Path-CsbBuCFB.cjs → Path-qpublmG3.cjs} +2 -2
  28. package/dist/{Schema-CTXk8IgN.mjs → Schema-CKuz8TX8.mjs} +61 -6
  29. package/dist/{Schema-Bij_WAra.cjs → Schema-DaFukK_y.cjs} +72 -5
  30. package/dist/{SqlError-C2mi8_tp.cjs → SqlError-CsWFS-OU.cjs} +3 -3
  31. package/dist/{SqlError-1c-3v7GY.mjs → SqlError-DhK0hV8S.mjs} +3 -3
  32. package/dist/{SqliteClient-CdAhI4lb.cjs → SqliteClient-BpjZWL6O.cjs} +5 -5
  33. package/dist/{SqliteClient-aoOb51gB.mjs → SqliteClient-CA7vjiUj.mjs} +5 -5
  34. package/dist/bin.cjs +435 -88
  35. package/dist/bin.mjs +458 -112
  36. package/dist/{open-FIgTDosf.mjs → open-D8mGyWmt.mjs} +3 -3
  37. package/dist/runtimeBootstrap.cjs +1 -1
  38. package/dist/runtimeBootstrap.mjs +1 -1
  39. package/dist/{runtimeControlAuthority-Dm9z5ziU.mjs → runtimeControlAuthority-L85w5RTn.mjs} +33 -3
  40. package/dist/{runtimeControlAuthority-Dx6Y5LPI.cjs → runtimeControlAuthority-SNBF5Mjy.cjs} +33 -3
  41. package/package.json +1 -1
package/dist/bin.cjs CHANGED
@@ -2,18 +2,18 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  const require_chunk = require("./chunk-BhaIgcZK.cjs");
5
- const require_Schema$1 = require("./Schema-Bij_WAra.cjs");
6
- const require_Path = require("./Path-CsbBuCFB.cjs");
7
- const require_NodeTerminal = require("./NodeTerminal-B9u7fFYa.cjs");
8
- const require_NodeServices = require("./NodeServices-BISZRY3e.cjs");
9
- const require_HttpServer = require("./HttpServer-aJkhz6yu.cjs");
10
- const require_Config = require("./Config-DMA9WqtC.cjs");
11
- const require_Cache = require("./Cache-XSj5g7uG.cjs");
12
- const require_SqlError = require("./SqlError-C2mi8_tp.cjs");
5
+ const require_Schema$1 = require("./Schema-DaFukK_y.cjs");
6
+ const require_Path = require("./Path-qpublmG3.cjs");
7
+ const require_NodeTerminal = require("./NodeTerminal-D86oor5_.cjs");
8
+ const require_NodeServices = require("./NodeServices-BjmXNhpe.cjs");
9
+ const require_HttpServer = require("./HttpServer-BTcgkY38.cjs");
10
+ const require_Config = require("./Config-BHRBB8XM.cjs");
11
+ const require_Cache = require("./Cache-BRhFH80U.cjs");
12
+ const require_SqlError = require("./SqlError-CsWFS-OU.cjs");
13
13
  const require_esm = require("./esm-Do7HVhLA.cjs");
14
14
  const require_Mime = require("./Mime-CyHbecis.cjs");
15
- const require_runtimeControlAuthority = require("./runtimeControlAuthority-Dx6Y5LPI.cjs");
16
- const require_PTY = require("./PTY-U3JQnLXS.cjs");
15
+ const require_runtimeControlAuthority = require("./runtimeControlAuthority-SNBF5Mjy.cjs");
16
+ const require_PTY = require("./PTY-BB84iC10.cjs");
17
17
  let node_child_process = require("node:child_process");
18
18
  node_child_process = require_chunk.__toESM(node_child_process);
19
19
  let node_stream = require("node:stream");
@@ -17640,6 +17640,7 @@ const ExecutionEnvironmentCapabilities = require_Schema$1.Struct({
17640
17640
  pullRequests: require_Schema$1.optionalKey(require_Schema$1.Boolean),
17641
17641
  threadPullRequestLinking: require_Schema$1.optionalKey(require_Schema$1.Boolean),
17642
17642
  cloudMode: require_Schema$1.Boolean.pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(false))),
17643
+ threadSettlement: require_Schema$1.optionalKey(require_Schema$1.Boolean),
17643
17644
  posthogPublicKey: require_Schema$1.NullOr(require_Schema$1.String).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
17644
17645
  posthogHost: require_Schema$1.NullOr(require_Schema$1.String).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
17645
17646
  runtime: require_Schema$1.optionalKey(ExecutionEnvironmentRuntimeCapabilities),
@@ -67803,7 +67804,7 @@ function normalizeNumberish(value) {
67803
67804
  }
67804
67805
  //#endregion
67805
67806
  //#region package.json
67806
- var version$1 = "0.9.4";
67807
+ var version$1 = "0.9.5";
67807
67808
  //#endregion
67808
67809
  //#region src/sentry.ts
67809
67810
  const SERVER_APP_NAME = "forge-server";
@@ -68205,6 +68206,30 @@ const respondToAuthError = (error) => require_Schema$1.gen(function* () {
68205
68206
  }));
68206
68207
  return response;
68207
68208
  });
68209
+ const OAUTH_ACCESS_TOKEN_TYPE = "urn:ietf:params:oauth:token-type:access_token";
68210
+ /**
68211
+ * The one exchange this endpoint performs, or the reason it will not.
68212
+ *
68213
+ * Returns a message rather than a boolean so the route can say which field was
68214
+ * wrong: an operator debugging a pairing failure otherwise cannot tell an
68215
+ * unsupported grant from an unsupported token type.
68216
+ */
68217
+ function rejectUnsupportedTokenExchange(input) {
68218
+ if (input.grant_type !== "urn:ietf:params:oauth:grant-type:token-exchange") return "Unsupported grant_type.";
68219
+ if (input.subject_token_type !== "urn:t3:params:oauth:token-type:environment-bootstrap") return "Unsupported subject_token_type.";
68220
+ if (input.requested_token_type !== "urn:ietf:params:oauth:token-type:access_token") return "Unsupported requested_token_type.";
68221
+ return null;
68222
+ }
68223
+ /**
68224
+ * `expires_in` is a duration in seconds; a session carries an absolute instant.
68225
+ *
68226
+ * Clamped at zero so a session that expired between issuance and this call is
68227
+ * reported as already expired rather than as a negative lifetime, which a client
68228
+ * could read as a very large unsigned value.
68229
+ */
68230
+ function accessTokenExpiresInSeconds(remainingMillis) {
68231
+ return Math.max(0, Math.floor(remainingMillis / 1e3));
68232
+ }
68208
68233
  //#endregion
68209
68234
  //#region ../../packages/shared/src/cmmdIdentity.ts
68210
68235
  const MAX_CMMD_AVATAR_URL_LENGTH = 256 * 1024;
@@ -69404,6 +69429,16 @@ const CommandOAuthDeviceInput = require_Schema$1.Struct({
69404
69429
  return_url: require_Schema$1.optionalKey(require_Schema$1.String),
69405
69430
  scope: require_Schema$1.optionalKey(require_Schema$1.String)
69406
69431
  });
69432
+ const OAuthTokenExchangeInput = require_Schema$1.Struct({
69433
+ grant_type: require_Schema$1.String,
69434
+ subject_token: require_Schema$1.String,
69435
+ subject_token_type: require_Schema$1.String,
69436
+ requested_token_type: require_Schema$1.String,
69437
+ scope: require_Schema$1.optional(require_Schema$1.String),
69438
+ client_label: require_Schema$1.optional(require_Schema$1.String),
69439
+ client_device_type: require_Schema$1.optional(require_Schema$1.String),
69440
+ client_os: require_Schema$1.optional(require_Schema$1.String)
69441
+ });
69407
69442
  const CommandOAuthTokenInput = require_Schema$1.Struct({
69408
69443
  grant_type: require_Schema$1.String,
69409
69444
  device_code: require_Schema$1.String,
@@ -70246,6 +70281,51 @@ const authBearerBootstrapRouteLayer = add$1("POST", "/api/auth/bootstrap/bearer"
70246
70281
  const result = yield* serverAuth.exchangeBootstrapCredentialForBearerSession(payload.credential, deriveAuthClientMetadata({ request }));
70247
70282
  return require_HttpServer.jsonUnsafe(result, { status: 200 });
70248
70283
  }).pipe(require_Schema$1.catchTag("AuthError", (error) => respondToAuthError(error))));
70284
+ /**
70285
+ * FORGE COMPAT. `POST /oauth/token` — the RFC 8693 token exchange the vendored
70286
+ * t3code client uses to turn a pairing credential into a bearer token.
70287
+ *
70288
+ * Forge's own clients call `/api/auth/bootstrap/bearer` with JSON. The mobile app
70289
+ * cannot: the endpoint is baked into the vendored contract
70290
+ * (packages/t3-contracts/src/environmentHttp.ts) as a form-urlencoded OAuth
70291
+ * exchange, and without it every attempt to add an environment fails with a 404 —
70292
+ * which leaves the whole app unusable, since no screen works before an
70293
+ * environment exists.
70294
+ *
70295
+ * This is a shape adapter, not a second way to authenticate. It performs no
70296
+ * validation of its own and mints nothing: it forwards the subject token to the
70297
+ * same `exchangeBootstrapCredentialForBearerSession` the JSON route uses, so the
70298
+ * credential rules, expiry and session issuance stay in one place. The only work
70299
+ * here is vocabulary — form encoding in, OAuth field names out.
70300
+ *
70301
+ * Same pattern as the vcs.* handlers in ws.ts: the Forge server speaks upstream's
70302
+ * dialect over Forge's own services, rather than the vendored client being patched
70303
+ * to speak Forge's.
70304
+ */
70305
+ const authOAuthTokenExchangeRouteLayer = add$1("POST", "/oauth/token", require_Schema$1.gen(function* () {
70306
+ const request = yield* require_HttpServer.HttpServerRequest;
70307
+ const serverAuth = yield* ServerAuth;
70308
+ const payload = yield* require_HttpServer.schemaBodyUrlParams(OAuthTokenExchangeInput).pipe(require_Schema$1.mapError((cause) => new AuthError({
70309
+ message: "Invalid token exchange payload.",
70310
+ status: 400,
70311
+ cause
70312
+ })));
70313
+ const refusal = rejectUnsupportedTokenExchange(payload);
70314
+ if (refusal !== null) return yield* new AuthError({
70315
+ message: refusal,
70316
+ status: 400
70317
+ });
70318
+ const session = yield* serverAuth.exchangeBootstrapCredentialForBearerSession(payload.subject_token, deriveAuthClientMetadata({ request }));
70319
+ const now$6 = yield* require_Schema$1.now;
70320
+ const expiresInSeconds = accessTokenExpiresInSeconds(require_Schema$1.toMillis(require_Schema$1.distance(now$6, session.expiresAt)));
70321
+ return require_HttpServer.jsonUnsafe({
70322
+ access_token: session.sessionToken,
70323
+ issued_token_type: OAUTH_ACCESS_TOKEN_TYPE,
70324
+ token_type: "Bearer",
70325
+ expires_in: expiresInSeconds,
70326
+ scope: payload.scope ?? session.role
70327
+ }, { status: 200 });
70328
+ }).pipe(require_Schema$1.catchTag("AuthError", (error) => respondToAuthError(error))));
70249
70329
  const authWebSocketTokenRouteLayer = add$1("POST", "/api/auth/ws-token", require_Schema$1.gen(function* () {
70250
70330
  const request = yield* require_HttpServer.HttpServerRequest;
70251
70331
  const serverAuth = yield* ServerAuth;
@@ -99120,14 +99200,9 @@ function mapClaudeRateLimitInfo(info) {
99120
99200
  }
99121
99201
  const cachedSnapshots = /* @__PURE__ */ new Map();
99122
99202
  let localClaudeGenerationHash = null;
99123
- let localClaudeGenerationId = null;
99124
99203
  function setLocalClaudeUsageGeneration(generationId) {
99125
- localClaudeGenerationId = generationId;
99126
99204
  localClaudeGenerationHash = (0, node_crypto.createHash)("sha256").update(generationId).digest("hex");
99127
99205
  }
99128
- function currentClaudeUsageGenerationId() {
99129
- return localClaudeGenerationId;
99130
- }
99131
99206
  function currentClaudeUsageGenerationHash() {
99132
99207
  const value = process.env.FORGE_PERSONAL_CLAUDE_GENERATION_HASH?.trim() ?? "";
99133
99208
  return /^[a-f0-9]{64}$/.test(value) ? value : localClaudeGenerationHash;
@@ -99547,6 +99622,16 @@ function extractClaudeProviderAccountId(response) {
99547
99622
  const providerAccountId = account.providerAccountId.trim();
99548
99623
  return providerAccountId.length > 0 ? providerAccountId : null;
99549
99624
  }
99625
+ /**
99626
+ * Logs a usage-publish failure, or does nothing when there was none. The null
99627
+ * check lives here rather than in syncClaudeCredentialForSession so that
99628
+ * reporting the failure costs that generator no branches.
99629
+ */
99630
+ const logUsagePublishFailure = (failure, path) => failure === null ? require_Schema$1.void_ : require_Schema$1.logWarning("cmmd-claude-cred-sync: usage publish failed after deposit", {
99631
+ error: failure.cause instanceof Error ? failure.cause.message : String(failure.cause),
99632
+ stack: failure.cause instanceof Error ? failure.cause.stack : void 0,
99633
+ path
99634
+ });
99550
99635
  async function publishClaudeUsageAfterSync(input) {
99551
99636
  try {
99552
99637
  const usage = await input.loadUsage({
@@ -99569,13 +99654,16 @@ async function publishClaudeUsageAfterSync(input) {
99569
99654
  observedAt: (/* @__PURE__ */ new Date()).toISOString()
99570
99655
  }
99571
99656
  });
99572
- } catch {}
99657
+ return null;
99658
+ } catch (cause) {
99659
+ return { cause };
99660
+ }
99573
99661
  }
99574
99662
  async function finalizeClaudeCredentialSync(input) {
99575
99663
  const providerAccountId = extractClaudeProviderAccountId(input.response);
99576
- if (providerAccountId === null) return;
99664
+ if (providerAccountId === null) return null;
99577
99665
  if (input.auth.path === USER_CLAUDE_CREDENTIAL_PATH) setLocalClaudeUsageGeneration(providerAccountId);
99578
- await publishClaudeUsageAfterSync({
99666
+ return publishClaudeUsageAfterSync({
99579
99667
  auth: input.auth,
99580
99668
  providerAccountId,
99581
99669
  accountEmail: input.accountEmail,
@@ -99630,7 +99718,7 @@ function syncClaudeCredentialForSession(input) {
99630
99718
  }
99631
99719
  })).pipe(require_Schema$1.orElseSucceed(() => null));
99632
99720
  if (response === null) return { status: "failed" };
99633
- yield* require_Schema$1.promise(() => finalizeClaudeCredentialSync({
99721
+ yield* logUsagePublishFailure(yield* require_Schema$1.promise(() => finalizeClaudeCredentialSync({
99634
99722
  response,
99635
99723
  auth,
99636
99724
  accountEmail,
@@ -99638,7 +99726,7 @@ function syncClaudeCredentialForSession(input) {
99638
99726
  planType: metadata.planType ?? probedMetadata.planType ?? null,
99639
99727
  ...input.homePath ? { homePath: input.homePath } : {},
99640
99728
  loadUsage: input.loadUsage ?? fetchClaudeUsageViaOfficialClient
99641
- }));
99729
+ })), auth.path);
99642
99730
  return { status: "synced" };
99643
99731
  });
99644
99732
  }
@@ -113685,8 +113773,8 @@ require_Schema$1.effectDiscard(runMigrations());
113685
113773
  //#endregion
113686
113774
  //#region src/persistence/Layers/Sqlite.ts
113687
113775
  const defaultSqliteClientLoaders = {
113688
- bun: () => Promise.resolve().then(() => require("./SqliteClient-CdAhI4lb.cjs")),
113689
- node: () => Promise.resolve().then(() => require("./NodeSqliteClient-SsUCk9mA.cjs"))
113776
+ bun: () => Promise.resolve().then(() => require("./SqliteClient-BpjZWL6O.cjs")),
113777
+ node: () => Promise.resolve().then(() => require("./NodeSqliteClient-CG_mPdVp.cjs"))
113690
113778
  };
113691
113779
  const makeRuntimeSqliteLayer = require_Schema$1.fn("makeRuntimeSqliteLayer")(function* (config) {
113692
113780
  const loader = defaultSqliteClientLoaders[process.versions.bun !== void 0 ? "bun" : "node"];
@@ -147034,22 +147122,58 @@ function runtimeAuthoritySessionId(input) {
147034
147122
  if (input.authSessionId) return input.authSessionId;
147035
147123
  return input.threadId ? readThreadSessionId(input.threadId) : null;
147036
147124
  }
147125
+ /**
147126
+ * Pure mapping from the three preconditions to an outcome.
147127
+ *
147128
+ * Split out so the reason can be tested without an Effect runtime, env vars or
147129
+ * module mocking — the decision is the thing worth pinning, not the plumbing
147130
+ * around it.
147131
+ */
147132
+ function resolveBrokerTicketOutcome(input) {
147133
+ if (input.identityMode === "legacy") return {
147134
+ kind: "ticket",
147135
+ token: input.legacyGrantToken
147136
+ };
147137
+ if (input.identityMode === "invalid") return {
147138
+ kind: "unavailable",
147139
+ reason: "runtime identity is incomplete or invalid"
147140
+ };
147141
+ if (!input.sessionId) return {
147142
+ kind: "unavailable",
147143
+ reason: "no owner session is bound to this request"
147144
+ };
147145
+ return input.brokerAuthority ? {
147146
+ kind: "ticket",
147147
+ token: input.brokerAuthority
147148
+ } : {
147149
+ kind: "unavailable",
147150
+ reason: "no live broker authority for this session"
147151
+ };
147152
+ }
147037
147153
  function runtimeProviderBrokerToken(input) {
147038
147154
  const identity = classifyRuntimeBrokerIdentity({
147039
147155
  machineId: configuredRuntimeMachineId() ?? void 0,
147040
147156
  credentialEpoch: configuredRuntimeCredentialEpoch(),
147041
147157
  brokerAuthorityMode: process.env.FORGE_CMMD_RUNTIME_BROKER_AUTHORITY_MODE
147042
147158
  });
147043
- if (identity.mode === "legacy") return require_runtimeControlAuthority.runtimeGrantToken();
147044
- if (identity.mode === "invalid") return null;
147159
+ if (identity.mode !== "exact") return resolveBrokerTicketOutcome({
147160
+ identityMode: identity.mode,
147161
+ legacyGrantToken: identity.mode === "legacy" ? require_runtimeControlAuthority.runtimeGrantToken() : null,
147162
+ sessionId: null,
147163
+ brokerAuthority: null
147164
+ });
147045
147165
  const sessionId = runtimeAuthoritySessionId(input);
147046
- if (!sessionId) return null;
147047
- return readRuntimeBrokerAuthority({
147166
+ return resolveBrokerTicketOutcome({
147167
+ identityMode: "exact",
147168
+ legacyGrantToken: null,
147048
147169
  sessionId,
147049
- runtimeId: process.env.FORGE_CMMD_RUNTIME_ID,
147050
- machineId: identity.machineId,
147051
- credentialEpoch: identity.credentialEpoch,
147052
- requiredScope: "provider"
147170
+ brokerAuthority: sessionId ? readRuntimeBrokerAuthority({
147171
+ sessionId,
147172
+ runtimeId: process.env.FORGE_CMMD_RUNTIME_ID,
147173
+ machineId: identity.machineId,
147174
+ credentialEpoch: identity.credentialEpoch,
147175
+ requiredScope: "provider"
147176
+ }) : null
147053
147177
  });
147054
147178
  }
147055
147179
  async function fetchRuntimeProviderGrant(input) {
@@ -147094,8 +147218,9 @@ const issueProviderEgressCredential = (input) => require_Schema$1.tryPromise({
147094
147218
  async function issueCmmdRuntimeProviderEgressCredential(input) {
147095
147219
  const controlPlaneUrl = process.env.FORGE_COMMAND_APP_URL.replace(/\/+$/, "");
147096
147220
  const runtimeId = encodeURIComponent(process.env.FORGE_CMMD_RUNTIME_ID);
147097
- const runtimeGrantToken = runtimeProviderBrokerToken(input);
147098
- if (!runtimeGrantToken) throw new Error("Provider token issuance requires a live exact-machine broker authority for this runtime epoch.");
147221
+ const brokerTicket = runtimeProviderBrokerToken(input);
147222
+ if (brokerTicket.kind === "unavailable") throw new Error(`Provider token issuance requires a live exact-machine broker authority for this runtime epoch (${brokerTicket.reason}).`);
147223
+ const runtimeGrantToken = brokerTicket.token;
147099
147224
  const response = await fetchRuntimeProviderGrant({
147100
147225
  url: `${controlPlaneUrl}/api/forge/runtimes/${runtimeId}/provider/token`,
147101
147226
  token: runtimeGrantToken,
@@ -205343,6 +205468,48 @@ function applyPluginSkillPermissionsToDynamicTools(tools, settings) {
205343
205468
  });
205344
205469
  }
205345
205470
  //#endregion
205471
+ //#region src/github/forgeGitHubToolHandler.ts
205472
+ /**
205473
+ * Shared wiring for Forge's brokered GitHub tools.
205474
+ *
205475
+ * Both provider surfaces run the same handler: Codex exposes the tools
205476
+ * natively, Claude reaches them over in-process MCP (`GitHubMcpServer.ts`).
205477
+ * The auth binding, the write confirmation gate and the audit trail live here
205478
+ * so a new surface cannot accidentally omit one — the handler's own defaults
205479
+ * are deliberately inert (no audit, never confirmed), which is safe for tests
205480
+ * but wrong for a real turn.
205481
+ */
205482
+ function createForgeGitHubToolHandlerOptions(deps) {
205483
+ const { runWithRuntimeContext } = deps;
205484
+ return {
205485
+ broker: new GitHubBroker({
205486
+ resolveJwt: (auth) => runWithRuntimeContext(resolveCmmdJwtForSession({
205487
+ sessionId: auth.sessionId,
205488
+ logPrefix: deps.logPrefix,
205489
+ ...auth.subject !== void 0 ? { subject: auth.subject } : {},
205490
+ ...auth.forceRefresh !== void 0 ? { forceRefresh: auth.forceRefresh } : {}
205491
+ })),
205492
+ githubWriteIdentity: deps.githubWriteIdentity
205493
+ }),
205494
+ resolveAuth: async (threadId) => {
205495
+ const binding = await runWithRuntimeContext(readThreadAuthSession(threadId));
205496
+ return binding ? {
205497
+ sessionId: binding.sessionId,
205498
+ ...binding.subject ? { subject: binding.subject } : {}
205499
+ } : null;
205500
+ },
205501
+ recordAudit: (auditEvent) => runWithRuntimeContext(recordGitHubToolAuditEvent(auditEvent).pipe(require_Schema$1.asVoid)),
205502
+ createConfirmation: (confirmation) => runWithRuntimeContext(createGitHubToolConfirmation(confirmation)),
205503
+ isConfirmed: (confirmation) => runWithRuntimeContext(consumeApprovedOrLatestGitHubToolConfirmation({
205504
+ confirmationId: confirmation.confirmationId,
205505
+ threadId: confirmation.threadId,
205506
+ toolName: confirmation.toolName,
205507
+ request: confirmation.request
205508
+ })),
205509
+ bypassWriteConfirmation: deps.bypassWriteConfirmation
205510
+ };
205511
+ }
205512
+ //#endregion
205346
205513
  //#region src/provider/shellSafety.ts
205347
205514
  const SHELL_SAFE_COMMAND_PATH_PATTERN = /^[A-Za-z0-9_.\-/\\:]+$/;
205348
205515
  function isShellSafeCommandPath(command) {
@@ -206633,33 +206800,12 @@ const makeCodexAdapter = require_Schema$1.fn("makeCodexAdapter")(function* (opti
206633
206800
  }));
206634
206801
  const browserToolEnvironmentId = yield* resolveBrowserToolEnvironmentId$1();
206635
206802
  const computerManager = resolveComputerManager(serverConfig);
206636
- const githubDynamicToolHandler = createCodexGitHubDynamicToolHandler({
206637
- broker: new GitHubBroker({
206638
- resolveJwt: (auth) => runWithRuntimeContext(resolveCmmdJwtForSession({
206639
- sessionId: auth.sessionId,
206640
- logPrefix: "codex-github",
206641
- ...auth.subject !== void 0 ? { subject: auth.subject } : {},
206642
- ...auth.forceRefresh !== void 0 ? { forceRefresh: auth.forceRefresh } : {}
206643
- })),
206644
- githubWriteIdentity: settings.githubWriteIdentity
206645
- }),
206646
- resolveAuth: async (threadId) => {
206647
- const binding = await runWithRuntimeContext(readThreadAuthSession(threadId));
206648
- return binding ? {
206649
- sessionId: binding.sessionId,
206650
- ...binding.subject ? { subject: binding.subject } : {}
206651
- } : null;
206652
- },
206653
- recordAudit: (auditEvent) => runWithRuntimeContext(recordGitHubToolAuditEvent(auditEvent).pipe(require_Schema$1.asVoid)),
206654
- createConfirmation: (confirmation) => runWithRuntimeContext(createGitHubToolConfirmation(confirmation)),
206655
- isConfirmed: (confirmation) => runWithRuntimeContext(consumeApprovedOrLatestGitHubToolConfirmation({
206656
- confirmationId: confirmation.confirmationId,
206657
- threadId: confirmation.threadId,
206658
- toolName: confirmation.toolName,
206659
- request: confirmation.request
206660
- })),
206803
+ const githubDynamicToolHandler = createCodexGitHubDynamicToolHandler(createForgeGitHubToolHandlerOptions({
206804
+ runWithRuntimeContext,
206805
+ githubWriteIdentity: settings.githubWriteIdentity,
206806
+ logPrefix: "codex-github",
206661
206807
  bypassWriteConfirmation: input.runtimeMode === "full-access"
206662
- });
206808
+ }));
206663
206809
  const cmmdConnectorDynamicToolHandler = createCodexCmmdConnectorDynamicToolHandler({ resolveAuth: async (threadId) => {
206664
206810
  const binding = await runWithRuntimeContext(readThreadAuthSession(threadId));
206665
206811
  if (!binding) return null;
@@ -208206,6 +208352,62 @@ function createDevServerMcpServer(deps, threadId) {
208206
208352
  });
208207
208353
  }
208208
208354
  //#endregion
208355
+ //#region src/github/GitHubMcpServer.ts
208356
+ /**
208357
+ * Brokered Forge GitHub tools, exposed to the Claude surface (in-process MCP).
208358
+ *
208359
+ * The Codex app-server consumes these tools as native dynamic tools; Claude
208360
+ * reaches them through MCP instead. Both surfaces dispatch the SAME handler
208361
+ * (`createCodexGitHubDynamicToolHandler`), so auth resolution, the write
208362
+ * confirmation gate and the audit trail are shared rather than reimplemented
208363
+ * per provider — this module only adapts descriptor + result shapes.
208364
+ *
208365
+ * Without it a Claude agent has no brokered push path at all and falls back to
208366
+ * raw `git`, which the runtime deliberately blocks via `GIT_ASKPASS=/bin/false`.
208367
+ *
208368
+ * Result envelopes are relayed verbatim as tool content: the web approval card
208369
+ * is built by scanning tool results for `userActionRequired`, so summarising or
208370
+ * reshaping the payload here would silently strip the user's ability to approve
208371
+ * a write.
208372
+ */
208373
+ const GITHUB_MCP_SERVER_NAME = "forge-github";
208374
+ /** Joins the brokered result's content items back into a single text payload. */
208375
+ function readResultText(contentItems) {
208376
+ return contentItems.map((item) => item.text).filter((text) => typeof text === "string").join("\n");
208377
+ }
208378
+ /**
208379
+ * Factored out of `createGitHubMcpServer` (mirroring the Sidekick tools server)
208380
+ * so dispatch and envelope handling are testable without the SDK's `tool()` /
208381
+ * `createSdkMcpServer` machinery.
208382
+ */
208383
+ function buildGitHubToolHandlers(runBrokeredTool, threadId) {
208384
+ return createCodexGitHubDynamicTools().map((descriptor) => ({
208385
+ name: descriptor.name,
208386
+ description: descriptor.description,
208387
+ inputSchema: jsonSchemaToZodShape(descriptor.inputSchema),
208388
+ handler: async (args) => {
208389
+ const result = await runBrokeredTool({
208390
+ threadId,
208391
+ tool: descriptor.name,
208392
+ arguments: args
208393
+ });
208394
+ return {
208395
+ content: [{
208396
+ type: "text",
208397
+ text: readResultText(result.contentItems)
208398
+ }],
208399
+ ...result.success ? {} : { isError: true }
208400
+ };
208401
+ }
208402
+ }));
208403
+ }
208404
+ function createGitHubMcpServer(runBrokeredTool, threadId) {
208405
+ return z1e({
208406
+ name: GITHUB_MCP_SERVER_NAME,
208407
+ tools: buildGitHubToolHandlers(runBrokeredTool, threadId).map((entry) => U1e(entry.name, entry.description, entry.inputSchema, entry.handler))
208408
+ });
208409
+ }
208410
+ //#endregion
208209
208411
  //#region src/provider/providerAuthFailureCopy.ts
208210
208412
  /**
208211
208413
  * Rewrite provider auth failures into an action the user can actually take.
@@ -208510,6 +208712,7 @@ function buildClaudeMcpServers(input) {
208510
208712
  "forge-browser": createBrowserMcpServer(input.browserManager, input.threadId, browserToolScope(input.browserToolEnvironmentId)),
208511
208713
  "forge-dev-server": createDevServerMcpServer(input.devServerToolDeps, input.threadId),
208512
208714
  "cmmd-context": createCmmdContextMcpServer(input.threadId, input.resolveCmmdPat),
208715
+ [GITHUB_MCP_SERVER_NAME]: createGitHubMcpServer(input.runBrokeredGitHubTool, input.threadId),
208513
208716
  ...input.computerManager ? { [COMPUTER_MCP_SERVER_NAME]: createComputerMcpServer(input.computerManager, input.threadId) } : {},
208514
208717
  ...input.cmmdSidekickTools ? { "cmmd-sidekick-tools": createCmmdSidekickToolsMcpServer(input.cmmdSidekickTools.session, input.cmmdSidekickTools.tools) } : {}
208515
208718
  };
@@ -210520,6 +210723,12 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
210520
210723
  const permissionMode = permissionModeForRuntimeMode(input.runtimeMode);
210521
210724
  const settings = claudeQuerySettings(modelConfig.thinking, modelConfig.fastMode);
210522
210725
  const systemPrompt = buildClaudeSystemPrompt(modelConfig.endpointProfile, serverSettings.coauthorIncludeForge);
210726
+ const runBrokeredGitHubTool = createCodexGitHubDynamicToolHandler(createForgeGitHubToolHandlerOptions({
210727
+ runWithRuntimeContext: runWithSqlRuntimeContext,
210728
+ githubWriteIdentity: serverSettings.githubWriteIdentity,
210729
+ logPrefix: "claude-github",
210730
+ bypassWriteConfirmation: input.runtimeMode === "full-access"
210731
+ }));
210523
210732
  const queryRuntime = yield* createClaudeQueryRuntime(prompt, buildClaudeQueryOptions({
210524
210733
  cwd: input.cwd,
210525
210734
  effectiveApiModelId: modelConfig.effectiveApiModelId,
@@ -210539,7 +210748,8 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
210539
210748
  computerManager,
210540
210749
  resolveCmmdPat,
210541
210750
  devServerToolDeps,
210542
- cmmdSidekickTools
210751
+ cmmdSidekickTools,
210752
+ runBrokeredGitHubTool
210543
210753
  }), threadId);
210544
210754
  const session = buildClaudeProviderSession({
210545
210755
  threadId,
@@ -283540,7 +283750,9 @@ const make$8 = require_Schema$1.gen(function* () {
283540
283750
  projects: readModel.projects
283541
283751
  });
283542
283752
  if (!cwd) return "Forge could not resolve the project folder for this thread.";
283543
- if (serverConfig.forgeCmmdRuntimeMode === true && !isPathInsideAnyRoot(cwd, [serverConfig.cloudProjectsRoot, serverConfig.worktreesDir])) return "Forge blocked this agent turn because the project folder is outside the managed runtime workspace.";
283753
+ const isCloudExecutionRuntime = serverConfig.forgeCmmdRuntimeMode === true;
283754
+ const managedRoots = [serverConfig.cloudProjectsRoot, serverConfig.worktreesDir];
283755
+ if (isCloudExecutionRuntime && !isPathInsideAnyRoot(cwd, managedRoots)) return `Forge blocked this agent turn because the project folder is outside the managed runtime workspace. Folder: ${cwd}. Managed roots: ${managedRoots.join(", ")}.`;
283544
283756
  if (thread.anchorKind === "task" && project?.repositoryIdentity == null && !isGitWorkspace(cwd)) return "Forge created this task thread, but the project folder is not a Git repository yet. Import or link the repository before starting an agent turn.";
283545
283757
  return null;
283546
283758
  });
@@ -288942,6 +289154,7 @@ function executionEnvironmentCapabilities(serverConfig) {
288942
289154
  repositoryIdentity: true,
288943
289155
  pullRequests: isExecutionPlane,
288944
289156
  threadPullRequestLinking: isExecutionPlane,
289157
+ threadSettlement: isExecutionPlane,
288945
289158
  cloudMode: serverConfig.forgeCmmdRuntimeMode === true || isCloudShell,
288946
289159
  runtime: {
288947
289160
  topology: runtimeTopology(serverConfig),
@@ -289919,6 +290132,95 @@ const makeRuntimeServerSecretStore = require_Schema$1.gen(function* () {
289919
290132
  return (yield* ServerConfig).forgeCloudShellMode === true ? yield* makePostgresServerSecretStore : yield* makeLocalServerSecretStore;
289920
290133
  });
289921
290134
  const ServerSecretStoreRuntimeLive = require_Schema$1.effect(ServerSecretStore, makeRuntimeServerSecretStore);
290135
+ //#endregion
290136
+ //#region src/runtimeAuth/controlAuthorityRetry.ts
290137
+ /**
290138
+ * When to try for control authority again.
290139
+ *
290140
+ * CMMD ships continuously, so a Forge Cloud runtime will outlive restarts of its
290141
+ * own control plane. Obtaining authority is therefore not a startup-time
290142
+ * question: a runtime that asks once, gets an infrastructure page mid-deploy and
290143
+ * gives up stays unauthenticated until something happens to restart it while
290144
+ * CMMD is healthy. Measured: hours, on a Sprite whose guest was serving fine the
290145
+ * whole time.
290146
+ *
290147
+ * Two shapes of failure arrive here and they need opposite answers, which is why
290148
+ * `retryable` is decided at the boundary that saw the response rather than
290149
+ * guessed at here.
290150
+ */
290151
+ /** First backoff. Short on purpose: a deploy cutover is seconds, not minutes. */
290152
+ const BASE_DELAY_MS = 1e3;
290153
+ /**
290154
+ * Ceiling. Unbounded doubling turns a long outage into a long TAIL: an hour down
290155
+ * would be followed by up to an hour of avoidable downtime after recovery.
290156
+ */
290157
+ const MAX_DELAY_MS = 6e4;
290158
+ /**
290159
+ * Spread, as a fraction of the delay. A fleet loses authority at the same
290160
+ * instant when the control plane restarts, so without this every runtime
290161
+ * retries in lockstep and the recovering CMMD takes the whole fleet at once.
290162
+ *
290163
+ * Kept below 1 so jitter can only ADD: a later attempt must never be scheduled
290164
+ * sooner than an earlier one, or backoff stops meaning anything.
290165
+ */
290166
+ const JITTER_FRACTION = .25;
290167
+ function nextControlAuthorityAttempt(input) {
290168
+ if (!input.retryable) return {
290169
+ retry: false,
290170
+ delayMs: 0
290171
+ };
290172
+ const exponent = Math.max(0, input.consecutiveFailures - 1);
290173
+ const cap = MAX_DELAY_MS / (1 + JITTER_FRACTION);
290174
+ const base = Math.min(BASE_DELAY_MS * 2 ** exponent, cap);
290175
+ const random = input.random ?? Math.random;
290176
+ return {
290177
+ retry: true,
290178
+ delayMs: Math.round(base * (1 + JITTER_FRACTION * random()))
290179
+ };
290180
+ }
290181
+ /** Bounded retry budget. The next connect starts a fresh one. */
290182
+ const DEFAULT_MAX_ATTEMPTS = 8;
290183
+ /**
290184
+ * Keep asking for control authority while asking again could plausibly work.
290185
+ *
290186
+ * Bounded rather than infinite: a loop that gives up and says so lets the caller
290187
+ * log something actionable, and a connect or a heartbeat will start a fresh
290188
+ * budget anyway. An unbounded loop would hide the condition in exactly the way
290189
+ * the original `.catch(() => false)` did.
290190
+ */
290191
+ async function bootstrapWithRetry(input) {
290192
+ const maxAttempts = input.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
290193
+ let lastError;
290194
+ for (let attempts = 1; attempts <= maxAttempts; attempts += 1) {
290195
+ let retryable = true;
290196
+ try {
290197
+ if (await input.attempt()) return {
290198
+ ok: true,
290199
+ attempts
290200
+ };
290201
+ } catch (error) {
290202
+ lastError = error;
290203
+ retryable = typeof error === "object" && error !== null && "retryable" in error && error.retryable === true;
290204
+ }
290205
+ if (!retryable) return {
290206
+ ok: false,
290207
+ attempts,
290208
+ lastError
290209
+ };
290210
+ if (attempts === maxAttempts) break;
290211
+ const next = nextControlAuthorityAttempt({
290212
+ consecutiveFailures: attempts,
290213
+ retryable: true,
290214
+ ...input.random ? { random: input.random } : {}
290215
+ });
290216
+ await input.sleep(next.delayMs);
290217
+ }
290218
+ return {
290219
+ ok: false,
290220
+ attempts: maxAttempts,
290221
+ lastError
290222
+ };
290223
+ }
289922
290224
  var AuthControlPlaneError = class extends require_Schema$1.TaggedError("AuthControlPlaneError") {};
289923
290225
  var AuthControlPlane = class extends require_Schema$1.Service()("forge/AuthControlPlane") {};
289924
290226
  //#endregion
@@ -291118,19 +291420,24 @@ async function bootstrapControlAuthorityFromConnect(input) {
291118
291420
  const credentialEpoch = input.verified.credentialEpoch;
291119
291421
  const hasConnectScope = input.verified.scope.includes("http") || input.verified.scope.includes("ws");
291120
291422
  if (!controlPlaneUrl || !provisioningGrant || machineId === null || credentialEpoch === null || !hasConnectScope) return;
291121
- await require_runtimeControlAuthority.bootstrapRuntimeControlAuthority({
291122
- identity: {
291123
- controlPlaneUrl,
291124
- publicKeyPem: input.runtimeAuthConfig.publicKeyPem,
291125
- orgId: input.verified.orgId,
291126
- userId: input.verified.userId,
291127
- projectId: input.verified.projectId,
291128
- runtimeId: input.verified.runtimeId,
291129
- machineId,
291130
- credentialEpoch
291131
- },
291132
- connectToken: input.token,
291133
- provisioningGrant
291423
+ await bootstrapWithRetry({
291424
+ attempt: () => require_runtimeControlAuthority.bootstrapRuntimeControlAuthority({
291425
+ identity: {
291426
+ controlPlaneUrl,
291427
+ publicKeyPem: input.runtimeAuthConfig.publicKeyPem,
291428
+ orgId: input.verified.orgId,
291429
+ userId: input.verified.userId,
291430
+ projectId: input.verified.projectId,
291431
+ runtimeId: input.verified.runtimeId,
291432
+ machineId,
291433
+ credentialEpoch
291434
+ },
291435
+ connectToken: input.token,
291436
+ provisioningGrant
291437
+ }),
291438
+ sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms))
291439
+ }).then((result) => {
291440
+ if (!result.ok && result.lastError !== void 0) throw result.lastError;
291134
291441
  }).catch((error) => {
291135
291442
  console.error("[bootstrapControlAuthorityFromConnect] failed to establish runtime control authority; every heartbeat will report null until the next successful connect", {
291136
291443
  runtimeId: input.verified.runtimeId,
@@ -296504,6 +296811,32 @@ const readPersistedServerRuntimeState = (path) => require_Schema$1.gen(function*
296504
296811
  return yield* decodePersistedServerRuntimeState(trimmed).pipe(require_Schema$1.option);
296505
296812
  });
296506
296813
  //#endregion
296814
+ //#region src/orchestration/turnAdmission.ts
296815
+ /**
296816
+ * Whether a turn can actually run, as opposed to merely being accepted.
296817
+ *
296818
+ * A Forge Cloud runtime reaches its provider through CMMD, so without control
296819
+ * authority it cannot start a turn at all. It could still ACCEPT one: the
296820
+ * command validates, the thread and worktree are created, the user message is
296821
+ * recorded, and the turn then sits at `pending` forever with nothing surfaced.
296822
+ *
296823
+ * Measured on forge-cmmd-r03ad897c5e90 while CMMD was redeploying: HTTP 200 on
296824
+ * dispatch, five user messages, zero assistant messages, every turn stuck with
296825
+ * `started_at` empty. The client had no way to know.
296826
+ *
296827
+ * Kept as a pure function because the interesting part is the RULE, not the
296828
+ * plumbing: it is only cloud runtimes, only turns, and only when authority is
296829
+ * genuinely absent.
296830
+ */
296831
+ /** Commands that need a provider, and therefore need control authority. */
296832
+ const TURN_COMMANDS = new Set(["thread.turn.start"]);
296833
+ function refuseTurnWithoutControlAuthority(input) {
296834
+ if (!input.cmmdRuntimeMode) return null;
296835
+ if (!TURN_COMMANDS.has(input.commandType)) return null;
296836
+ if (input.hasControlAuthority) return null;
296837
+ return "This runtime has no CMMD control authority, so a turn cannot reach a provider and would queue without ever running. The runtime re-establishes authority on its own; retry shortly.";
296838
+ }
296839
+ //#endregion
296507
296840
  //#region ../../packages/shared/src/forgeCommands.ts
296508
296841
  /**
296509
296842
  * Forge loop commands (`/forge-*`) — the one trigger surface shared by humans
@@ -297072,6 +297405,16 @@ const orchestrationDispatchRouteLayer = add$1("POST", "/api/orchestration/dispat
297072
297405
  message: "Invalid orchestration command payload.",
297073
297406
  cause
297074
297407
  }))));
297408
+ const admissionRefusal = refuseTurnWithoutControlAuthority({
297409
+ commandType: normalizedCommand.type,
297410
+ cmmdRuntimeMode: process.env.FORGE_CMMD_RUNTIME_MODE === "true",
297411
+ hasControlAuthority: require_runtimeControlAuthority.readRuntimeControlAuthority({
297412
+ runtimeId: process.env.FORGE_CMMD_RUNTIME_ID ?? "",
297413
+ machineId: process.env.FORGE_CMMD_RUNTIME_MACHINE_ID ?? "",
297414
+ credentialEpoch: Number(process.env.FORGE_CMMD_RUNTIME_CREDENTIAL_EPOCH ?? "0")
297415
+ }) !== null
297416
+ });
297417
+ if (admissionRefusal !== null) return yield* new OrchestrationDispatchCommandError({ message: admissionRefusal });
297075
297418
  const dispatchEffect = normalizedCommand.type === "thread.turn.start" && normalizedCommand.bootstrap ? require_Schema$1.gen(function* () {
297076
297419
  const git = yield* require_Schema$1.serviceOption(GitCore);
297077
297420
  const gitStatusBroadcaster = yield* require_Schema$1.serviceOption(GitStatusBroadcaster);
@@ -299394,7 +299737,7 @@ const cmmdSetProviderAccountDefaultRouteLayer = registerProxyRoute({
299394
299737
  orgIdSource: "none",
299395
299738
  responseShape: "unwrapData"
299396
299739
  });
299397
- const resolveConnectedClaudeGenerationHash = (session) => require_Schema$1.gen(function* () {
299740
+ const resolveConnectedClaudeGeneration = (session) => require_Schema$1.gen(function* () {
299398
299741
  const outcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
299399
299742
  method: "GET",
299400
299743
  jwt,
@@ -299408,18 +299751,22 @@ const resolveConnectedClaudeGenerationHash = (session) => require_Schema$1.gen(f
299408
299751
  };
299409
299752
  return {
299410
299753
  ok: true,
299411
- value: (0, node_crypto.createHash)("sha256").update(state.generationId).digest("hex")
299754
+ value: {
299755
+ generationId: state.generationId,
299756
+ generationHash: (0, node_crypto.createHash)("sha256").update(state.generationId).digest("hex")
299757
+ }
299412
299758
  };
299413
299759
  });
299414
299760
  /**
299415
299761
  * The GET path is read-only. The explicit per-account POST refresh invokes
299416
299762
  * this helper and propagates any CMMD forward failure to the caller.
299417
299763
  */
299418
- const forwardClaudeUsageTelemetry = (session, providerAccountId = currentClaudeUsageGenerationId() ?? "", activelyPoll = false, fetchClaudeUsage = fetchClaudeUsageViaOfficialClient) => require_Schema$1.gen(function* () {
299419
- const credentialOutcome = yield* resolveConnectedClaudeGenerationHash(session);
299764
+ const forwardClaudeUsageTelemetry = (session, requestedProviderAccountId, activelyPoll = false, fetchClaudeUsage = fetchClaudeUsageViaOfficialClient) => require_Schema$1.gen(function* () {
299765
+ const credentialOutcome = yield* resolveConnectedClaudeGeneration(session);
299420
299766
  if (!credentialOutcome.ok) return credentialOutcome;
299421
- const generationId = currentClaudeUsageGenerationId();
299422
- if (credentialOutcome.value === null || generationId === null) return null;
299767
+ if (credentialOutcome.value === null) return null;
299768
+ const { generationId, generationHash } = credentialOutcome.value;
299769
+ const providerAccountId = requestedProviderAccountId ?? generationId;
299423
299770
  const activeSnapshot = activelyPoll && providerAccountId === generationId ? yield* require_Schema$1.tryPromise({
299424
299771
  try: () => fetchClaudeUsage({ binaryPath: resolveClaudeBinaryPath("claude") }),
299425
299772
  catch: (cause) => new ClaudeUsageReadError({ cause })
@@ -299427,7 +299774,7 @@ const forwardClaudeUsageTelemetry = (session, providerAccountId = currentClaudeU
299427
299774
  const snapshot = activeSnapshot ? {
299428
299775
  ...activeSnapshot,
299429
299776
  observedAt: (/* @__PURE__ */ new Date()).toISOString()
299430
- } : getLatestClaudeRateLimitTelemetry(credentialOutcome.value, providerAccountId);
299777
+ } : getLatestClaudeRateLimitTelemetry(generationHash, providerAccountId);
299431
299778
  if (!snapshot) return null;
299432
299779
  return yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
299433
299780
  method: "POST",
@@ -310761,16 +311108,16 @@ const gitUrlCloneRouteLayer = add$1("POST", "/api/cloud/git/clone-url", require_
310761
311108
  //#endregion
310762
311109
  //#region src/server.ts
310763
311110
  const PtyAdapterLive = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
310764
- if (typeof Bun !== "undefined") return (yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./BunPTY-2icf7sRj.cjs")))).layer;
310765
- else return (yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./NodePTY-cb7HIasY.cjs")))).layer;
311111
+ if (typeof Bun !== "undefined") return (yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./BunPTY-BjHFZATJ.cjs")))).layer;
311112
+ else return (yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./NodePTY-Bd9mvI6U.cjs")))).layer;
310766
311113
  }));
310767
311114
  const HttpServerLive = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
310768
311115
  const config = yield* ServerConfig;
310769
- if (typeof Bun !== "undefined") return (yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./BunHttpServer-DOAuw4Iq.cjs")))).layer({
311116
+ if (typeof Bun !== "undefined") return (yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./BunHttpServer-Dxx0kzQc.cjs")))).layer({
310770
311117
  port: config.port,
310771
311118
  ...config.host ? { hostname: config.host } : {}
310772
311119
  });
310773
- const [NodeHttpServer, NodeHttp] = yield* require_Schema$1.all([require_Schema$1.promise(() => Promise.resolve().then(() => require("./NodeHttpServer-D_ismXpd.cjs"))), require_Schema$1.promise(() => import("node:http"))]);
311120
+ const [NodeHttpServer, NodeHttp] = yield* require_Schema$1.all([require_Schema$1.promise(() => Promise.resolve().then(() => require("./NodeHttpServer-D6YVHsL8.cjs"))), require_Schema$1.promise(() => import("node:http"))]);
310774
311121
  return NodeHttpServer.layer(NodeHttp.createServer, {
310775
311122
  host: config.host,
310776
311123
  port: config.port
@@ -310778,10 +311125,10 @@ const HttpServerLive = require_Schema$1.unwrap(require_Schema$1.gen(function* ()
310778
311125
  }));
310779
311126
  const PlatformServicesLive = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
310780
311127
  if (typeof Bun !== "undefined") {
310781
- const { layer } = yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./BunServices-CiNXNzHD.cjs")));
311128
+ const { layer } = yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./BunServices-U1VBnEJS.cjs")));
310782
311129
  return layer;
310783
311130
  } else {
310784
- const { layer } = yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./NodeServices-BAl07hlH.cjs")));
311131
+ const { layer } = yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./NodeServices-BcQL_53W.cjs")));
310785
311132
  return layer;
310786
311133
  }
310787
311134
  }));
@@ -310849,7 +311196,7 @@ const MiscRuntimeLayerLive = require_Schema$1.mergeAll(AnalyticsServiceLayerLive
310849
311196
  const RuntimeDependenciesWithoutPullRequestsLive = ReactorLayerLive.pipe(require_Schema$1.provideMerge(CheckpointingLayerLive), require_Schema$1.provideMerge(GitLayerLive), require_Schema$1.provideMerge(OrchestrationLayerLive), require_Schema$1.provideMerge(ProviderLayerLive), require_Schema$1.provideMerge(TerminalLayerLive), require_Schema$1.provideMerge(AgentBrowserManagerLive), require_Schema$1.provideMerge(require_Schema$1.mergeAll(ThreadDevRuntimeLive, DevTunnelLive.pipe(require_Schema$1.provide$1(ThreadDevRuntimeLive)))), require_Schema$1.provideMerge(PersistenceLayerLive), require_Schema$1.provideMerge(KeybindingsLive), require_Schema$1.provideMerge(ProviderRegistryLive), require_Schema$1.provideMerge(require_Schema$1.mergeAll(ServerSettingsLive, UsageServiceLive.pipe(require_Schema$1.provide$1(ServerSettingsLive)))), require_Schema$1.provideMerge(WorkspaceLayerLive), require_Schema$1.provideMerge(WorkspaceReadinessStateLive), require_Schema$1.provideMerge(ProjectFaviconResolverLive), require_Schema$1.provideMerge(RepositoryIdentityResolverLive), require_Schema$1.provideMerge(ServerEnvironmentLive), require_Schema$1.provideMerge(AuthLayerLive), require_Schema$1.provideMerge(ServerSecretStoreLayerLive), require_Schema$1.provideMerge(require_Schema$1.mergeAll(CloudRedisCoordinationLive, CloudStateSyncLive.pipe(require_Schema$1.provide$1(PersistenceLayerLive)))), require_Schema$1.provideMerge(MiscRuntimeLayerLive));
310850
311197
  const RuntimeDependenciesLive = pullRequestServiceFactoryLayer.pipe(require_Schema$1.provideMerge(RuntimeDependenciesWithoutPullRequestsLive), require_Schema$1.provideMerge(cmmdProjectIdentityResolverLive.pipe(require_Schema$1.provide$1(RuntimeDependenciesWithoutPullRequestsLive))), require_Schema$1.provideMerge(pullRequestProviderRuntimeLive));
310851
311198
  const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(require_Schema$1.provideMerge(RuntimeDependenciesLive));
310852
- const makeRoutesLayer = require_Schema$1.mergeAll(authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authCommandBearerBootstrapRouteLayer, authCommandBootstrapRouteLayer, 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, 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(require_Schema$1.provide$1(browserApiCorsLayer));
311199
+ const makeRoutesLayer = require_Schema$1.mergeAll(authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authCommandBearerBootstrapRouteLayer, authCommandBootstrapRouteLayer, authOAuthTokenExchangeRouteLayer, 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, 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(require_Schema$1.provide$1(browserApiCorsLayer));
310853
311200
  const makeServerLayer = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
310854
311201
  const config = yield* ServerConfig;
310855
311202
  fixPath();