@cmmd-center/forge 0.9.5 → 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 (37) 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 +261 -56
  35. package/dist/bin.mjs +284 -80
  36. package/dist/{open-FIgTDosf.mjs → open-D8mGyWmt.mjs} +3 -3
  37. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  require("./chunk-BhaIgcZK.cjs");
4
- const require_Schema = require("./Schema-Bij_WAra.cjs");
5
- const require_Path = require("./Path-CsbBuCFB.cjs");
6
- const require_Config = require("./Config-DMA9WqtC.cjs");
7
- const require_SqlError = require("./SqlError-C2mi8_tp.cjs");
4
+ const require_Schema = require("./Schema-DaFukK_y.cjs");
5
+ const require_Path = require("./Path-qpublmG3.cjs");
6
+ const require_Config = require("./Config-BHRBB8XM.cjs");
7
+ const require_SqlError = require("./SqlError-CsWFS-OU.cjs");
8
8
  let bun_sqlite = require("bun:sqlite");
9
9
  //#region ../../node_modules/.bun/@effect+sql-sqlite-bun@4.0.0-beta.45+4dcb167d4624bd06/node_modules/@effect/sql-sqlite-bun/dist/SqliteClient.js
10
10
  /**
@@ -124,4 +124,4 @@ exports.layer = layer;
124
124
  exports.layerConfig = layerConfig;
125
125
  exports.make = make;
126
126
 
127
- //# sourceMappingURL=SqliteClient-CdAhI4lb.cjs.map
127
+ //# sourceMappingURL=SqliteClient-BpjZWL6O.cjs.map
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { Ac as Service, Ci as uninterruptibleMask, Da as addFinalizer$1, Ea as Scope, Ic as getUnsafe, Kn as fail, Lc as make$1, Nc as get, Qn as flatMap, Sr as map, Tn as as, Xl as identity, ai as succeed, ba as provide, jc as add, ki as withFiber, li as sync, lr as gen, pa as effectContext, ui as tap, vi as try_, yn as addFinalizer } from "./Schema-CTXk8IgN.mjs";
4
- import { Wt as getCurrent, bt as make$2, m as die } from "./Path-Bwl3ltR5.mjs";
5
- import { h as unwrap } from "./Config-DrOyN3WS.mjs";
6
- import { S as layer$1, c as SqlError, f as classifySqliteError, h as make$3, m as SqlClient, p as SafeIntegers, v as defaultTransforms, x as makeCompilerSqlite } from "./SqlError-1c-3v7GY.mjs";
3
+ import { Dn as as, Fc as get, Jn as fail, Mc as Service, Nc as add, Oa as Scope, Ql as identity, Rc as getUnsafe, Sa as provide, Ti as uninterruptibleMask, bi as try_, di as sync, dr as gen, er as flatMap, fi as tap, ha as effectContext, ji as withFiber, ka as addFinalizer$1, si as succeed, wr as map, xn as addFinalizer, zc as make$1 } from "./Schema-CKuz8TX8.mjs";
4
+ import { Wt as getCurrent, bt as make$2, m as die } from "./Path-DJTwK58E.mjs";
5
+ import { h as unwrap } from "./Config-To1VEqlB.mjs";
6
+ import { S as layer$1, c as SqlError, f as classifySqliteError, h as make$3, m as SqlClient, p as SafeIntegers, v as defaultTransforms, x as makeCompilerSqlite } from "./SqlError-DhK0hV8S.mjs";
7
7
  import { Database } from "bun:sqlite";
8
8
  //#region ../../node_modules/.bun/@effect+sql-sqlite-bun@4.0.0-beta.45+4dcb167d4624bd06/node_modules/@effect/sql-sqlite-bun/dist/SqliteClient.js
9
9
  /**
@@ -118,4 +118,4 @@ const layer = (config) => effectContext(map(make(config), (client) => make$1(Sql
118
118
  //#endregion
119
119
  export { SqliteClient, TypeId, layer, layerConfig, make };
120
120
 
121
- //# sourceMappingURL=SqliteClient-aoOb51gB.mjs.map
121
+ //# sourceMappingURL=SqliteClient-CA7vjiUj.mjs.map
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
15
  const require_runtimeControlAuthority = require("./runtimeControlAuthority-SNBF5Mjy.cjs");
16
- const require_PTY = require("./PTY-U3JQnLXS.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),
@@ -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;
@@ -113693,8 +113773,8 @@ require_Schema$1.effectDiscard(runMigrations());
113693
113773
  //#endregion
113694
113774
  //#region src/persistence/Layers/Sqlite.ts
113695
113775
  const defaultSqliteClientLoaders = {
113696
- bun: () => Promise.resolve().then(() => require("./SqliteClient-CdAhI4lb.cjs")),
113697
- 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"))
113698
113778
  };
113699
113779
  const makeRuntimeSqliteLayer = require_Schema$1.fn("makeRuntimeSqliteLayer")(function* (config) {
113700
113780
  const loader = defaultSqliteClientLoaders[process.versions.bun !== void 0 ? "bun" : "node"];
@@ -147042,22 +147122,58 @@ function runtimeAuthoritySessionId(input) {
147042
147122
  if (input.authSessionId) return input.authSessionId;
147043
147123
  return input.threadId ? readThreadSessionId(input.threadId) : null;
147044
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
+ }
147045
147153
  function runtimeProviderBrokerToken(input) {
147046
147154
  const identity = classifyRuntimeBrokerIdentity({
147047
147155
  machineId: configuredRuntimeMachineId() ?? void 0,
147048
147156
  credentialEpoch: configuredRuntimeCredentialEpoch(),
147049
147157
  brokerAuthorityMode: process.env.FORGE_CMMD_RUNTIME_BROKER_AUTHORITY_MODE
147050
147158
  });
147051
- if (identity.mode === "legacy") return require_runtimeControlAuthority.runtimeGrantToken();
147052
- 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
+ });
147053
147165
  const sessionId = runtimeAuthoritySessionId(input);
147054
- if (!sessionId) return null;
147055
- return readRuntimeBrokerAuthority({
147166
+ return resolveBrokerTicketOutcome({
147167
+ identityMode: "exact",
147168
+ legacyGrantToken: null,
147056
147169
  sessionId,
147057
- runtimeId: process.env.FORGE_CMMD_RUNTIME_ID,
147058
- machineId: identity.machineId,
147059
- credentialEpoch: identity.credentialEpoch,
147060
- 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
147061
147177
  });
147062
147178
  }
147063
147179
  async function fetchRuntimeProviderGrant(input) {
@@ -147102,8 +147218,9 @@ const issueProviderEgressCredential = (input) => require_Schema$1.tryPromise({
147102
147218
  async function issueCmmdRuntimeProviderEgressCredential(input) {
147103
147219
  const controlPlaneUrl = process.env.FORGE_COMMAND_APP_URL.replace(/\/+$/, "");
147104
147220
  const runtimeId = encodeURIComponent(process.env.FORGE_CMMD_RUNTIME_ID);
147105
- const runtimeGrantToken = runtimeProviderBrokerToken(input);
147106
- 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;
147107
147224
  const response = await fetchRuntimeProviderGrant({
147108
147225
  url: `${controlPlaneUrl}/api/forge/runtimes/${runtimeId}/provider/token`,
147109
147226
  token: runtimeGrantToken,
@@ -205351,6 +205468,48 @@ function applyPluginSkillPermissionsToDynamicTools(tools, settings) {
205351
205468
  });
205352
205469
  }
205353
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
205354
205513
  //#region src/provider/shellSafety.ts
205355
205514
  const SHELL_SAFE_COMMAND_PATH_PATTERN = /^[A-Za-z0-9_.\-/\\:]+$/;
205356
205515
  function isShellSafeCommandPath(command) {
@@ -206641,33 +206800,12 @@ const makeCodexAdapter = require_Schema$1.fn("makeCodexAdapter")(function* (opti
206641
206800
  }));
206642
206801
  const browserToolEnvironmentId = yield* resolveBrowserToolEnvironmentId$1();
206643
206802
  const computerManager = resolveComputerManager(serverConfig);
206644
- const githubDynamicToolHandler = createCodexGitHubDynamicToolHandler({
206645
- broker: new GitHubBroker({
206646
- resolveJwt: (auth) => runWithRuntimeContext(resolveCmmdJwtForSession({
206647
- sessionId: auth.sessionId,
206648
- logPrefix: "codex-github",
206649
- ...auth.subject !== void 0 ? { subject: auth.subject } : {},
206650
- ...auth.forceRefresh !== void 0 ? { forceRefresh: auth.forceRefresh } : {}
206651
- })),
206652
- githubWriteIdentity: settings.githubWriteIdentity
206653
- }),
206654
- resolveAuth: async (threadId) => {
206655
- const binding = await runWithRuntimeContext(readThreadAuthSession(threadId));
206656
- return binding ? {
206657
- sessionId: binding.sessionId,
206658
- ...binding.subject ? { subject: binding.subject } : {}
206659
- } : null;
206660
- },
206661
- recordAudit: (auditEvent) => runWithRuntimeContext(recordGitHubToolAuditEvent(auditEvent).pipe(require_Schema$1.asVoid)),
206662
- createConfirmation: (confirmation) => runWithRuntimeContext(createGitHubToolConfirmation(confirmation)),
206663
- isConfirmed: (confirmation) => runWithRuntimeContext(consumeApprovedOrLatestGitHubToolConfirmation({
206664
- confirmationId: confirmation.confirmationId,
206665
- threadId: confirmation.threadId,
206666
- toolName: confirmation.toolName,
206667
- request: confirmation.request
206668
- })),
206803
+ const githubDynamicToolHandler = createCodexGitHubDynamicToolHandler(createForgeGitHubToolHandlerOptions({
206804
+ runWithRuntimeContext,
206805
+ githubWriteIdentity: settings.githubWriteIdentity,
206806
+ logPrefix: "codex-github",
206669
206807
  bypassWriteConfirmation: input.runtimeMode === "full-access"
206670
- });
206808
+ }));
206671
206809
  const cmmdConnectorDynamicToolHandler = createCodexCmmdConnectorDynamicToolHandler({ resolveAuth: async (threadId) => {
206672
206810
  const binding = await runWithRuntimeContext(readThreadAuthSession(threadId));
206673
206811
  if (!binding) return null;
@@ -208214,6 +208352,62 @@ function createDevServerMcpServer(deps, threadId) {
208214
208352
  });
208215
208353
  }
208216
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
208217
208411
  //#region src/provider/providerAuthFailureCopy.ts
208218
208412
  /**
208219
208413
  * Rewrite provider auth failures into an action the user can actually take.
@@ -208518,6 +208712,7 @@ function buildClaudeMcpServers(input) {
208518
208712
  "forge-browser": createBrowserMcpServer(input.browserManager, input.threadId, browserToolScope(input.browserToolEnvironmentId)),
208519
208713
  "forge-dev-server": createDevServerMcpServer(input.devServerToolDeps, input.threadId),
208520
208714
  "cmmd-context": createCmmdContextMcpServer(input.threadId, input.resolveCmmdPat),
208715
+ [GITHUB_MCP_SERVER_NAME]: createGitHubMcpServer(input.runBrokeredGitHubTool, input.threadId),
208521
208716
  ...input.computerManager ? { [COMPUTER_MCP_SERVER_NAME]: createComputerMcpServer(input.computerManager, input.threadId) } : {},
208522
208717
  ...input.cmmdSidekickTools ? { "cmmd-sidekick-tools": createCmmdSidekickToolsMcpServer(input.cmmdSidekickTools.session, input.cmmdSidekickTools.tools) } : {}
208523
208718
  };
@@ -210528,6 +210723,12 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
210528
210723
  const permissionMode = permissionModeForRuntimeMode(input.runtimeMode);
210529
210724
  const settings = claudeQuerySettings(modelConfig.thinking, modelConfig.fastMode);
210530
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
+ }));
210531
210732
  const queryRuntime = yield* createClaudeQueryRuntime(prompt, buildClaudeQueryOptions({
210532
210733
  cwd: input.cwd,
210533
210734
  effectiveApiModelId: modelConfig.effectiveApiModelId,
@@ -210547,7 +210748,8 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
210547
210748
  computerManager,
210548
210749
  resolveCmmdPat,
210549
210750
  devServerToolDeps,
210550
- cmmdSidekickTools
210751
+ cmmdSidekickTools,
210752
+ runBrokeredGitHubTool
210551
210753
  }), threadId);
210552
210754
  const session = buildClaudeProviderSession({
210553
210755
  threadId,
@@ -283548,7 +283750,9 @@ const make$8 = require_Schema$1.gen(function* () {
283548
283750
  projects: readModel.projects
283549
283751
  });
283550
283752
  if (!cwd) return "Forge could not resolve the project folder for this thread.";
283551
- 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(", ")}.`;
283552
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.";
283553
283757
  return null;
283554
283758
  });
@@ -288950,6 +289154,7 @@ function executionEnvironmentCapabilities(serverConfig) {
288950
289154
  repositoryIdentity: true,
288951
289155
  pullRequests: isExecutionPlane,
288952
289156
  threadPullRequestLinking: isExecutionPlane,
289157
+ threadSettlement: isExecutionPlane,
288953
289158
  cloudMode: serverConfig.forgeCmmdRuntimeMode === true || isCloudShell,
288954
289159
  runtime: {
288955
289160
  topology: runtimeTopology(serverConfig),
@@ -310903,16 +311108,16 @@ const gitUrlCloneRouteLayer = add$1("POST", "/api/cloud/git/clone-url", require_
310903
311108
  //#endregion
310904
311109
  //#region src/server.ts
310905
311110
  const PtyAdapterLive = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
310906
- if (typeof Bun !== "undefined") return (yield* require_Schema$1.promise(() => Promise.resolve().then(() => require("./BunPTY-2icf7sRj.cjs")))).layer;
310907
- 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;
310908
311113
  }));
310909
311114
  const HttpServerLive = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
310910
311115
  const config = yield* ServerConfig;
310911
- 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({
310912
311117
  port: config.port,
310913
311118
  ...config.host ? { hostname: config.host } : {}
310914
311119
  });
310915
- 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"))]);
310916
311121
  return NodeHttpServer.layer(NodeHttp.createServer, {
310917
311122
  host: config.host,
310918
311123
  port: config.port
@@ -310920,10 +311125,10 @@ const HttpServerLive = require_Schema$1.unwrap(require_Schema$1.gen(function* ()
310920
311125
  }));
310921
311126
  const PlatformServicesLive = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
310922
311127
  if (typeof Bun !== "undefined") {
310923
- 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")));
310924
311129
  return layer;
310925
311130
  } else {
310926
- 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")));
310927
311132
  return layer;
310928
311133
  }
310929
311134
  }));
@@ -310991,7 +311196,7 @@ const MiscRuntimeLayerLive = require_Schema$1.mergeAll(AnalyticsServiceLayerLive
310991
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));
310992
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));
310993
311198
  const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(require_Schema$1.provideMerge(RuntimeDependenciesLive));
310994
- 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));
310995
311200
  const makeServerLayer = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
310996
311201
  const config = yield* ServerConfig;
310997
311202
  fixPath();