@cmmd-center/forge 0.13.76 → 0.13.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.cjs CHANGED
@@ -66275,7 +66275,7 @@ function normalizeNumberish(value) {
66275
66275
  }
66276
66276
  //#endregion
66277
66277
  //#region package.json
66278
- var version$1 = "0.13.76";
66278
+ var version$1 = "0.13.78";
66279
66279
  //#endregion
66280
66280
  //#region src/sentry.ts
66281
66281
  const SERVER_APP_NAME = "forge-server";
@@ -298914,7 +298914,7 @@ function resolveBuildCommitFromEnv(env) {
298914
298914
  * environment descriptor down instead of reporting an honest "unknown".
298915
298915
  */
298916
298916
  function readBakedBuildCommit() {
298917
- return "3c1016247a3dd875ae36f6c99f417e28049ae9c7";
298917
+ return "703f97e0013867e0b5a3ebff1cd0d623fc868c16";
298918
298918
  }
298919
298919
  async function resolveServerBuildCommit(input) {
298920
298920
  if (isFullCommitSha(input.baked)) return input.baked;
@@ -308981,6 +308981,7 @@ const __cmmdProxyRouteLayersStartIndex = registeredProxyRouteLayers().length;
308981
308981
  */
308982
308982
  const CMMD_CLOUD_PROJECTS_PATH = "/api/forge/context/cloud-projects";
308983
308983
  const CMMD_RUNTIMES_PATH = "/api/forge/context/runtimes";
308984
+ const CMMD_ENVIRONMENTS_PATH = "/api/forge/context/environments";
308984
308985
  /**
308985
308986
  * Authenticate the browser session and resolve the CMMD JWT to forward
308986
308987
  * upstream. `jwt` is null when none could be resolved, which every caller
@@ -311108,12 +311109,8 @@ registerProxyRoute({
311108
311109
  });
311109
311110
  const FORGE_RUNTIMES_POLL_INTERVAL = require_Schema$1.seconds(5);
311110
311111
  const FORGE_RUNTIMES_KEEPALIVE_INTERVAL = require_Schema$1.seconds(25);
311111
- function encodeForgeCloudProjectsFrame(projects, environments, capacity = null) {
311112
- return new TextEncoder().encode(`event: cloud-projects\ndata: ${JSON.stringify({
311113
- projects,
311114
- environments,
311115
- capacity
311116
- })}\n\n`);
311112
+ function encodeForgeCatalogFrame(eventName, payload) {
311113
+ return new TextEncoder().encode(`event: ${eventName}\ndata: ${JSON.stringify(payload)}\n\n`);
311117
311114
  }
311118
311115
  /**
311119
311116
  * Emitted when the upstream CMMD returns HTTP 401 or 403.
@@ -311124,13 +311121,14 @@ const FORGE_RUNTIMES_AUTH_REQUIRED_FRAME = new TextEncoder().encode("event: auth
311124
311121
  const FORGE_RUNTIMES_KEEPALIVE_FRAME = new TextEncoder().encode(": ping\n\n");
311125
311122
  const FORGE_RUNTIMES_KICKOFF_FRAME = new TextEncoder().encode(": ok\n\n");
311126
311123
  /**
311127
- * Fetches the upstream CMMD cloud-project catalog for one poll tick.
311124
+ * Fetches an upstream CMMD catalog for one poll tick of a catalog SSE proxy.
311128
311125
  *
311129
311126
  * Returns:
311130
- * - `Uint8Array` (cloud-projects frame) — successful response
311127
+ * - `Uint8Array` (catalog frame) — successful response
311131
311128
  * - `FORGE_RUNTIMES_AUTH_REQUIRED_FRAME` — upstream returned 401 or 403
311132
- * - `null` — any other non-ok status (5xx, etc.); the caller must skip this
311133
- * tick so the client cache is never poisoned by an error frame
311129
+ * - `null` — any other non-ok status (5xx, a body without this proxy's
311130
+ * collections); the caller must skip the tick so the client cache is never
311131
+ * poisoned by an error frame
311134
311132
  *
311135
311133
  * Network errors also return `null` (skip-tick, never blank the client cache).
311136
311134
  *
@@ -311139,47 +311137,82 @@ const FORGE_RUNTIMES_KICKOFF_FRAME = new TextEncoder().encode(": ok\n\n");
311139
311137
  * is the designed failure mode. Retrying here would stack a second backoff
311140
311138
  * inside the first and delay the frame the client is waiting on.
311141
311139
  */
311142
- function makeFetchCloudProjectsFrameEffect(upstreamUrl, accessToken) {
311140
+ function makeFetchForgeCatalogFrameEffect(proxy, upstreamUrl, accessToken) {
311143
311141
  return require_Schema$1.tryPromise(() => fetch(upstreamUrl, { headers: {
311144
311142
  Authorization: `Bearer ${accessToken}`,
311145
311143
  Accept: "application/json"
311146
311144
  } }).then(async (res) => {
311147
311145
  if (res.status === 401 || res.status === 403) {
311148
- console.warn(`[forge-cloud-projects/events] upstream auth failure: ${res.status}`);
311146
+ console.warn(`[${proxy.logTag}] upstream auth failure: ${res.status}`);
311149
311147
  return FORGE_RUNTIMES_AUTH_REQUIRED_FRAME;
311150
311148
  }
311151
311149
  if (!res.ok) {
311152
311150
  const errBody = await res.text().catch(() => "");
311153
- console.warn(`[forge-cloud-projects/events] upstream ${res.status}:`, errBody.slice(0, 200));
311151
+ console.warn(`[${proxy.logTag}] upstream ${res.status}:`, errBody.slice(0, 200));
311154
311152
  return null;
311155
311153
  }
311156
311154
  const json = await res.json();
311157
311155
  const unwrapped = json && typeof json === "object" && "data" in json && json["data"] ? json["data"] : json;
311158
- const projects = unwrapped?.["projects"];
311159
- const environments = unwrapped?.["environments"];
311160
- if (!Array.isArray(projects) || !Array.isArray(environments)) return null;
311161
- return encodeForgeCloudProjectsFrame(projects, environments, unwrapped?.["capacity"] ?? null);
311156
+ const payload = unwrapped ? proxy.extractPayload(unwrapped) : null;
311157
+ return payload === null ? null : encodeForgeCatalogFrame(proxy.eventName, payload);
311162
311158
  })).pipe(require_Schema$1.catch_(() => require_Schema$1.succeed(null)));
311163
311159
  }
311164
- const cmmdForgeCloudProjectsEventsRouteLayer = add$1("GET", "/api/cmmd/forge-cloud-projects/events", require_Schema$1.gen(function* () {
311165
- const { session, jwt: accessToken } = yield* makeCmmdProxyAccessTokenEffect("forge-cloud-projects/events");
311166
- if (!accessToken) return yield* respondCmmdConnectionRequired(session.sessionId);
311167
- const fetchCloudProjectsFrame = makeFetchCloudProjectsFrameEffect(`${resolveCommandAppUrl()}${CMMD_CLOUD_PROJECTS_PATH}`, accessToken);
311168
- const dataStream = require_Path.concat(require_Path.fromEffect(fetchCloudProjectsFrame), require_Path.tick(FORGE_RUNTIMES_POLL_INTERVAL).pipe(require_Path.mapEffect(() => fetchCloudProjectsFrame))).pipe(require_Path.filter((frame) => frame !== null));
311169
- const keepaliveStream = require_Path.tick(FORGE_RUNTIMES_KEEPALIVE_INTERVAL).pipe(require_Path.map(() => FORGE_RUNTIMES_KEEPALIVE_FRAME));
311170
- const frames = require_Path.concat(require_Path.succeed(FORGE_RUNTIMES_KICKOFF_FRAME), require_Path.merge(dataStream, keepaliveStream)).pipe(require_Path.ensuring(require_Schema$1.sync(() => {
311171
- console.debug("[forge-cloud-projects/events] SSE stream finalizer: connection closed or fiber interrupted");
311172
- })));
311173
- return require_HttpServer.stream(frames, {
311174
- status: 200,
311175
- headers: {
311176
- "content-type": "text/event-stream",
311177
- "cache-control": "no-cache",
311178
- connection: "keep-alive",
311179
- "x-accel-buffering": "no"
311180
- }
311181
- });
311182
- }).pipe(require_Schema$1.catchTag("AuthError", (error) => respondToAuthError(error))));
311160
+ /**
311161
+ * The poll-and-emit SSE handler shared by every CMMD catalog proxy: emits a
311162
+ * kickoff comment, an immediate snapshot, a frame per 5 s poll tick, and a
311163
+ * keepalive comment every ~25 s, until the client disconnects (Effect stream
311164
+ * interruption; `Stream.ensuring` logs the shutdown observably).
311165
+ */
311166
+ function makeForgeCatalogEventsHandler(proxy, upstreamUrl) {
311167
+ return require_Schema$1.gen(function* () {
311168
+ const { session, jwt: accessToken } = yield* makeCmmdProxyAccessTokenEffect(proxy.logTag);
311169
+ if (!accessToken) return yield* respondCmmdConnectionRequired(session.sessionId);
311170
+ const fetchFrame = makeFetchForgeCatalogFrameEffect(proxy, upstreamUrl, accessToken);
311171
+ const dataStream = require_Path.concat(require_Path.fromEffect(fetchFrame), require_Path.tick(FORGE_RUNTIMES_POLL_INTERVAL).pipe(require_Path.mapEffect(() => fetchFrame))).pipe(require_Path.filter((frame) => frame !== null));
311172
+ const keepaliveStream = require_Path.tick(FORGE_RUNTIMES_KEEPALIVE_INTERVAL).pipe(require_Path.map(() => FORGE_RUNTIMES_KEEPALIVE_FRAME));
311173
+ const frames = require_Path.concat(require_Path.succeed(FORGE_RUNTIMES_KICKOFF_FRAME), require_Path.merge(dataStream, keepaliveStream)).pipe(require_Path.ensuring(require_Schema$1.sync(() => {
311174
+ console.debug(`[${proxy.logTag}] SSE stream finalizer: connection closed or fiber interrupted`);
311175
+ })));
311176
+ return require_HttpServer.stream(frames, {
311177
+ status: 200,
311178
+ headers: {
311179
+ "content-type": "text/event-stream",
311180
+ "cache-control": "no-cache",
311181
+ connection: "keep-alive",
311182
+ "x-accel-buffering": "no"
311183
+ }
311184
+ });
311185
+ }).pipe(require_Schema$1.catchTag("AuthError", (error) => respondToAuthError(error)));
311186
+ }
311187
+ const cmmdForgeCloudProjectsEventsRouteLayer = add$1("GET", "/api/cmmd/forge-cloud-projects/events", makeForgeCatalogEventsHandler({
311188
+ logTag: "forge-cloud-projects/events",
311189
+ eventName: "cloud-projects",
311190
+ extractPayload: (unwrapped) => {
311191
+ const projects = unwrapped["projects"];
311192
+ const environments = unwrapped["environments"];
311193
+ if (!Array.isArray(projects) || !Array.isArray(environments)) return null;
311194
+ return {
311195
+ projects,
311196
+ environments,
311197
+ capacity: unwrapped["capacity"] ?? null
311198
+ };
311199
+ }
311200
+ }, `${resolveCommandAppUrl()}${CMMD_CLOUD_PROJECTS_PATH}`));
311201
+ registerProxyRoute({
311202
+ forgePath: "/api/cmmd/environments",
311203
+ method: "GET",
311204
+ cmmdPath: CMMD_ENVIRONMENTS_PATH,
311205
+ orgIdSource: "none",
311206
+ responseShape: "unwrapData"
311207
+ });
311208
+ const cmmdForgeEnvironmentsEventsRouteLayer = add$1("GET", "/api/cmmd/environments/events", makeForgeCatalogEventsHandler({
311209
+ logTag: "forge-environments/events",
311210
+ eventName: "environments",
311211
+ extractPayload: (unwrapped) => {
311212
+ const environments = unwrapped["environments"];
311213
+ return Array.isArray(environments) ? { environments } : null;
311214
+ }
311215
+ }, `${resolveCommandAppUrl()}${CMMD_ENVIRONMENTS_PATH}`));
311183
311216
  function splitCmmdRuntimeOrganizationScope(raw) {
311184
311217
  if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
311185
311218
  const body = { ...raw };
@@ -322704,7 +322737,7 @@ const MiscRuntimeLayerLive = require_Schema$1.mergeAll(AnalyticsServiceLayerLive
322704
322737
  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));
322705
322738
  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));
322706
322739
  const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(require_Schema$1.provideMerge(RuntimeDependenciesLive));
322707
- 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));
322740
+ 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, cmmdForgeEnvironmentsEventsRouteLayer, 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));
322708
322741
  const makeServerLayer = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
322709
322742
  const config = yield* ServerConfig;
322710
322743
  fixPath({ preferProcessPath: config.forgeCmmdRuntimeMode === true });
package/dist/bin.mjs CHANGED
@@ -23,7 +23,7 @@ import { createCipheriv, createDecipheriv, createHash, createHmac, createPublicK
23
23
  import * as FS$1 from "node:fs";
24
24
  import fs, { accessSync, chmodSync, constants, createReadStream, existsSync, mkdirSync, mkdtempSync, promises, readFile, readFileSync, readdir, readdirSync, realpathSync, rmSync, statSync, unlinkSync, writeFileSync } from "node:fs";
25
25
  import * as NodeOS from "node:os";
26
- import os, { homedir, networkInterfaces, tmpdir } from "node:os";
26
+ import $U, { homedir, networkInterfaces, tmpdir } from "node:os";
27
27
  import * as Path$1 from "node:path";
28
28
  import path, { basename, delimiter, dirname, extname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
29
29
  import { pathToFileURL } from "node:url";
@@ -50591,7 +50591,7 @@ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
50591
50591
  const min = forceColor || 0;
50592
50592
  if (env.TERM === "dumb") return min;
50593
50593
  if (process$1.platform === "win32") {
50594
- const osRelease = os.release().split(".");
50594
+ const osRelease = $U.release().split(".");
50595
50595
  if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) return Number(osRelease[2]) >= 14931 ? 3 : 2;
50596
50596
  return 1;
50597
50597
  }
@@ -53034,7 +53034,7 @@ var require_ProcessDetector = /* @__PURE__ */ __commonJSMin(((exports) => {
53034
53034
  exports.processDetector = void 0;
53035
53035
  const api_1 = (init_esm$1(), __toCommonJS(esm_exports$1));
53036
53036
  const semconv_1 = require_semconv$1();
53037
- const os$4 = __require("os");
53037
+ const os$3 = __require("os");
53038
53038
  /**
53039
53039
  * ProcessDetector will be used to detect the resources related current process running
53040
53040
  * and being instrumented from the NodeJS Process module.
@@ -53056,7 +53056,7 @@ var require_ProcessDetector = /* @__PURE__ */ __commonJSMin(((exports) => {
53056
53056
  };
53057
53057
  if (process.argv.length > 1) attributes[semconv_1.ATTR_PROCESS_COMMAND] = process.argv[1];
53058
53058
  try {
53059
- const userInfo = os$4.userInfo();
53059
+ const userInfo = os$3.userInfo();
53060
53060
  attributes[semconv_1.ATTR_PROCESS_OWNER] = userInfo.username;
53061
53061
  } catch (e) {
53062
53062
  api_1.diag.debug(`error obtaining process owner: ${e}`);
@@ -65979,7 +65979,7 @@ function normalizeNumberish(value) {
65979
65979
  }
65980
65980
  //#endregion
65981
65981
  //#region package.json
65982
- var version$1 = "0.13.76";
65982
+ var version$1 = "0.13.78";
65983
65983
  //#endregion
65984
65984
  //#region src/sentry.ts
65985
65985
  const SERVER_APP_NAME = "forge-server";
@@ -76022,7 +76022,7 @@ var require_node_gyp_build = /* @__PURE__ */ __commonJSMin(((exports, module) =>
76022
76022
  var fs$6 = __require("fs");
76023
76023
  var path$5 = __require("path");
76024
76024
  var url$1 = __require("url");
76025
- var os$3 = __require("os");
76025
+ var os$2 = __require("os");
76026
76026
  var runtimeRequire = typeof __webpack_require__ === "function" ? __non_webpack_require__ : __require;
76027
76027
  var vars = process.config && process.config.variables || {};
76028
76028
  var prebuildsOnly = !!process.env.PREBUILDS_ONLY;
@@ -76030,8 +76030,8 @@ var require_node_gyp_build = /* @__PURE__ */ __commonJSMin(((exports, module) =>
76030
76030
  var abi = versions.modules;
76031
76031
  if (versions.deno || process.isBun) abi = "unsupported";
76032
76032
  var runtime = isElectron() ? "electron" : isNwjs() ? "node-webkit" : "node";
76033
- var arch = process.env.npm_config_arch || os$3.arch();
76034
- var platform = process.env.npm_config_platform || os$3.platform();
76033
+ var arch = process.env.npm_config_arch || os$2.arch();
76034
+ var platform = process.env.npm_config_platform || os$2.platform();
76035
76035
  var libc = process.env.LIBC || (isMusl(platform) ? "musl" : "glibc");
76036
76036
  var armv = process.env.ARM_VERSION || (arch === "arm64" ? "8" : vars.arm_version) || "";
76037
76037
  var uv = (versions.uv || "").split(".")[0];
@@ -93872,7 +93872,7 @@ const launchDetached = (launch) => gen(function* () {
93872
93872
  });
93873
93873
  const OpenLive = effect(Open, gen(function* () {
93874
93874
  const open = yield* tryPromise({
93875
- try: () => import("./open-yHTUkd2Y.mjs"),
93875
+ try: () => import("./open-2-reBrpv.mjs"),
93876
93876
  catch: (cause) => new OpenError$1({
93877
93877
  message: "failed to load browser opener",
93878
93878
  cause
@@ -191811,7 +191811,7 @@ var Vce = {
191811
191811
  function Ve() {
191812
191812
  return Vce;
191813
191813
  }
191814
- var Us = os.homedir(), lk = os.tmpdir(), { env: Vc } = process$1, Yce = (e) => {
191814
+ var Us = $U.homedir(), lk = $U.tmpdir(), { env: Vc } = process$1, Yce = (e) => {
191815
191815
  let t = path.join(Us, "Library");
191816
191816
  return {
191817
191817
  data: path.join(t, "Application Support", e),
@@ -202011,12 +202011,12 @@ function qZ(e, t) {
202011
202011
  }
202012
202012
  return n;
202013
202013
  }
202014
- var os$2 = "https://code.claude.com/docs/en", kKe = [
202014
+ var os$1 = "https://code.claude.com/docs/en", kKe = [
202015
202015
  {
202016
202016
  matches: (e) => e.path === "permissions.defaultMode" && e.code === "invalid_value",
202017
202017
  tip: {
202018
202018
  suggestion: "Valid modes: \"acceptEdits\" (ask before file changes), \"plan\" (analysis only), \"bypassPermissions\" (auto-accept all), or \"default\" (standard behavior)",
202019
- docLink: `${os$2}/iam#permission-modes`
202019
+ docLink: `${os$1}/iam#permission-modes`
202020
202020
  }
202021
202021
  },
202022
202022
  {
@@ -202031,7 +202031,7 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
202031
202031
  matches: (e) => e.path.startsWith("env.") && e.code === "invalid_type",
202032
202032
  tip: {
202033
202033
  suggestion: "Environment variables must be strings. Wrap numbers and booleans in quotes. Example: \"DEBUG\": \"true\", \"PORT\": \"3000\"",
202034
- docLink: `${os$2}/settings#environment-variables`
202034
+ docLink: `${os$1}/settings#environment-variables`
202035
202035
  }
202036
202036
  },
202037
202037
  {
@@ -202042,14 +202042,14 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
202042
202042
  matches: (e) => e.path.startsWith("hooks.") && e.code === "invalid_key",
202043
202043
  tip: {
202044
202044
  suggestion: "Not a recognized hook event. Common events: PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, SessionEnd, Stop. Check spelling and capitalization.",
202045
- docLink: `${os$2}/hooks`
202045
+ docLink: `${os$1}/hooks`
202046
202046
  }
202047
202047
  },
202048
202048
  {
202049
202049
  matches: (e) => /\.hooks\.\d+\.command$/.test(e.path) && e.code === "invalid_type" && e.received === "undefined",
202050
202050
  tip: {
202051
202051
  suggestion: "Command hooks require `command`. For exec form (no shell), set `command` to the executable and `args` to its arguments: {\"type\": \"command\", \"command\": \"echo\", \"args\": [\"hi\"]}. For shell form, set `command` to the full shell string: {\"type\": \"command\", \"command\": \"echo hi\"}.",
202052
- docLink: `${os$2}/hooks#exec-form-and-shell-form`
202052
+ docLink: `${os$1}/hooks#exec-form-and-shell-form`
202053
202053
  }
202054
202054
  },
202055
202055
  {
@@ -202064,7 +202064,7 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
202064
202064
  matches: (e) => e.code === "unrecognized_keys",
202065
202065
  tip: {
202066
202066
  suggestion: "Check for typos or refer to the documentation for valid fields",
202067
- docLink: `${os$2}/settings`
202067
+ docLink: `${os$1}/settings`
202068
202068
  }
202069
202069
  },
202070
202070
  {
@@ -202079,13 +202079,13 @@ var os$2 = "https://code.claude.com/docs/en", kKe = [
202079
202079
  matches: (e) => e.path === "permissions.additionalDirectories" && e.code === "invalid_type",
202080
202080
  tip: {
202081
202081
  suggestion: "Must be an array of directory paths. Example: [\"~/projects\", \"/tmp/workspace\"]. You can also use --add-dir flag or /add-dir command",
202082
- docLink: `${os$2}/iam#working-directories`
202082
+ docLink: `${os$1}/iam#working-directories`
202083
202083
  }
202084
202084
  }
202085
202085
  ], AKe = {
202086
- permissions: `${os$2}/iam#configuring-permissions`,
202087
- env: `${os$2}/settings#environment-variables`,
202088
- hooks: `${os$2}/hooks`
202086
+ permissions: `${os$1}/iam#configuring-permissions`,
202087
+ env: `${os$1}/settings#environment-variables`,
202088
+ hooks: `${os$1}/hooks`
202089
202089
  };
202090
202090
  function GZ(e) {
202091
202091
  let t = kKe.find((r) => r.matches(e));
@@ -270287,7 +270287,7 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
270287
270287
  var dgram = __require("dgram");
270288
270288
  var thunky = require_thunky();
270289
270289
  var events = __require("events");
270290
- var os$1 = __require("os");
270290
+ var os = __require("os");
270291
270291
  var noop = function() {};
270292
270292
  module.exports = function(opts) {
270293
270293
  if (!opts) opts = {};
@@ -270418,14 +270418,14 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
270418
270418
  return that;
270419
270419
  };
270420
270420
  function defaultInterface() {
270421
- var networks = os$1.networkInterfaces();
270421
+ var networks = os.networkInterfaces();
270422
270422
  var names = Object.keys(networks);
270423
270423
  for (var i = 0; i < names.length; i++) {
270424
270424
  var net = networks[names[i]];
270425
270425
  for (var j = 0; j < net.length; j++) {
270426
270426
  var iface = net[j];
270427
270427
  if (isIPv4(iface.family) && !iface.internal) {
270428
- if (os$1.platform() === "darwin" && names[i] === "en0") return iface.address;
270428
+ if (os.platform() === "darwin" && names[i] === "en0") return iface.address;
270429
270429
  return "0.0.0.0";
270430
270430
  }
270431
270431
  }
@@ -270433,7 +270433,7 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
270433
270433
  return "127.0.0.1";
270434
270434
  }
270435
270435
  function allInterfaces() {
270436
- var networks = os$1.networkInterfaces();
270436
+ var networks = os.networkInterfaces();
270437
270437
  var names = Object.keys(networks);
270438
270438
  var res = [];
270439
270439
  for (var i = 0; i < names.length; i++) {
@@ -298359,7 +298359,7 @@ function resolveBuildCommitFromEnv(env) {
298359
298359
  * environment descriptor down instead of reporting an honest "unknown".
298360
298360
  */
298361
298361
  function readBakedBuildCommit() {
298362
- return "3c1016247a3dd875ae36f6c99f417e28049ae9c7";
298362
+ return "703f97e0013867e0b5a3ebff1cd0d623fc868c16";
298363
298363
  }
298364
298364
  async function resolveServerBuildCommit(input) {
298365
298365
  if (isFullCommitSha(input.baked)) return input.baked;
@@ -308356,6 +308356,7 @@ const __cmmdProxyRouteLayersStartIndex = registeredProxyRouteLayers().length;
308356
308356
  */
308357
308357
  const CMMD_CLOUD_PROJECTS_PATH = "/api/forge/context/cloud-projects";
308358
308358
  const CMMD_RUNTIMES_PATH = "/api/forge/context/runtimes";
308359
+ const CMMD_ENVIRONMENTS_PATH = "/api/forge/context/environments";
308359
308360
  /**
308360
308361
  * Authenticate the browser session and resolve the CMMD JWT to forward
308361
308362
  * upstream. `jwt` is null when none could be resolved, which every caller
@@ -310482,12 +310483,8 @@ registerProxyRoute({
310482
310483
  });
310483
310484
  const FORGE_RUNTIMES_POLL_INTERVAL = seconds(5);
310484
310485
  const FORGE_RUNTIMES_KEEPALIVE_INTERVAL = seconds(25);
310485
- function encodeForgeCloudProjectsFrame(projects, environments, capacity = null) {
310486
- return new TextEncoder().encode(`event: cloud-projects\ndata: ${JSON.stringify({
310487
- projects,
310488
- environments,
310489
- capacity
310490
- })}\n\n`);
310486
+ function encodeForgeCatalogFrame(eventName, payload) {
310487
+ return new TextEncoder().encode(`event: ${eventName}\ndata: ${JSON.stringify(payload)}\n\n`);
310491
310488
  }
310492
310489
  /**
310493
310490
  * Emitted when the upstream CMMD returns HTTP 401 or 403.
@@ -310498,13 +310495,14 @@ const FORGE_RUNTIMES_AUTH_REQUIRED_FRAME = new TextEncoder().encode("event: auth
310498
310495
  const FORGE_RUNTIMES_KEEPALIVE_FRAME = new TextEncoder().encode(": ping\n\n");
310499
310496
  const FORGE_RUNTIMES_KICKOFF_FRAME = new TextEncoder().encode(": ok\n\n");
310500
310497
  /**
310501
- * Fetches the upstream CMMD cloud-project catalog for one poll tick.
310498
+ * Fetches an upstream CMMD catalog for one poll tick of a catalog SSE proxy.
310502
310499
  *
310503
310500
  * Returns:
310504
- * - `Uint8Array` (cloud-projects frame) — successful response
310501
+ * - `Uint8Array` (catalog frame) — successful response
310505
310502
  * - `FORGE_RUNTIMES_AUTH_REQUIRED_FRAME` — upstream returned 401 or 403
310506
- * - `null` — any other non-ok status (5xx, etc.); the caller must skip this
310507
- * tick so the client cache is never poisoned by an error frame
310503
+ * - `null` — any other non-ok status (5xx, a body without this proxy's
310504
+ * collections); the caller must skip the tick so the client cache is never
310505
+ * poisoned by an error frame
310508
310506
  *
310509
310507
  * Network errors also return `null` (skip-tick, never blank the client cache).
310510
310508
  *
@@ -310513,46 +310511,81 @@ const FORGE_RUNTIMES_KICKOFF_FRAME = new TextEncoder().encode(": ok\n\n");
310513
310511
  * is the designed failure mode. Retrying here would stack a second backoff
310514
310512
  * inside the first and delay the frame the client is waiting on.
310515
310513
  */
310516
- function makeFetchCloudProjectsFrameEffect(upstreamUrl, accessToken) {
310514
+ function makeFetchForgeCatalogFrameEffect(proxy, upstreamUrl, accessToken) {
310517
310515
  return tryPromise(() => fetch(upstreamUrl, { headers: {
310518
310516
  Authorization: `Bearer ${accessToken}`,
310519
310517
  Accept: "application/json"
310520
310518
  } }).then(async (res) => {
310521
310519
  if (res.status === 401 || res.status === 403) {
310522
- console.warn(`[forge-cloud-projects/events] upstream auth failure: ${res.status}`);
310520
+ console.warn(`[${proxy.logTag}] upstream auth failure: ${res.status}`);
310523
310521
  return FORGE_RUNTIMES_AUTH_REQUIRED_FRAME;
310524
310522
  }
310525
310523
  if (!res.ok) {
310526
310524
  const errBody = await res.text().catch(() => "");
310527
- console.warn(`[forge-cloud-projects/events] upstream ${res.status}:`, errBody.slice(0, 200));
310525
+ console.warn(`[${proxy.logTag}] upstream ${res.status}:`, errBody.slice(0, 200));
310528
310526
  return null;
310529
310527
  }
310530
310528
  const json = await res.json();
310531
310529
  const unwrapped = json && typeof json === "object" && "data" in json && json["data"] ? json["data"] : json;
310532
- const projects = unwrapped?.["projects"];
310533
- const environments = unwrapped?.["environments"];
310534
- if (!Array.isArray(projects) || !Array.isArray(environments)) return null;
310535
- return encodeForgeCloudProjectsFrame(projects, environments, unwrapped?.["capacity"] ?? null);
310530
+ const payload = unwrapped ? proxy.extractPayload(unwrapped) : null;
310531
+ return payload === null ? null : encodeForgeCatalogFrame(proxy.eventName, payload);
310536
310532
  })).pipe(catch_(() => succeed(null)));
310537
310533
  }
310538
- const cmmdForgeCloudProjectsEventsRouteLayer = add$1("GET", "/api/cmmd/forge-cloud-projects/events", gen(function* () {
310539
- const { session, jwt: accessToken } = yield* makeCmmdProxyAccessTokenEffect("forge-cloud-projects/events");
310540
- if (!accessToken) return yield* respondCmmdConnectionRequired(session.sessionId);
310541
- const fetchCloudProjectsFrame = makeFetchCloudProjectsFrameEffect(`${resolveCommandAppUrl()}${CMMD_CLOUD_PROJECTS_PATH}`, accessToken);
310542
- const dataStream = concat$2(fromEffect(fetchCloudProjectsFrame), tick(FORGE_RUNTIMES_POLL_INTERVAL).pipe(mapEffect$1(() => fetchCloudProjectsFrame))).pipe(filter$2((frame) => frame !== null));
310543
- const keepaliveStream = tick(FORGE_RUNTIMES_KEEPALIVE_INTERVAL).pipe(map$7(() => FORGE_RUNTIMES_KEEPALIVE_FRAME));
310544
- return stream(concat$2(succeed$4(FORGE_RUNTIMES_KICKOFF_FRAME), merge$4(dataStream, keepaliveStream)).pipe(ensuring$1(sync$1(() => {
310545
- console.debug("[forge-cloud-projects/events] SSE stream finalizer: connection closed or fiber interrupted");
310546
- }))), {
310547
- status: 200,
310548
- headers: {
310549
- "content-type": "text/event-stream",
310550
- "cache-control": "no-cache",
310551
- connection: "keep-alive",
310552
- "x-accel-buffering": "no"
310553
- }
310554
- });
310555
- }).pipe(catchTag("AuthError", (error) => respondToAuthError(error))));
310534
+ /**
310535
+ * The poll-and-emit SSE handler shared by every CMMD catalog proxy: emits a
310536
+ * kickoff comment, an immediate snapshot, a frame per 5 s poll tick, and a
310537
+ * keepalive comment every ~25 s, until the client disconnects (Effect stream
310538
+ * interruption; `Stream.ensuring` logs the shutdown observably).
310539
+ */
310540
+ function makeForgeCatalogEventsHandler(proxy, upstreamUrl) {
310541
+ return gen(function* () {
310542
+ const { session, jwt: accessToken } = yield* makeCmmdProxyAccessTokenEffect(proxy.logTag);
310543
+ if (!accessToken) return yield* respondCmmdConnectionRequired(session.sessionId);
310544
+ const fetchFrame = makeFetchForgeCatalogFrameEffect(proxy, upstreamUrl, accessToken);
310545
+ const dataStream = concat$2(fromEffect(fetchFrame), tick(FORGE_RUNTIMES_POLL_INTERVAL).pipe(mapEffect$1(() => fetchFrame))).pipe(filter$2((frame) => frame !== null));
310546
+ const keepaliveStream = tick(FORGE_RUNTIMES_KEEPALIVE_INTERVAL).pipe(map$7(() => FORGE_RUNTIMES_KEEPALIVE_FRAME));
310547
+ return stream(concat$2(succeed$4(FORGE_RUNTIMES_KICKOFF_FRAME), merge$4(dataStream, keepaliveStream)).pipe(ensuring$1(sync$1(() => {
310548
+ console.debug(`[${proxy.logTag}] SSE stream finalizer: connection closed or fiber interrupted`);
310549
+ }))), {
310550
+ status: 200,
310551
+ headers: {
310552
+ "content-type": "text/event-stream",
310553
+ "cache-control": "no-cache",
310554
+ connection: "keep-alive",
310555
+ "x-accel-buffering": "no"
310556
+ }
310557
+ });
310558
+ }).pipe(catchTag("AuthError", (error) => respondToAuthError(error)));
310559
+ }
310560
+ const cmmdForgeCloudProjectsEventsRouteLayer = add$1("GET", "/api/cmmd/forge-cloud-projects/events", makeForgeCatalogEventsHandler({
310561
+ logTag: "forge-cloud-projects/events",
310562
+ eventName: "cloud-projects",
310563
+ extractPayload: (unwrapped) => {
310564
+ const projects = unwrapped["projects"];
310565
+ const environments = unwrapped["environments"];
310566
+ if (!Array.isArray(projects) || !Array.isArray(environments)) return null;
310567
+ return {
310568
+ projects,
310569
+ environments,
310570
+ capacity: unwrapped["capacity"] ?? null
310571
+ };
310572
+ }
310573
+ }, `${resolveCommandAppUrl()}${CMMD_CLOUD_PROJECTS_PATH}`));
310574
+ registerProxyRoute({
310575
+ forgePath: "/api/cmmd/environments",
310576
+ method: "GET",
310577
+ cmmdPath: CMMD_ENVIRONMENTS_PATH,
310578
+ orgIdSource: "none",
310579
+ responseShape: "unwrapData"
310580
+ });
310581
+ const cmmdForgeEnvironmentsEventsRouteLayer = add$1("GET", "/api/cmmd/environments/events", makeForgeCatalogEventsHandler({
310582
+ logTag: "forge-environments/events",
310583
+ eventName: "environments",
310584
+ extractPayload: (unwrapped) => {
310585
+ const environments = unwrapped["environments"];
310586
+ return Array.isArray(environments) ? { environments } : null;
310587
+ }
310588
+ }, `${resolveCommandAppUrl()}${CMMD_ENVIRONMENTS_PATH}`));
310556
310589
  function splitCmmdRuntimeOrganizationScope(raw) {
310557
310590
  if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
310558
310591
  const body = { ...raw };
@@ -322025,7 +322058,7 @@ const MiscRuntimeLayerLive = mergeAll(AnalyticsServiceLayerLive, OpenLive, Serve
322025
322058
  const RuntimeDependenciesWithoutPullRequestsLive = ReactorLayerLive.pipe(provideMerge(CheckpointingLayerLive), provideMerge(GitLayerLive), provideMerge(OrchestrationLayerLive), provideMerge(ProviderLayerLive), provideMerge(TerminalLayerLive), provideMerge(AgentBrowserManagerLive), provideMerge(mergeAll(ThreadDevRuntimeLive, DevTunnelLive.pipe(provide$1(ThreadDevRuntimeLive)))), provideMerge(PersistenceLayerLive), provideMerge(KeybindingsLive), provideMerge(ProviderRegistryLive), provideMerge(mergeAll(ServerSettingsLive, UsageServiceLive.pipe(provide$1(ServerSettingsLive), provide$1(UsageSessionLookupLive), provide$1(UsageRecordedSourceLive.pipe(provide$1(OrchestrationLayerLive), provide$1(RuntimeReplicationOutboxLive), provide$1(ProviderSessionRuntimeRepositoryLive), provide$1(TextGenerationSessionRepositoryLive)))))), provideMerge(WorkspaceLayerLive), provideMerge(WorkspaceReadinessStateLive), provideMerge(ProjectFaviconResolverLive), provideMerge(RepositoryIdentityResolverLive), provideMerge(ServerEnvironmentLive), provideMerge(AuthLayerLive), provideMerge(ServerSecretStoreLayerLive), provideMerge(mergeAll(CloudRedisCoordinationLive, CloudStateSyncLive.pipe(provide$1(PersistenceLayerLive)))), provideMerge(MiscRuntimeLayerLive));
322026
322059
  const RuntimeDependenciesLive = pullRequestServiceFactoryLayer.pipe(provideMerge(RuntimeDependenciesWithoutPullRequestsLive), provideMerge(cmmdProjectIdentityResolverLive.pipe(provide$1(RuntimeDependenciesWithoutPullRequestsLive))), provideMerge(pullRequestProviderRuntimeLive));
322027
322060
  const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(provideMerge(RuntimeDependenciesLive));
322028
- const makeRoutesLayer = 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(provide$1(browserApiCorsLayer));
322061
+ const makeRoutesLayer = 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, cmmdForgeEnvironmentsEventsRouteLayer, 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(provide$1(browserApiCorsLayer));
322029
322062
  const runServer = launch$1(unwrap(gen(function* () {
322030
322063
  const config = yield* ServerConfig;
322031
322064
  fixPath({ preferProcessPath: config.forgeCmmdRuntimeMode === true });
@@ -322957,7 +322990,7 @@ const connectLoginCommand = make$34("login", {
322957
322990
  })).json();
322958
322991
  },
322959
322992
  openBrowser: async (url) => {
322960
- const open = (await import("./open-yHTUkd2Y.mjs")).default;
322993
+ const open = (await import("./open-2-reBrpv.mjs")).default;
322961
322994
  await open(url);
322962
322995
  return true;
322963
322996
  },