@cmmd-center/forge 0.13.20 → 0.13.22

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 (21) hide show
  1. package/dist/bin.cjs +218 -25
  2. package/dist/bin.mjs +242 -49
  3. package/dist/client/assets/{CanvasPanel-uofZ5KUR.js → CanvasPanel-DeDjy-X2.js} +2 -2
  4. package/dist/client/assets/{CompositeItem-C5YSRi5B.js → CompositeItem-CQubmTuU.js} +2 -2
  5. package/dist/client/assets/{DiffPanel-vMgoOgmn.js → DiffPanel-4dMGnRQx.js} +2 -2
  6. package/dist/client/assets/{DiffPanel.logic-BL2ToTuV.js → DiffPanel.logic-SlNrN8IK.js} +2 -2
  7. package/dist/client/assets/{DiffPanelShell-Dq2v4pBo.js → DiffPanelShell-BEZZSyhr.js} +3 -3
  8. package/dist/client/assets/{DiffWorkerPoolProvider-B2Da35Tj.js → DiffWorkerPoolProvider-DE_ppGS9.js} +2 -2
  9. package/dist/client/assets/{PullRequestCodePanel-ByFVxByx.js → PullRequestCodePanel-CsYCbixY.js} +2 -2
  10. package/dist/client/assets/{Virtualizer-B3YnhtJt.js → Virtualizer-DzZ4roLU.js} +2 -2
  11. package/dist/client/assets/{canvasStateStore-IBP3QM_C.js → canvasStateStore-UwPGvihn.js} +2 -2
  12. package/dist/client/assets/{cmmdAuthRedirect-Ck1QfYaS.js → cmmdAuthRedirect-BUli2MC4.js} +2 -2
  13. package/dist/client/assets/{index-gEW4XdYw.js → index-DW9nsKTK.js} +6 -6
  14. package/dist/client/assets/{popover-BQaoSlk7.js → popover-BpdZi4Uc.js} +2 -2
  15. package/dist/client/assets/src-DVtrA7UW.js +3 -0
  16. package/dist/client/assets/{toggle-CE2NHkQL.js → toggle-BUkm7Wlt.js} +2 -2
  17. package/dist/client/index.html +10 -10
  18. package/dist/forge-build.json +1 -1
  19. package/dist/{open-D8mGyWmt.mjs → open-FIgTDosf.mjs} +3 -3
  20. package/package.json +1 -1
  21. package/dist/client/assets/src-Bj8vTcnP.js +0 -3
package/dist/bin.cjs CHANGED
@@ -17245,7 +17245,8 @@ const ExecutionEnvironmentAuthCapabilities = require_Schema$1.Struct({
17245
17245
  ownerBootstrapPromotion: require_Schema$1.Boolean,
17246
17246
  bearerBootstrap: require_Schema$1.Boolean,
17247
17247
  desktopBootstrap: require_Schema$1.Boolean,
17248
- providerCredentialBroker: require_Schema$1.Boolean
17248
+ providerCredentialBroker: require_Schema$1.Boolean,
17249
+ cloudOwnerAssertion: require_Schema$1.optionalKey(require_Schema$1.Boolean)
17249
17250
  });
17250
17251
  const ExecutionEnvironmentToolCapabilities = require_Schema$1.Struct({
17251
17252
  agents: require_Schema$1.Boolean,
@@ -66231,7 +66232,7 @@ function normalizeNumberish(value) {
66231
66232
  }
66232
66233
  //#endregion
66233
66234
  //#region package.json
66234
- var version$1 = "0.13.20";
66235
+ var version$1 = "0.13.22";
66235
66236
  //#endregion
66236
66237
  //#region src/sentry.ts
66237
66238
  const SERVER_APP_NAME = "forge-server";
@@ -68356,6 +68357,7 @@ function extractCookieValue(setCookieHeaders, name) {
68356
68357
  }
68357
68358
  return null;
68358
68359
  }
68360
+ /** @internal exported for the other owner lanes and their tests. */
68359
68361
  function readCmmdJsonResponse(response, fallbackMessage) {
68360
68362
  return require_Schema$1.gen(function* () {
68361
68363
  const payload = yield* require_Schema$1.tryPromise({
@@ -68617,11 +68619,14 @@ function cmmdUserCredential(payload) {
68617
68619
  /**
68618
68620
  * Read one CMMD token-exchange response into the credential set Forge stores.
68619
68621
  *
68620
- * Both owner lanes redeem the same `cmmd-forge-web` authorization code — the
68621
- * browser OAuth callback and Cloud's password login — so they see the same
68622
- * bundle shape. Reading it in one place is what keeps them from drifting on
68623
- * which field carries the PAT; callers still own their own error reporting,
68624
- * which is the only part that legitimately differs between the two.
68622
+ * Every owner lane that redeems a CMMD grant — the browser OAuth callback,
68623
+ * Cloud's password login, the cookie-shaped session renew, and the bearer
68624
+ * device-session redeem in cloudOwnerDeviceSession.ts — sees the same bundle
68625
+ * shape. Reading it in one place is what keeps them from drifting on which
68626
+ * field carries the PAT; callers still own their own error reporting, which
68627
+ * is the only part that legitimately differs between them.
68628
+ *
68629
+ * @internal exported for the other owner lanes and their tests.
68625
68630
  */
68626
68631
  function resolveCmmdTokenBundleCredentials(tokenResult) {
68627
68632
  return require_Schema$1.gen(function* () {
@@ -69590,22 +69595,52 @@ const deriveServerPaths = require_Schema$1.fn(function* (baseDir, _devUrl, _mode
69590
69595
  secretsDir: join(stateDir, "secrets")
69591
69596
  };
69592
69597
  });
69593
- const ensureServerDirectories = require_Schema$1.fn(function* (derivedPaths) {
69598
+ /**
69599
+ * Create `dir`, healing the one case a recursive mkdir cannot: a symlink whose
69600
+ * target no longer exists.
69601
+ *
69602
+ * A recursive mkdir is a no-op when the path is already a directory, but it
69603
+ * fails when the path is a DANGLING symlink, because nothing on the way down
69604
+ * resolves. bun reports that as EEXIST and node as ENOENT; either way the call
69605
+ * raises instead of recreating what the link points at.
69606
+ *
69607
+ * That shape is normal on a CMMD cloud runtime. The regenerable cache
69608
+ * directories there are symlinks onto the sprite's machine-local /tmp, which is
69609
+ * a separate device that is NOT part of the checkpointed overlay, so a wipe
69610
+ * leaves the links behind and takes their targets. Only provisioning recreated
69611
+ * them, and provisioning does not re-run on a restart, so a wiped store meant
69612
+ * the server raised at boot, exited 1, and did so again on every supervisor
69613
+ * restart for as long as the runtime existed.
69614
+ *
69615
+ * Observed live on cloud runtime 33dff4ee: /forge/caches pointed at
69616
+ * /tmp/forge-store/caches, the target was gone, and the server failed to boot
69617
+ * 974 times between 2026-09-15 and 2026-09-16. Recreating the target directory
69618
+ * by hand was the whole repair, which is what this does automatically.
69619
+ *
69620
+ * Healing is deliberately narrow. A path that is not a symlink, or a symlink
69621
+ * whose target cannot be created, re-raises the original error rather than
69622
+ * inventing a directory somewhere the caller did not ask for.
69623
+ */
69624
+ const ensureDirectory = require_Schema$1.fn(function* (dir) {
69594
69625
  const fs = yield* require_Path.FileSystem;
69626
+ const path = yield* require_Path.Path;
69627
+ yield* fs.makeDirectory(dir, { recursive: true }).pipe(require_Schema$1.catch_((error) => fs.readLink(dir).pipe(require_Schema$1.flatMap((target) => fs.makeDirectory(path.resolve(path.dirname(dir), target), { recursive: true })), require_Schema$1.mapError(() => error))));
69628
+ });
69629
+ const ensureServerDirectories = require_Schema$1.fn(function* (derivedPaths) {
69595
69630
  const path = yield* require_Path.Path;
69596
69631
  yield* require_Schema$1.all([
69597
- fs.makeDirectory(derivedPaths.stateDir, { recursive: true }),
69598
- fs.makeDirectory(derivedPaths.logsDir, { recursive: true }),
69599
- fs.makeDirectory(derivedPaths.providerLogsDir, { recursive: true }),
69600
- fs.makeDirectory(derivedPaths.terminalLogsDir, { recursive: true }),
69601
- fs.makeDirectory(derivedPaths.attachmentsDir, { recursive: true }),
69602
- fs.makeDirectory(derivedPaths.worktreesDir, { recursive: true }),
69603
- fs.makeDirectory(path.dirname(derivedPaths.keybindingsConfigPath), { recursive: true }),
69604
- fs.makeDirectory(path.dirname(derivedPaths.settingsPath), { recursive: true }),
69605
- fs.makeDirectory(derivedPaths.providerStatusCacheDir, { recursive: true }),
69606
- fs.makeDirectory(path.dirname(derivedPaths.anonymousIdPath), { recursive: true }),
69607
- fs.makeDirectory(path.dirname(derivedPaths.environmentMetadataPath), { recursive: true }),
69608
- fs.makeDirectory(path.dirname(derivedPaths.serverRuntimeStatePath), { recursive: true })
69632
+ ensureDirectory(derivedPaths.stateDir),
69633
+ ensureDirectory(derivedPaths.logsDir),
69634
+ ensureDirectory(derivedPaths.providerLogsDir),
69635
+ ensureDirectory(derivedPaths.terminalLogsDir),
69636
+ ensureDirectory(derivedPaths.attachmentsDir),
69637
+ ensureDirectory(derivedPaths.worktreesDir),
69638
+ ensureDirectory(path.dirname(derivedPaths.keybindingsConfigPath)),
69639
+ ensureDirectory(path.dirname(derivedPaths.settingsPath)),
69640
+ ensureDirectory(derivedPaths.providerStatusCacheDir),
69641
+ ensureDirectory(path.dirname(derivedPaths.anonymousIdPath)),
69642
+ ensureDirectory(path.dirname(derivedPaths.environmentMetadataPath)),
69643
+ ensureDirectory(path.dirname(derivedPaths.serverRuntimeStatePath))
69609
69644
  ], { concurrency: "unbounded" });
69610
69645
  });
69611
69646
  /**
@@ -298212,7 +298247,7 @@ function resolveBuildCommitFromEnv(env) {
298212
298247
  * environment descriptor down instead of reporting an honest "unknown".
298213
298248
  */
298214
298249
  function readBakedBuildCommit() {
298215
- return "6acacb9afbe43fd2b2053436daaddaec3459a517";
298250
+ return "c9bc6514eb0d5f3c0eff3b12d396a11f7a96abef";
298216
298251
  }
298217
298252
  async function resolveServerBuildCommit(input) {
298218
298253
  if (isFullCommitSha(input.baked)) return input.baked;
@@ -298340,9 +298375,10 @@ function executionEnvironmentCapabilities(serverConfig) {
298340
298375
  auth: {
298341
298376
  cmmd: true,
298342
298377
  ownerBootstrapPromotion: !isRuntime && !isCloudShell,
298343
- bearerBootstrap: true,
298378
+ bearerBootstrap: !isCloudShell,
298344
298379
  desktopBootstrap: serverConfig.mode === "desktop" || serverConfig.desktopBootstrapToken !== void 0,
298345
- providerCredentialBroker: false
298380
+ providerCredentialBroker: false,
298381
+ cloudOwnerAssertion: isCloudShell
298346
298382
  },
298347
298383
  tools: {
298348
298384
  agents: isExecutionPlane,
@@ -298434,6 +298470,145 @@ const makeServerEnvironment = require_Schema$1.fn("makeServerEnvironment")(funct
298434
298470
  });
298435
298471
  const ServerEnvironmentLive = require_Schema$1.effect(ServerEnvironment, makeServerEnvironment());
298436
298472
  //#endregion
298473
+ //#region src/auth/http/cloudOwnerDeviceSession.ts
298474
+ /**
298475
+ * Native OAuth clients allowed to redeem a Forge Cloud session grant through
298476
+ * this bearer lane. Starts with only the mobile client from FOR-36841's
298477
+ * companion CMMD change; widen deliberately, not by accident.
298478
+ */
298479
+ const CLOUD_NATIVE_OAUTH_CLIENT_IDS = new Set(["cmmd-forge-mobile"]);
298480
+ const CloudOwnerSessionRedeemInput = require_Schema$1.Struct({
298481
+ sessionGrant: require_Schema$1.String,
298482
+ clientId: require_Schema$1.String
298483
+ });
298484
+ function outsideCloudShell() {
298485
+ return require_Schema$1.fail(new AuthError({
298486
+ message: "Forge Cloud session redemption is unavailable.",
298487
+ status: 403
298488
+ }));
298489
+ }
298490
+ function redeemSessionGrantWithCmmd(input) {
298491
+ return require_Schema$1.tryPromise({
298492
+ try: () => fetch(resolveCommandAppEndpoint("/api/mcp-server/oauth/token"), {
298493
+ method: "POST",
298494
+ headers: { "content-type": "application/json" },
298495
+ body: JSON.stringify({
298496
+ grant_type: "forge_session_grant",
298497
+ grant_token: input.sessionGrant,
298498
+ client_id: input.clientId
298499
+ })
298500
+ }),
298501
+ catch: (cause) => new AuthError({
298502
+ message: "Failed to redeem the Forge Cloud session grant with CMMD.",
298503
+ status: 500,
298504
+ cause
298505
+ })
298506
+ }).pipe(require_Schema$1.flatMap((response) => readCmmdJsonResponse(response, "Failed to redeem the Forge Cloud session grant with CMMD.")));
298507
+ }
298508
+ const cloudOwnerSessionRedeemRouteLayer = add$1("POST", "/api/auth/cloud/session", require_Schema$1.gen(function* () {
298509
+ const serverAuth = yield* ServerAuth;
298510
+ if (serverAuth.isForgeCloudShell?.() !== true) return yield* outsideCloudShell();
298511
+ const request = yield* require_HttpServer.HttpServerRequest;
298512
+ const limited = rateLimitOrRespond({
298513
+ routeClass: "auth-bootstrap",
298514
+ clientKey: clientKeyFromRequest(request)
298515
+ });
298516
+ if (limited) return limited;
298517
+ yield* serverAuth.authenticateHttpRequest(request);
298518
+ const payload = yield* require_HttpServer.schemaBodyJson(CloudOwnerSessionRedeemInput).pipe(require_Schema$1.mapError((cause) => new AuthError({
298519
+ message: "Invalid Forge Cloud session redeem payload.",
298520
+ status: 400,
298521
+ cause
298522
+ })));
298523
+ if (!CLOUD_NATIVE_OAUTH_CLIENT_IDS.has(payload.clientId)) return yield* new AuthError({
298524
+ message: "Unknown Forge Cloud native client.",
298525
+ status: 403
298526
+ });
298527
+ const tokenResult = yield* redeemSessionGrantWithCmmd(payload);
298528
+ const { tokenObj, cmmdIdentity, userId, accessToken, mcpToken, refreshToken, forgeOwnerAssertion, sessionGrantExpiresAt, isJwt, patToStore, jwtToStore } = yield* resolveCmmdTokenBundleCredentials(tokenResult);
298529
+ if (!cmmdIdentity || !userId || !patToStore) {
298530
+ yield* require_Schema$1.logError("Forge Cloud session redeem: CMMD token response incomplete.", {
298531
+ clientId: payload.clientId,
298532
+ tokenResponse: describeCmmdTokenResponseForLog({
298533
+ tokenObj,
298534
+ tokenResult,
298535
+ accessToken,
298536
+ mcpToken,
298537
+ refreshToken,
298538
+ isJwt,
298539
+ userId,
298540
+ patToStore,
298541
+ jwtToStore
298542
+ })
298543
+ });
298544
+ return yield* new AuthError({
298545
+ message: "CMMD did not return a complete redeemed Forge Cloud session.",
298546
+ status: 500
298547
+ });
298548
+ }
298549
+ const assertion = yield* validateCloudOwnerCallbackAssertion({
298550
+ serverAuth,
298551
+ assertionToken: forgeOwnerAssertion,
298552
+ authenticatedUserId: userId
298553
+ });
298554
+ if (!assertion) return yield* require_Schema$1.die(/* @__PURE__ */ new Error("Expected a redeemed Forge Cloud owner assertion for a native client."));
298555
+ yield* persistCloudOwnerArtifacts({
298556
+ assertion,
298557
+ accessToken: patToStore,
298558
+ identity: cmmdIdentity,
298559
+ jwtToken: jwtToStore,
298560
+ refreshToken,
298561
+ sessionGrant: payload.sessionGrant,
298562
+ sessionGrantExpiresAt
298563
+ });
298564
+ yield* require_Schema$1.logInfo("Forge Cloud owner session redeemed.", {
298565
+ sessionId: assertion.sessionId,
298566
+ clientId: payload.clientId,
298567
+ userId
298568
+ });
298569
+ return require_HttpServer.jsonUnsafe({
298570
+ assertion: assertion.token,
298571
+ assertionExpiresAt: require_Schema$1.toUtc(assertion.expiresAt),
298572
+ sessionGrantExpiresAt,
298573
+ user: {
298574
+ id: assertion.userId,
298575
+ email: cmmdIdentity.email
298576
+ }
298577
+ }, { status: 200 });
298578
+ }).pipe(require_Schema$1.catchTag("AuthError", (error) => respondToAuthError(error))));
298579
+ /**
298580
+ * Seam for CMMD-side session-grant revocation.
298581
+ *
298582
+ * As of FOR-36841, CMMD does not expose an endpoint to revoke a
298583
+ * `forge_session_grant` token server-side (confirm with the CMMD change
298584
+ * before wiring this in). When it does, call it here, best-effort: a failure
298585
+ * revoking at CMMD must never block the local row deletion below, which is
298586
+ * this endpoint's actual guarantee. Left as a documented no-op rather than a
298587
+ * guess at CMMD's eventual route shape.
298588
+ */
298589
+ function revokeCmmdSessionGrantBestEffort(_sessionId) {
298590
+ return require_Schema$1.void_;
298591
+ }
298592
+ const cloudOwnerSessionRevokeRouteLayer = add$1("POST", "/api/auth/cloud/session/revoke", require_Schema$1.gen(function* () {
298593
+ const serverAuth = yield* ServerAuth;
298594
+ if (serverAuth.isForgeCloudShell?.() !== true) return yield* outsideCloudShell();
298595
+ const request = yield* require_HttpServer.HttpServerRequest;
298596
+ const limited = rateLimitOrRespond({
298597
+ routeClass: "auth-bootstrap",
298598
+ clientKey: clientKeyFromRequest(request)
298599
+ });
298600
+ if (limited) return limited;
298601
+ const session = yield* serverAuth.authenticateHttpRequest(request);
298602
+ yield* clearCommandAccessTokenForSession(session.sessionId).pipe(require_Schema$1.mapError((cause) => new AuthError({
298603
+ message: "Failed to revoke the Forge Cloud owner session.",
298604
+ status: 500,
298605
+ cause
298606
+ })));
298607
+ yield* revokeCmmdSessionGrantBestEffort(session.sessionId);
298608
+ yield* require_Schema$1.logInfo("Forge Cloud owner session revoked.", { sessionId: session.sessionId });
298609
+ return require_HttpServer.empty({ status: 204 });
298610
+ }).pipe(require_Schema$1.catchTag("AuthError", (error) => respondToAuthError(error))));
298611
+ //#endregion
298437
298612
  //#region src/docs/http.ts
298438
298613
  const SCALAR_API_REFERENCE_URL = "https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.64.1";
298439
298614
  const SCALAR_API_REFERENCE_INTEGRITY = "sha384-SmFRDuBBmEoCbbBCTcn8/+cIQONyH0xgOKpsp6OttBlI8uG9uc6iAO8SonYQ3e1W";
@@ -300567,6 +300742,24 @@ function readWebSocketUpgradeToken(params) {
300567
300742
  }
300568
300743
  //#endregion
300569
300744
  //#region src/auth/Layers/ForgeCloudOwnerAuthentication.ts
300745
+ const BEARER_PREFIX = "Bearer ";
300746
+ /**
300747
+ * Reads a Forge Cloud owner assertion presented as `Authorization: Bearer
300748
+ * <assertion>`, alongside the cookie read below.
300749
+ *
300750
+ * Deliberately its own parser rather than a shared one: `ServerAuth.ts`
300751
+ * carries a bearer reader for the local bootstrap/pairing/desktop lanes, and
300752
+ * those must stay untouched by this change. This function is only ever
300753
+ * called from `authenticateForgeCloudOwnerRequest`, which itself only runs
300754
+ * when `serverConfig.forgeCloudShellMode === true` — so a non-cloud server's
300755
+ * bearer lanes never pass through here.
300756
+ */
300757
+ function readForgeCloudOwnerBearerToken(request) {
300758
+ const header = request.headers["authorization"];
300759
+ if (typeof header !== "string" || !header.startsWith(BEARER_PREFIX)) return null;
300760
+ const token = header.slice(7).trim();
300761
+ return token.length > 0 ? token : null;
300762
+ }
300570
300763
  function assertionVerifierConfig(config) {
300571
300764
  const publicKey = config.forgeCloudOwnerAssertionPublicKey;
300572
300765
  const keyId = config.forgeCloudOwnerAssertionKeyId;
@@ -300594,7 +300787,7 @@ function authenticateForgeCloudOwnerRequest(request, config) {
300594
300787
  message: "Forge Cloud owner assertion verification is misconfigured.",
300595
300788
  status: 500
300596
300789
  });
300597
- const token = request.cookies[FORGE_CLOUD_OWNER_ASSERTION_COOKIE];
300790
+ const token = request.cookies["forge_cloud_owner_assertion"] ?? readForgeCloudOwnerBearerToken(request);
300598
300791
  if (!token) return yield* new AuthError({
300599
300792
  message: "Authentication required.",
300600
300793
  status: 401
@@ -321763,7 +321956,7 @@ const MiscRuntimeLayerLive = require_Schema$1.mergeAll(AnalyticsServiceLayerLive
321763
321956
  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.provide$1(UsageSessionLookupLive), require_Schema$1.provide$1(UsageRecordedSourceLive.pipe(require_Schema$1.provide$1(OrchestrationLayerLive), require_Schema$1.provide$1(RuntimeReplicationOutboxLive), require_Schema$1.provide$1(ProviderSessionRuntimeRepositoryLive), require_Schema$1.provide$1(TextGenerationSessionRepositoryLive)))))), 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));
321764
321957
  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));
321765
321958
  const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(require_Schema$1.provideMerge(RuntimeDependenciesLive));
321766
- const makeRoutesLayer = require_Schema$1.mergeAll(attachmentUploadRouteLayer, authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authCommandBearerBootstrapRouteLayer, authCommandBootstrapRouteLayer, authOAuthTokenExchangeRouteLayer, authWebSocketTicketRouteLayer, authCmmdOAuthDeviceRouteLayer, authCmmdOAuthTokenRouteLayer, authCmmdPasswordTokenRouteLayer, authClientsRevokeOthersRouteLayer, authClientsRevokeRouteLayer, authClientsRouteLayer, authLogoutRouteLayer, authPairingLinksRevokeRouteLayer, authPairingLinksRouteLayer, authPairingCredentialRouteLayer, authSessionRenewRouteLayer, authSessionRouteLayer, authWebSocketTokenRouteLayer, authWebLoginRouteLayer, authWebCallbackRouteLayer, desktopLocalWebBridgePublishRouteLayer, desktopLocalWebBridgeBootstrapRouteLayer, desktopRelayControlPlaneRouteLayer, apiDocsHtmlRouteLayer, apiDocsOpenApiRouteLayer, pulseSignalStateListRouteLayer, pulseSignalStateUpsertRouteLayer, cmmdProfileRouteLayer, ...cmmdProxyRouteLayers, cmmdWorkIntakeRouteLayer, cmmdWsTokenRouteLayer, cmmdGetProjectCommentsRouteLayer, cmmdAddProjectCommentRouteLayer, cmmdUpdateProjectRouteLayer, cmmdUploadTaskAttachmentRouteLayer, cmmdUpdateTaskCommentRouteLayer, cmmdListWorkspaceMembersRouteLayer, cmmdAddProjectMemberRouteLayer, cmmdUpdateProjectAgentMemberAvatarRouteLayer, runtimeReplicationStatusRouteLayer, cmmdRefreshProviderUsageRouteLayer, cmmdForgeCloudProjectsListRouteLayer, cmmdForgeCloudProjectsEventsRouteLayer, cmmdForgeRuntimesEnsureRouteLayer, cmmdForgeRuntimesConnectRouteLayer, ownerRuntimeCodexReadinessRouteLayer, cmmdForgeRuntimesStatusRouteLayer, cmmdForgeRuntimesStartRouteLayer, cmmdForgeRuntimesStopRouteLayer, cmmdForgeRuntimesRecycleRouteLayer, cmmdForgeRuntimesUpdateCommitRouteLayer, cmmdForgeRuntimesDestroyRouteLayer, mobileProviderCatalogRouteLayer, attachmentsRouteLayer, orchestrationDispatchRouteLayer, orchestrationCmmdWorkRunEventRouteLayer, orchestrationAutomationStartThreadRouteLayer, orchestrationAutomationRebindRouteLayer, orchestrationAutomationTerminalReconcileRouteLayer, mobileGitRunStackedActionRouteLayer, pullRequestDiffRouteLayer, orchestrationSnapshotRouteLayer, orchestrationThreadSnapshotRouteLayer, 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, runtimeFilesystemHealthRouteLayer, claudeNativeGenerationProofRouteLayer, claudeUsageRouteLayer, codexRuntimeProviderReadinessRouteLayer, runtimeDiagnosticsRouteLayer, cloudFoldersRouteLayer, cloudProjectCreateRouteLayer, gitUrlCloneRouteLayer, websocketRpcRouteLayer).pipe(require_Schema$1.provide$1(browserApiCorsLayer));
321959
+ const makeRoutesLayer = require_Schema$1.mergeAll(attachmentUploadRouteLayer, authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authCommandBearerBootstrapRouteLayer, authCommandBootstrapRouteLayer, authOAuthTokenExchangeRouteLayer, authWebSocketTicketRouteLayer, authCmmdOAuthDeviceRouteLayer, authCmmdOAuthTokenRouteLayer, authCmmdPasswordTokenRouteLayer, authClientsRevokeOthersRouteLayer, authClientsRevokeRouteLayer, authClientsRouteLayer, authLogoutRouteLayer, authPairingLinksRevokeRouteLayer, authPairingLinksRouteLayer, authPairingCredentialRouteLayer, authSessionRenewRouteLayer, authSessionRouteLayer, authWebSocketTokenRouteLayer, authWebLoginRouteLayer, authWebCallbackRouteLayer, cloudOwnerSessionRedeemRouteLayer, cloudOwnerSessionRevokeRouteLayer, desktopLocalWebBridgePublishRouteLayer, desktopLocalWebBridgeBootstrapRouteLayer, desktopRelayControlPlaneRouteLayer, apiDocsHtmlRouteLayer, apiDocsOpenApiRouteLayer, pulseSignalStateListRouteLayer, pulseSignalStateUpsertRouteLayer, cmmdProfileRouteLayer, ...cmmdProxyRouteLayers, cmmdWorkIntakeRouteLayer, cmmdWsTokenRouteLayer, cmmdGetProjectCommentsRouteLayer, cmmdAddProjectCommentRouteLayer, cmmdUpdateProjectRouteLayer, cmmdUploadTaskAttachmentRouteLayer, cmmdUpdateTaskCommentRouteLayer, cmmdListWorkspaceMembersRouteLayer, cmmdAddProjectMemberRouteLayer, cmmdUpdateProjectAgentMemberAvatarRouteLayer, runtimeReplicationStatusRouteLayer, cmmdRefreshProviderUsageRouteLayer, cmmdForgeCloudProjectsListRouteLayer, cmmdForgeCloudProjectsEventsRouteLayer, cmmdForgeRuntimesEnsureRouteLayer, cmmdForgeRuntimesConnectRouteLayer, ownerRuntimeCodexReadinessRouteLayer, cmmdForgeRuntimesStatusRouteLayer, cmmdForgeRuntimesStartRouteLayer, cmmdForgeRuntimesStopRouteLayer, cmmdForgeRuntimesRecycleRouteLayer, cmmdForgeRuntimesUpdateCommitRouteLayer, cmmdForgeRuntimesDestroyRouteLayer, mobileProviderCatalogRouteLayer, attachmentsRouteLayer, orchestrationDispatchRouteLayer, orchestrationCmmdWorkRunEventRouteLayer, orchestrationAutomationStartThreadRouteLayer, orchestrationAutomationRebindRouteLayer, orchestrationAutomationTerminalReconcileRouteLayer, mobileGitRunStackedActionRouteLayer, pullRequestDiffRouteLayer, orchestrationSnapshotRouteLayer, orchestrationThreadSnapshotRouteLayer, 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, runtimeFilesystemHealthRouteLayer, claudeNativeGenerationProofRouteLayer, claudeUsageRouteLayer, codexRuntimeProviderReadinessRouteLayer, runtimeDiagnosticsRouteLayer, cloudFoldersRouteLayer, cloudProjectCreateRouteLayer, gitUrlCloneRouteLayer, websocketRpcRouteLayer).pipe(require_Schema$1.provide$1(browserApiCorsLayer));
321767
321960
  const makeServerLayer = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
321768
321961
  const config = yield* ServerConfig;
321769
321962
  fixPath({ preferProcessPath: config.forgeCmmdRuntimeMode === true });