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