@cmmd-center/forge 0.9.13 → 0.9.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.cjs +301 -140
- package/dist/bin.mjs +322 -162
- package/dist/client/assets/{DiffWorkerPoolProvider-DuP7DBdu.js → DiffWorkerPoolProvider-tFSGuVfC.js} +51 -51
- package/dist/client/assets/PullRequestCodePanel-inwJYfZC.js +5 -0
- package/dist/client/assets/{index-BtUnlnWs.js → index-Bublmabf.js} +56 -56
- package/dist/client/index.html +2 -2
- 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-45DPznyK.cjs → runtimeControlAuthority-BdIovv-r.cjs} +28 -1
- package/dist/{runtimeControlAuthority-akIBTI-S.mjs → runtimeControlAuthority-COHmz_WT.mjs} +23 -2
- package/package.json +3 -2
- package/dist/client/assets/PullRequestCodePanel-BID-ZM7w.js +0 -5
package/dist/bin.cjs
CHANGED
|
@@ -12,7 +12,7 @@ const require_Cache = require("./Cache-U1fkdGvV.cjs");
|
|
|
12
12
|
const require_SqlError = require("./SqlError-CSsHBaKF.cjs");
|
|
13
13
|
const require_Mime = require("./Mime-Bilnh8zE.cjs");
|
|
14
14
|
const require_esm = require("./esm-BZhXwX5p.cjs");
|
|
15
|
-
const require_runtimeControlAuthority = require("./runtimeControlAuthority-
|
|
15
|
+
const require_runtimeControlAuthority = require("./runtimeControlAuthority-BdIovv-r.cjs");
|
|
16
16
|
const require_PTY = require("./PTY-CNa0j0w2.cjs");
|
|
17
17
|
let node_child_process = require("node:child_process");
|
|
18
18
|
node_child_process = require_chunk.__toESM(node_child_process);
|
|
@@ -32319,7 +32319,7 @@ function requiredString(value, minimumLength = 1) {
|
|
|
32319
32319
|
if (typeof value !== "string" || value.length < minimumLength) return identityCorrupt();
|
|
32320
32320
|
return value;
|
|
32321
32321
|
}
|
|
32322
|
-
function positiveInteger$
|
|
32322
|
+
function positiveInteger$2(value) {
|
|
32323
32323
|
if (!Number.isInteger(value) || Number(value) <= 0) return identityCorrupt();
|
|
32324
32324
|
return Number(value);
|
|
32325
32325
|
}
|
|
@@ -32339,7 +32339,7 @@ function parseChallenge(value) {
|
|
|
32339
32339
|
if (!value || typeof value !== "object") return identityCorrupt();
|
|
32340
32340
|
const record = value;
|
|
32341
32341
|
return {
|
|
32342
|
-
deviceId: positiveInteger$
|
|
32342
|
+
deviceId: positiveInteger$2(record.deviceId),
|
|
32343
32343
|
challengeId: requiredString(record.challengeId, 8),
|
|
32344
32344
|
signingPayload: requiredString(record.signingPayload),
|
|
32345
32345
|
currentKeyId: requiredString(record.currentKeyId),
|
|
@@ -65123,7 +65123,7 @@ function normalizeNumberish(value) {
|
|
|
65123
65123
|
}
|
|
65124
65124
|
//#endregion
|
|
65125
65125
|
//#region package.json
|
|
65126
|
-
var version$1 = "0.9.
|
|
65126
|
+
var version$1 = "0.9.15";
|
|
65127
65127
|
//#endregion
|
|
65128
65128
|
//#region src/sentry.ts
|
|
65129
65129
|
const SERVER_APP_NAME = "forge-server";
|
|
@@ -65596,7 +65596,7 @@ function readCmmdAvatarUrl(raw) {
|
|
|
65596
65596
|
function readTrimmedString$2(value) {
|
|
65597
65597
|
return typeof value === "string" ? value.trim() || null : null;
|
|
65598
65598
|
}
|
|
65599
|
-
function asRecord$
|
|
65599
|
+
function asRecord$12(value) {
|
|
65600
65600
|
return value && typeof value === "object" ? value : null;
|
|
65601
65601
|
}
|
|
65602
65602
|
function readDirectPlanLabelFromRecord(obj) {
|
|
@@ -65608,26 +65608,26 @@ function readNestedPlanLabelFromRecord(obj) {
|
|
|
65608
65608
|
function readCmmdPlanLabel(obj) {
|
|
65609
65609
|
const direct = readDirectPlanLabelFromRecord(obj);
|
|
65610
65610
|
if (direct) return direct;
|
|
65611
|
-
const plan = asRecord$
|
|
65611
|
+
const plan = asRecord$12(obj["plan"]);
|
|
65612
65612
|
if (plan) {
|
|
65613
65613
|
const label = readNestedPlanLabelFromRecord(plan);
|
|
65614
65614
|
if (label) return label;
|
|
65615
65615
|
}
|
|
65616
|
-
const subscription = asRecord$
|
|
65616
|
+
const subscription = asRecord$12(obj["subscription"]);
|
|
65617
65617
|
if (subscription) {
|
|
65618
65618
|
const label = readNestedPlanLabelFromRecord(subscription);
|
|
65619
65619
|
if (label) return label;
|
|
65620
|
-
const subscriptionPlan = asRecord$
|
|
65620
|
+
const subscriptionPlan = asRecord$12(subscription["plan"]);
|
|
65621
65621
|
if (subscriptionPlan) {
|
|
65622
65622
|
const nestedLabel = readNestedPlanLabelFromRecord(subscriptionPlan);
|
|
65623
65623
|
if (nestedLabel) return nestedLabel;
|
|
65624
65624
|
}
|
|
65625
65625
|
}
|
|
65626
|
-
const billing = asRecord$
|
|
65626
|
+
const billing = asRecord$12(obj["billing"]);
|
|
65627
65627
|
if (billing) {
|
|
65628
65628
|
const label = readNestedPlanLabelFromRecord(billing);
|
|
65629
65629
|
if (label) return label;
|
|
65630
|
-
const billingPlan = asRecord$
|
|
65630
|
+
const billingPlan = asRecord$12(billing["plan"]);
|
|
65631
65631
|
if (billingPlan) return readNestedPlanLabelFromRecord(billingPlan);
|
|
65632
65632
|
}
|
|
65633
65633
|
return null;
|
|
@@ -65764,7 +65764,7 @@ function constantTimeEqual(left, right) {
|
|
|
65764
65764
|
function integerSeconds(value) {
|
|
65765
65765
|
return Number.isSafeInteger(value) && value >= 0 ? value : null;
|
|
65766
65766
|
}
|
|
65767
|
-
function positiveInteger(value) {
|
|
65767
|
+
function positiveInteger$1(value) {
|
|
65768
65768
|
return Number.isSafeInteger(value) && value > 0 ? value : null;
|
|
65769
65769
|
}
|
|
65770
65770
|
function parseAssertion(token) {
|
|
@@ -65791,7 +65791,7 @@ function hasExpectedPayloadContext(payload) {
|
|
|
65791
65791
|
function readRequiredClaims(payload) {
|
|
65792
65792
|
const subject = nonEmptyString$1(payload["sub"]);
|
|
65793
65793
|
if (!subject) return null;
|
|
65794
|
-
const userId = positiveInteger(payload["user_id"]);
|
|
65794
|
+
const userId = positiveInteger$1(payload["user_id"]);
|
|
65795
65795
|
if (!userId) return null;
|
|
65796
65796
|
const jti = nonEmptyString$1(payload["jti"]);
|
|
65797
65797
|
if (!jti) return null;
|
|
@@ -66945,13 +66945,13 @@ function validateCommandBootstrapPayload(payload) {
|
|
|
66945
66945
|
});
|
|
66946
66946
|
const payloadIdentity = normalizeCmmdUserIdentity(payload.user);
|
|
66947
66947
|
if (payloadIdentity) {
|
|
66948
|
-
const cmmdIdentity = payloadIdentity.avatarUrl ? payloadIdentity : mergeCmmdUserIdentity(payloadIdentity, yield* fetchOptionalCmmdIdentityForAccessToken(payload
|
|
66948
|
+
const cmmdIdentity = payloadIdentity.avatarUrl ? payloadIdentity : mergeCmmdUserIdentity(payloadIdentity, yield* fetchOptionalCmmdIdentityForAccessToken(cmmdUserCredential(payload)));
|
|
66949
66949
|
return {
|
|
66950
66950
|
subjectUserId: cmmdIdentity.id,
|
|
66951
66951
|
cmmdIdentity
|
|
66952
66952
|
};
|
|
66953
66953
|
}
|
|
66954
|
-
const tokenIdentity = yield* fetchCmmdIdentityForAccessToken(payload
|
|
66954
|
+
const tokenIdentity = yield* fetchCmmdIdentityForAccessToken(cmmdUserCredential(payload));
|
|
66955
66955
|
if (tokenIdentity) return {
|
|
66956
66956
|
subjectUserId: tokenIdentity.id,
|
|
66957
66957
|
cmmdIdentity: tokenIdentity
|
|
@@ -67044,6 +67044,23 @@ function isCmmdJwtToken(token) {
|
|
|
67044
67044
|
return token?.startsWith("eyJ") ?? false;
|
|
67045
67045
|
}
|
|
67046
67046
|
/**
|
|
67047
|
+
* The credential CMMD's userinfo accepts.
|
|
67048
|
+
*
|
|
67049
|
+
* Since CMMD's OAuth update, `access_token` is a JWT and the personal access
|
|
67050
|
+
* token arrives separately as `mcp_token`. userinfo authenticates the PAT and
|
|
67051
|
+
* rejects the JWT with `INVALID_OR_NON_USER_TOKEN`, so presenting the JWT
|
|
67052
|
+
* resolves no identity: the bootstrap then finds no subject and answers 401,
|
|
67053
|
+
* even though the sign-in itself succeeded and the caller did nothing wrong.
|
|
67054
|
+
*
|
|
67055
|
+
* `resolveCmmdTokenBundleCredentials` already draws this distinction for the
|
|
67056
|
+
* owner lanes. This is the same rule for the bootstrap lane, which had only ever
|
|
67057
|
+
* seen the pre-update shape where `access_token` was itself the PAT.
|
|
67058
|
+
*/
|
|
67059
|
+
function cmmdUserCredential(payload) {
|
|
67060
|
+
const pat = payload.mcpToken?.trim();
|
|
67061
|
+
return isCmmdJwtToken(payload.accessToken) && pat ? pat : payload.accessToken;
|
|
67062
|
+
}
|
|
67063
|
+
/**
|
|
67047
67064
|
* Read one CMMD token-exchange response into the credential set Forge stores.
|
|
67048
67065
|
*
|
|
67049
67066
|
* Both owner lanes redeem the same `cmmd-forge-web` authorization code — the
|
|
@@ -69408,22 +69425,22 @@ const EMPTY_PARSED_ERROR = {
|
|
|
69408
69425
|
message: null,
|
|
69409
69426
|
raw: null
|
|
69410
69427
|
};
|
|
69411
|
-
function asRecord$
|
|
69428
|
+
function asRecord$11(value) {
|
|
69412
69429
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
69413
69430
|
}
|
|
69414
69431
|
function readTrimmedString$1(value) {
|
|
69415
69432
|
return (typeof value === "string" ? value.trim() : "") || null;
|
|
69416
69433
|
}
|
|
69417
69434
|
function readErrorEnvelope(record) {
|
|
69418
|
-
return asRecord$
|
|
69435
|
+
return asRecord$11(record["error"]);
|
|
69419
69436
|
}
|
|
69420
69437
|
function readUpstreamErrorCode(body) {
|
|
69421
|
-
const record = asRecord$
|
|
69438
|
+
const record = asRecord$11(body);
|
|
69422
69439
|
if (record === null) return null;
|
|
69423
69440
|
return readTrimmedString$1(record["code"]) ?? readTrimmedString$1(readErrorEnvelope(record)?.["code"]);
|
|
69424
69441
|
}
|
|
69425
69442
|
function readErrorMessage$2(raw) {
|
|
69426
|
-
const record = asRecord$
|
|
69443
|
+
const record = asRecord$11(raw);
|
|
69427
69444
|
if (record === null) return null;
|
|
69428
69445
|
const error = record["error"];
|
|
69429
69446
|
const nestedMessage = readErrorEnvelope(record)?.["message"];
|
|
@@ -70055,7 +70072,7 @@ function buildProxyErrorResponse(error) {
|
|
|
70055
70072
|
code: error.code
|
|
70056
70073
|
}, { status: 403 });
|
|
70057
70074
|
if (error instanceof CmmdProxyRequestError) {
|
|
70058
|
-
const status = error.status >= 500 ? 502 : error.status;
|
|
70075
|
+
const status = error.status === 503 ? 503 : error.status >= 500 ? 502 : error.status;
|
|
70059
70076
|
return require_HttpServer.jsonUnsafe({
|
|
70060
70077
|
error: error.detail ?? "CMMD REST request failed.",
|
|
70061
70078
|
code: error.code,
|
|
@@ -92830,7 +92847,7 @@ function hasValidRuntimeIdentity(value) {
|
|
|
92830
92847
|
}
|
|
92831
92848
|
function decodeRuntime$1(value) {
|
|
92832
92849
|
if (!isRecord$16(value) || !hasValidRuntimeIdentity(value)) return null;
|
|
92833
|
-
if (!nullableString(value.endpointUrl) || value.endpointUrl !== null && !URL.canParse(value.endpointUrl) || !nullableInteger(value.deviceId) || !
|
|
92850
|
+
if (!nullableString(value.endpointUrl) || value.endpointUrl !== null && !URL.canParse(value.endpointUrl) || !nullableInteger(value.deviceId) || !nullableString(value.workspaceRoot) || !nullableString(value.githubRepoFullName) || !(value.lastSeenAt === null || isIsoDateTime(value.lastSeenAt)) || !(value.metadata === null || isRecord$16(value.metadata))) return null;
|
|
92834
92851
|
return value;
|
|
92835
92852
|
}
|
|
92836
92853
|
function decodeProject(value) {
|
|
@@ -93141,8 +93158,6 @@ function replicaRuntimeMatches(left, right) {
|
|
|
93141
93158
|
[left.status, right.status],
|
|
93142
93159
|
[left.endpointUrl, right.endpointUrl],
|
|
93143
93160
|
[left.deviceId, right.deviceId],
|
|
93144
|
-
[left.projectId, right.projectId],
|
|
93145
|
-
[left.projectName, right.projectName],
|
|
93146
93161
|
[left.workspaceRoot, right.workspaceRoot],
|
|
93147
93162
|
[left.githubRepoFullName, right.githubRepoFullName],
|
|
93148
93163
|
[left.lastSeenAt, right.lastSeenAt]
|
|
@@ -96807,7 +96822,7 @@ const EMPTY_PLAN_VALUES = new Set([
|
|
|
96807
96822
|
"none",
|
|
96808
96823
|
"null"
|
|
96809
96824
|
]);
|
|
96810
|
-
function asRecord$
|
|
96825
|
+
function asRecord$10(value) {
|
|
96811
96826
|
if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
|
|
96812
96827
|
return value;
|
|
96813
96828
|
}
|
|
@@ -96824,7 +96839,7 @@ function decodeJwtClaims(token) {
|
|
|
96824
96839
|
try {
|
|
96825
96840
|
const decoded = Buffer.from(payload, "base64url");
|
|
96826
96841
|
if (decoded.byteLength > MAX_CLAIMS_BYTES) return void 0;
|
|
96827
|
-
return asRecord$
|
|
96842
|
+
return asRecord$10(JSON.parse(decoded.toString("utf8")));
|
|
96828
96843
|
} catch {
|
|
96829
96844
|
return;
|
|
96830
96845
|
}
|
|
@@ -96846,7 +96861,7 @@ function findPlanType(claims) {
|
|
|
96846
96861
|
const direct = fromRecord(claims);
|
|
96847
96862
|
if (direct) return direct;
|
|
96848
96863
|
for (const value of Object.values(claims)) {
|
|
96849
|
-
const nested = asRecord$
|
|
96864
|
+
const nested = asRecord$10(value);
|
|
96850
96865
|
if (!nested) continue;
|
|
96851
96866
|
const found = fromRecord(nested);
|
|
96852
96867
|
if (found) return found;
|
|
@@ -96863,7 +96878,7 @@ function readCodexAuthIdentity(authJson) {
|
|
|
96863
96878
|
} catch {
|
|
96864
96879
|
return {};
|
|
96865
96880
|
}
|
|
96866
|
-
const claims = decodeJwtClaims(asRecord$
|
|
96881
|
+
const claims = decodeJwtClaims(asRecord$10(asRecord$10(parsed)?.tokens)?.id_token);
|
|
96867
96882
|
if (!claims) return {};
|
|
96868
96883
|
const email = findEmail(claims);
|
|
96869
96884
|
const planType = findPlanType(claims);
|
|
@@ -97060,11 +97075,6 @@ function recordClaudeRateLimitTelemetry(info, generationHash = currentClaudeUsag
|
|
|
97060
97075
|
observedAt: [fiveHourObservedAt, sevenDayObservedAt].filter((value) => value !== null).toSorted()[0]
|
|
97061
97076
|
});
|
|
97062
97077
|
}
|
|
97063
|
-
function getLatestClaudeRateLimitTelemetry(generationHash = currentClaudeUsageGenerationHash(), providerAccountId) {
|
|
97064
|
-
if (generationHash === null) return null;
|
|
97065
|
-
const cacheKey = providerAccountId ? `${providerAccountId}:${generationHash}` : generationHash;
|
|
97066
|
-
return cachedSnapshots.get(cacheKey) ?? null;
|
|
97067
|
-
}
|
|
97068
97078
|
//#endregion
|
|
97069
97079
|
//#region src/providerAuth/ClaudeDeviceAuth.ts
|
|
97070
97080
|
const AUTHORIZE_URL_PATTERN = /https:\/\/[^\s]*\/oauth\/authorize\?[^\s]+/u;
|
|
@@ -97443,17 +97453,23 @@ async function loadClaudeAccountMetadataFromCli(homePath) {
|
|
|
97443
97453
|
function extractClaudeCredentialGenerationId(response) {
|
|
97444
97454
|
if (typeof response !== "object" || response === null || !("data" in response)) return null;
|
|
97445
97455
|
const data = response.data;
|
|
97446
|
-
if (typeof data !== "object" || data === null
|
|
97447
|
-
if (
|
|
97448
|
-
|
|
97456
|
+
if (typeof data !== "object" || data === null) return null;
|
|
97457
|
+
if ("connected" in data && data.connected === true && "generationId" in data && typeof data.generationId === "string") {
|
|
97458
|
+
const generationId = data.generationId.trim();
|
|
97459
|
+
return generationId.length > 0 ? generationId : null;
|
|
97460
|
+
}
|
|
97461
|
+
if (!("account" in data) || typeof data.account !== "object" || data.account === null) return null;
|
|
97462
|
+
const account = data.account;
|
|
97463
|
+
if (!("credentialGenerationId" in account) || typeof account.credentialGenerationId !== "string") return null;
|
|
97464
|
+
const generationId = account.credentialGenerationId.trim();
|
|
97449
97465
|
return generationId.length > 0 ? generationId : null;
|
|
97450
97466
|
}
|
|
97451
97467
|
function extractClaudeProviderAccountId(response) {
|
|
97452
|
-
const generationId = extractClaudeCredentialGenerationId(response);
|
|
97453
|
-
if (generationId !== null) return generationId;
|
|
97454
97468
|
if (typeof response !== "object" || response === null || !("data" in response)) return null;
|
|
97455
97469
|
const data = response.data;
|
|
97456
|
-
if (typeof data !== "object" || data === null
|
|
97470
|
+
if (typeof data !== "object" || data === null) return null;
|
|
97471
|
+
if ("connected" in data && data.connected === true) return extractClaudeCredentialGenerationId(response);
|
|
97472
|
+
if (!("account" in data)) return null;
|
|
97457
97473
|
const account = data.account;
|
|
97458
97474
|
if (typeof account !== "object" || account === null || !("providerAccountId" in account) || typeof account.providerAccountId !== "string") return null;
|
|
97459
97475
|
const providerAccountId = account.providerAccountId.trim();
|
|
@@ -97481,7 +97497,7 @@ async function publishClaudeUsageAfterSync(input) {
|
|
|
97481
97497
|
path: input.auth.path === AUTH_RUNTIME_CLAUDE_CREDENTIAL_PATH ? AUTH_RUNTIME_CLAUDE_USAGE_PATH : USER_CLAUDE_USAGE_PATH,
|
|
97482
97498
|
body: {
|
|
97483
97499
|
providerAccountId: input.providerAccountId,
|
|
97484
|
-
credentialGenerationId: input.
|
|
97500
|
+
credentialGenerationId: input.credentialGenerationId,
|
|
97485
97501
|
accountEmail: input.accountEmail,
|
|
97486
97502
|
accountDisplayName: input.accountDisplayName,
|
|
97487
97503
|
planType: input.planType,
|
|
@@ -97498,11 +97514,13 @@ async function publishClaudeUsageAfterSync(input) {
|
|
|
97498
97514
|
}
|
|
97499
97515
|
async function finalizeClaudeCredentialSync(input) {
|
|
97500
97516
|
const providerAccountId = extractClaudeProviderAccountId(input.response);
|
|
97501
|
-
|
|
97502
|
-
if (
|
|
97517
|
+
const credentialGenerationId = extractClaudeCredentialGenerationId(input.response);
|
|
97518
|
+
if (providerAccountId === null || credentialGenerationId === null) return null;
|
|
97519
|
+
if (input.auth.path === USER_CLAUDE_CREDENTIAL_PATH) setLocalClaudeUsageGeneration(credentialGenerationId);
|
|
97503
97520
|
return publishClaudeUsageAfterSync({
|
|
97504
97521
|
auth: input.auth,
|
|
97505
97522
|
providerAccountId,
|
|
97523
|
+
credentialGenerationId,
|
|
97506
97524
|
accountEmail: input.accountEmail,
|
|
97507
97525
|
accountDisplayName: input.accountDisplayName,
|
|
97508
97526
|
planType: input.planType,
|
|
@@ -172080,7 +172098,7 @@ function em(e) {
|
|
|
172080
172098
|
BO ??= new Int32Array(new SharedArrayBuffer(4)), Atomics.wait(BO, 0, 0, SY);
|
|
172081
172099
|
}
|
|
172082
172100
|
}
|
|
172083
|
-
function rm$
|
|
172101
|
+
function rm$5(e, t) {
|
|
172084
172102
|
let n = (0, path.resolve)(t).toLowerCase(), r = (0, path.dirname)((0, path.resolve)(e)).toLowerCase();
|
|
172085
172103
|
if (r === n || KO(r, n) || qO(r, n, "lexical")) return !0;
|
|
172086
172104
|
let o = em(t)?.toLowerCase();
|
|
@@ -184930,7 +184948,7 @@ function Wo() {
|
|
|
184930
184948
|
}
|
|
184931
184949
|
function sle(e) {
|
|
184932
184950
|
let t = process.cwd();
|
|
184933
|
-
return e.filter((n) => !rm$
|
|
184951
|
+
return e.filter((n) => !rm$5(n, t));
|
|
184934
184952
|
}
|
|
184935
184953
|
function ZU(e) {
|
|
184936
184954
|
let t = Bun.which(e);
|
|
@@ -203870,7 +203888,7 @@ const collectStreamAsString = (stream) => stream.pipe(require_Path.decodeText(),
|
|
|
203870
203888
|
//#region src/orchestration/WorkerPlanCodexTools.ts
|
|
203871
203889
|
const FORGE_PROPOSE_WORKER_TASKS_TOOL = "forge_propose_worker_tasks";
|
|
203872
203890
|
const MAX_WORKER_PLAN_ITEMS = 5;
|
|
203873
|
-
function asRecord$
|
|
203891
|
+
function asRecord$9(value) {
|
|
203874
203892
|
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
|
|
203875
203893
|
}
|
|
203876
203894
|
function readTrimmedString(value) {
|
|
@@ -203886,7 +203904,7 @@ function isValidWorkerSummary(value) {
|
|
|
203886
203904
|
return value !== void 0 && value.length > 0 && value.length <= 4e3;
|
|
203887
203905
|
}
|
|
203888
203906
|
function decodeWorkerPlanItem(value) {
|
|
203889
|
-
const item = asRecord$
|
|
203907
|
+
const item = asRecord$9(value);
|
|
203890
203908
|
const slug = readTrimmedString(item?.slug);
|
|
203891
203909
|
const title = readTrimmedString(item?.title);
|
|
203892
203910
|
const summary = readTrimmedString(item?.summary);
|
|
@@ -203950,7 +203968,7 @@ function createWorkerPlanDynamicTools() {
|
|
|
203950
203968
|
function createWorkerPlanDynamicToolHandler() {
|
|
203951
203969
|
return async (input) => {
|
|
203952
203970
|
if (input.tool !== "forge_propose_worker_tasks") throw new Error(`Unsupported worker-plan tool: ${input.tool}`);
|
|
203953
|
-
if (!decodeWorkerPlanItems(asRecord$
|
|
203971
|
+
if (!decodeWorkerPlanItems(asRecord$9(input.arguments)?.items)) throw new Error("Worker plans require one to five unique, fully described items.");
|
|
203954
203972
|
return {
|
|
203955
203973
|
success: true,
|
|
203956
203974
|
contentItems: [{
|
|
@@ -205673,25 +205691,25 @@ const AUTH_METHOD_CONTAINER_KEYS = [
|
|
|
205673
205691
|
/** Lift an unknown value into `Option<string>` if it is a non-empty string. */
|
|
205674
205692
|
const asNonEmptyString = (v) => typeof v === "string" && v.length > 0 ? require_Schema$1.some(v) : require_Schema$1.none();
|
|
205675
205693
|
/** Lift an unknown value into `Option<Record>` if it is a plain object. */
|
|
205676
|
-
const asRecord$
|
|
205694
|
+
const asRecord$8 = (v) => typeof v === "object" && v !== null && !globalThis.Array.isArray(v) ? require_Schema$1.some(v) : require_Schema$1.none();
|
|
205677
205695
|
/**
|
|
205678
205696
|
* Walk an unknown parsed JSON value looking for a subscription/plan
|
|
205679
205697
|
* identifier, returning the first match as an `Option`.
|
|
205680
205698
|
*/
|
|
205681
205699
|
function findSubscriptionType(value) {
|
|
205682
205700
|
if (globalThis.Array.isArray(value)) return require_Schema$1.firstSomeOf(value.map(findSubscriptionType));
|
|
205683
|
-
return asRecord$
|
|
205701
|
+
return asRecord$8(value).pipe(require_Schema$1.flatMap$2((record) => {
|
|
205684
205702
|
const direct = require_Schema$1.firstSomeOf(SUBSCRIPTION_TYPE_KEYS.map((key) => asNonEmptyString(record[key])));
|
|
205685
205703
|
if (require_Schema$1.isSome(direct)) return direct;
|
|
205686
|
-
return require_Schema$1.firstSomeOf(SUBSCRIPTION_CONTAINER_KEYS.map((key) => asRecord$
|
|
205704
|
+
return require_Schema$1.firstSomeOf(SUBSCRIPTION_CONTAINER_KEYS.map((key) => asRecord$8(record[key]).pipe(require_Schema$1.flatMap$2(findSubscriptionType))));
|
|
205687
205705
|
}));
|
|
205688
205706
|
}
|
|
205689
205707
|
function findAuthMethod(value) {
|
|
205690
205708
|
if (globalThis.Array.isArray(value)) return require_Schema$1.firstSomeOf(value.map(findAuthMethod));
|
|
205691
|
-
return asRecord$
|
|
205709
|
+
return asRecord$8(value).pipe(require_Schema$1.flatMap$2((record) => {
|
|
205692
205710
|
const direct = require_Schema$1.firstSomeOf(AUTH_METHOD_KEYS.map((key) => asNonEmptyString(record[key])));
|
|
205693
205711
|
if (require_Schema$1.isSome(direct)) return direct;
|
|
205694
|
-
return require_Schema$1.firstSomeOf(AUTH_METHOD_CONTAINER_KEYS.map((key) => asRecord$
|
|
205712
|
+
return require_Schema$1.firstSomeOf(AUTH_METHOD_CONTAINER_KEYS.map((key) => asRecord$8(record[key]).pipe(require_Schema$1.flatMap$2(findAuthMethod))));
|
|
205695
205713
|
}));
|
|
205696
205714
|
}
|
|
205697
205715
|
/**
|
|
@@ -206839,7 +206857,7 @@ function userInputQuestionsFromToolInput(toolInput) {
|
|
|
206839
206857
|
return (Array.isArray(toolInput.questions) ? toolInput.questions : []).map((question, idx) => userInputQuestionFromUnknown(question, idx));
|
|
206840
206858
|
}
|
|
206841
206859
|
function userInputQuestionFromUnknown(question, idx) {
|
|
206842
|
-
const value = asRecord$
|
|
206860
|
+
const value = asRecord$7(question) ?? {};
|
|
206843
206861
|
return {
|
|
206844
206862
|
id: typeof value.header === "string" ? value.header : `q-${idx}`,
|
|
206845
206863
|
header: typeof value.header === "string" ? value.header : `Question ${idx + 1}`,
|
|
@@ -206849,13 +206867,13 @@ function userInputQuestionFromUnknown(question, idx) {
|
|
|
206849
206867
|
};
|
|
206850
206868
|
}
|
|
206851
206869
|
function userInputOptionFromUnknown(option) {
|
|
206852
|
-
const value = asRecord$
|
|
206870
|
+
const value = asRecord$7(option) ?? {};
|
|
206853
206871
|
return {
|
|
206854
206872
|
label: typeof value.label === "string" ? value.label : "",
|
|
206855
206873
|
description: typeof value.description === "string" ? value.description : ""
|
|
206856
206874
|
};
|
|
206857
206875
|
}
|
|
206858
|
-
function asRecord$
|
|
206876
|
+
function asRecord$7(value) {
|
|
206859
206877
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
206860
206878
|
}
|
|
206861
206879
|
function permissionResultFromDecision(decision, toolInput, suggestions) {
|
|
@@ -207663,7 +207681,7 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
|
|
|
207663
207681
|
const updateResumeCursor = require_Schema$1.fn("updateResumeCursor")(function* (context) {
|
|
207664
207682
|
const threadId = context.session.threadId;
|
|
207665
207683
|
if (!threadId) return;
|
|
207666
|
-
const providerDeliveryBinding = readProviderDeliveryBinding(asRecord$
|
|
207684
|
+
const providerDeliveryBinding = readProviderDeliveryBinding(asRecord$7(context.session.resumeCursor)?.providerDeliveryBinding);
|
|
207667
207685
|
const resumeCursor = {
|
|
207668
207686
|
threadId,
|
|
207669
207687
|
...context.resumeSessionId ? { resume: context.resumeSessionId } : {},
|
|
@@ -212732,7 +212750,7 @@ function makeAcpContentDeltaEvent(input) {
|
|
|
212732
212750
|
}
|
|
212733
212751
|
//#endregion
|
|
212734
212752
|
//#region ../../packages/shared/src/toolActivity.ts
|
|
212735
|
-
function asRecord$
|
|
212753
|
+
function asRecord$6(value) {
|
|
212736
212754
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
212737
212755
|
}
|
|
212738
212756
|
function asTrimmedString(value) {
|
|
@@ -212758,10 +212776,10 @@ function extractCommandFromTitle$1(title) {
|
|
|
212758
212776
|
return /`([^`]+)`/u.exec(title)?.[1]?.trim() || void 0;
|
|
212759
212777
|
}
|
|
212760
212778
|
function extractToolCommand(data, title) {
|
|
212761
|
-
const item = asRecord$
|
|
212762
|
-
const itemInput = asRecord$
|
|
212763
|
-
const itemResult = asRecord$
|
|
212764
|
-
const rawInput = asRecord$
|
|
212779
|
+
const item = asRecord$6(data?.item);
|
|
212780
|
+
const itemInput = asRecord$6(item?.input);
|
|
212781
|
+
const itemResult = asRecord$6(item?.result);
|
|
212782
|
+
const rawInput = asRecord$6(data?.rawInput);
|
|
212765
212783
|
const direct = [
|
|
212766
212784
|
normalizeCommandValue$1(item?.command),
|
|
212767
212785
|
normalizeCommandValue$1(itemInput?.command),
|
|
@@ -212789,7 +212807,7 @@ function collectPaths(value, paths, seen, depth) {
|
|
|
212789
212807
|
}
|
|
212790
212808
|
return;
|
|
212791
212809
|
}
|
|
212792
|
-
const record = asRecord$
|
|
212810
|
+
const record = asRecord$6(value);
|
|
212793
212811
|
if (!record) return;
|
|
212794
212812
|
for (const key of [
|
|
212795
212813
|
"path",
|
|
@@ -212848,7 +212866,7 @@ function deriveToolActivityPresentation(input) {
|
|
|
212848
212866
|
const title = asTrimmedString(input.title);
|
|
212849
212867
|
const detail = stripTrailingExitCode(asTrimmedString(input.detail));
|
|
212850
212868
|
const fallbackSummary = asTrimmedString(input.fallbackSummary) ?? "Tool";
|
|
212851
|
-
const data = asRecord$
|
|
212869
|
+
const data = asRecord$6(input.data);
|
|
212852
212870
|
const command = extractToolCommand(data, title);
|
|
212853
212871
|
const primaryPath = extractPrimaryPath(data);
|
|
212854
212872
|
const action = classifyToolAction({
|
|
@@ -212872,7 +212890,7 @@ function deriveToolActivityPresentation(input) {
|
|
|
212872
212890
|
...primaryPath ? { detail: primaryPath } : {}
|
|
212873
212891
|
};
|
|
212874
212892
|
if (action === "search") {
|
|
212875
|
-
const query = asTrimmedString(asRecord$
|
|
212893
|
+
const query = asTrimmedString(asRecord$6(data?.rawInput)?.query) ?? asTrimmedString(asRecord$6(data?.rawInput)?.pattern) ?? asTrimmedString(asRecord$6(data?.rawInput)?.searchTerm);
|
|
212876
212894
|
return {
|
|
212877
212895
|
summary: "Searched files",
|
|
212878
212896
|
...query ? { detail: query } : {}
|
|
@@ -279320,7 +279338,7 @@ function makeApprovedWorkerPlanEventState() {
|
|
|
279320
279338
|
function promptKey(masterThreadId, promptId) {
|
|
279321
279339
|
return `${masterThreadId}\n${promptId}`;
|
|
279322
279340
|
}
|
|
279323
|
-
function asRecord$
|
|
279341
|
+
function asRecord$5(value) {
|
|
279324
279342
|
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
|
|
279325
279343
|
}
|
|
279326
279344
|
function exactMaterializedTaskIds(value, expectedCount) {
|
|
@@ -279330,7 +279348,7 @@ function exactMaterializedTaskIds(value, expectedCount) {
|
|
|
279330
279348
|
}
|
|
279331
279349
|
function readyBatchFromActivity(state, event) {
|
|
279332
279350
|
if (event.payload.activity.kind !== "plan.task-creation.batch-succeeded") return null;
|
|
279333
|
-
const payload = asRecord$
|
|
279351
|
+
const payload = asRecord$5(event.payload.activity.payload);
|
|
279334
279352
|
const promptId = payload?.["promptId"];
|
|
279335
279353
|
if (typeof promptId !== "string") return null;
|
|
279336
279354
|
const key = promptKey(event.payload.threadId, promptId);
|
|
@@ -280492,7 +280510,7 @@ function runtimeGrantNeedsRefresh(token, identity, nowSeconds = Math.floor(Date.
|
|
|
280492
280510
|
return claims.expiresAtSeconds - nowSeconds <= RUNTIME_GRANT_REFRESH_SKEW_SECONDS;
|
|
280493
280511
|
}
|
|
280494
280512
|
/** Narrow an unknown to a plain object, or null. */
|
|
280495
|
-
function asRecord$
|
|
280513
|
+
function asRecord$4(value) {
|
|
280496
280514
|
return value !== null && typeof value === "object" ? value : null;
|
|
280497
280515
|
}
|
|
280498
280516
|
/** The raw (untrimmed) string when it is present and not blank, else null. */
|
|
@@ -280504,7 +280522,7 @@ function asTimestamp(value) {
|
|
|
280504
280522
|
return typeof value === "string" && Number.isFinite(Date.parse(value)) ? value : null;
|
|
280505
280523
|
}
|
|
280506
280524
|
function parseRuntimeGrantRefreshResponse(runtimeId, value) {
|
|
280507
|
-
const data = asRecord$
|
|
280525
|
+
const data = asRecord$4(asRecord$4(value)?.data);
|
|
280508
280526
|
if (!data || data.runtimeId !== runtimeId) return null;
|
|
280509
280527
|
const grantToken = asNonBlankString(data.grantToken);
|
|
280510
280528
|
const expiresAt = asTimestamp(data.expiresAt);
|
|
@@ -296724,6 +296742,74 @@ const LocalAutomationSchedulerLive = require_Schema$1.effectDiscard(require_Sche
|
|
|
296724
296742
|
yield* require_Schema$1.forkScoped(startup.awaitCommandReady.pipe(require_Schema$1.andThen(require_Schema$1.forever(tick.pipe(require_Schema$1.andThen(require_Schema$1.sleep("60 seconds")))))));
|
|
296725
296743
|
}));
|
|
296726
296744
|
//#endregion
|
|
296745
|
+
//#region src/command/providerUsageEnvironment.ts
|
|
296746
|
+
function asRecord$3(value) {
|
|
296747
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
296748
|
+
}
|
|
296749
|
+
function positiveInteger(value) {
|
|
296750
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : null;
|
|
296751
|
+
}
|
|
296752
|
+
function readEnvironmentId(value) {
|
|
296753
|
+
return typeof value === "string" && value.trim() !== "" ? value : null;
|
|
296754
|
+
}
|
|
296755
|
+
function readEligibleStatus(value) {
|
|
296756
|
+
return value === "running" || value === "suspended" ? value : null;
|
|
296757
|
+
}
|
|
296758
|
+
function isOwnedRuntime(row, ownerUserId) {
|
|
296759
|
+
return positiveInteger(row["userId"]) === ownerUserId;
|
|
296760
|
+
}
|
|
296761
|
+
function readRuntimeId(row) {
|
|
296762
|
+
const runtimeId = row["runtimeId"];
|
|
296763
|
+
return typeof runtimeId === "string" && runtimeId.trim() !== "" ? runtimeId : null;
|
|
296764
|
+
}
|
|
296765
|
+
function readCandidate(runtime, ownerUserId) {
|
|
296766
|
+
const row = asRecord$3(runtime);
|
|
296767
|
+
if (row === null || !isOwnedRuntime(row, ownerUserId) || row["desiredState"] !== "running") return null;
|
|
296768
|
+
const organizationId = positiveInteger(row["organizationId"]);
|
|
296769
|
+
const environmentId = readEnvironmentId(row["environmentId"]);
|
|
296770
|
+
const runtimeId = readRuntimeId(row);
|
|
296771
|
+
const status = readEligibleStatus(row["status"]);
|
|
296772
|
+
if (organizationId === null || environmentId === null || runtimeId === null || status === null) return null;
|
|
296773
|
+
return {
|
|
296774
|
+
organizationId,
|
|
296775
|
+
environmentId,
|
|
296776
|
+
runtimeId,
|
|
296777
|
+
status
|
|
296778
|
+
};
|
|
296779
|
+
}
|
|
296780
|
+
function candidateKey(candidate) {
|
|
296781
|
+
return `${candidate.organizationId}:${candidate.environmentId ?? ""}`;
|
|
296782
|
+
}
|
|
296783
|
+
function statusRank(status) {
|
|
296784
|
+
return status === "running" ? 0 : 1;
|
|
296785
|
+
}
|
|
296786
|
+
function deduplicateCandidates(candidates) {
|
|
296787
|
+
const byEnvironment = /* @__PURE__ */ new Map();
|
|
296788
|
+
for (const candidate of candidates) {
|
|
296789
|
+
const key = candidateKey(candidate);
|
|
296790
|
+
const existing = byEnvironment.get(key);
|
|
296791
|
+
if (existing === void 0 || statusRank(candidate.status) < statusRank(existing.status)) byEnvironment.set(key, candidate);
|
|
296792
|
+
}
|
|
296793
|
+
return [...byEnvironment.values()];
|
|
296794
|
+
}
|
|
296795
|
+
/**
|
|
296796
|
+
* Selects one authenticated owner's Environment from CMMD's projectless runtime
|
|
296797
|
+
* catalog. A tied best candidate fails closed, so Forge never chooses an
|
|
296798
|
+
* organization from browser input.
|
|
296799
|
+
*/
|
|
296800
|
+
function selectProviderUsageEnvironment(rawCatalog, ownerUserId) {
|
|
296801
|
+
const runtimes = asRecord$3(asRecord$3(rawCatalog)?.["data"])?.["runtimes"];
|
|
296802
|
+
if (!Array.isArray(runtimes)) return { kind: "unavailable" };
|
|
296803
|
+
const candidates = deduplicateCandidates(runtimes.map((runtime) => readCandidate(runtime, ownerUserId)).filter((candidate) => candidate !== null));
|
|
296804
|
+
const bestRank = Math.min(...candidates.map((candidate) => statusRank(candidate.status)));
|
|
296805
|
+
const bestCandidates = candidates.filter((candidate) => statusRank(candidate.status) === bestRank);
|
|
296806
|
+
if (bestCandidates.length !== 1) return { kind: "unavailable" };
|
|
296807
|
+
return {
|
|
296808
|
+
kind: "ready",
|
|
296809
|
+
organizationId: bestCandidates[0].organizationId
|
|
296810
|
+
};
|
|
296811
|
+
}
|
|
296812
|
+
//#endregion
|
|
296727
296813
|
//#region src/command/wsToken.ts
|
|
296728
296814
|
/**
|
|
296729
296815
|
* Build the WS token response given an optional PAT and the configured CMMD
|
|
@@ -296760,13 +296846,13 @@ function resolveWsUrl(baseUrl) {
|
|
|
296760
296846
|
const callCmmdTool = legacyCmmdToolBridge.callTool;
|
|
296761
296847
|
const extractMcpToolText = legacyCmmdToolBridge.extractText;
|
|
296762
296848
|
const isCmmdMcpAuthError = legacyCmmdToolBridge.isAuthError;
|
|
296763
|
-
var ClaudeUsageReadError = class extends require_Schema$1.TaggedError("ClaudeUsageReadError") {};
|
|
296764
296849
|
/**
|
|
296765
296850
|
* CMMD-side path for the PROJECT-keyed Forge Cloud catalog. Shared by the list
|
|
296766
296851
|
* proxy, the SSE poll-and-emit proxy, and the register/unregister proxies so the
|
|
296767
296852
|
* upstream contract lives in exactly one place.
|
|
296768
296853
|
*/
|
|
296769
296854
|
const CMMD_CLOUD_PROJECTS_PATH = "/api/forge/context/cloud-projects";
|
|
296855
|
+
const CMMD_RUNTIMES_PATH = "/api/forge/context/runtimes";
|
|
296770
296856
|
/**
|
|
296771
296857
|
* Authenticate the browser session and resolve the CMMD JWT to forward
|
|
296772
296858
|
* upstream. Returns null when no token could be resolved, which every caller
|
|
@@ -296890,6 +296976,10 @@ const cmmdBillingSeriesRouteLayer = registerProxyRoute({
|
|
|
296890
296976
|
const cmmdRestUnavailable = () => new CmmdProxyAuthenticationRequiredError("CMMD connection required. Reconnect CMMD to continue.");
|
|
296891
296977
|
function runCmmdRestProxy(session, proxy, dependencies = {}) {
|
|
296892
296978
|
return require_Schema$1.gen(function* () {
|
|
296979
|
+
if (dependencies.jwt !== void 0) {
|
|
296980
|
+
const explicitJwt = dependencies.jwt;
|
|
296981
|
+
return yield* require_Schema$1.promise(() => (dependencies.runProxy ?? runProxy)(() => proxy(explicitJwt)));
|
|
296982
|
+
}
|
|
296893
296983
|
const resolveJwt = dependencies.resolveJwt ?? resolveCmmdJwtForSession;
|
|
296894
296984
|
const jwt = yield* resolveJwt({
|
|
296895
296985
|
sessionId: session.sessionId,
|
|
@@ -298433,59 +298523,6 @@ const cmmdSetProviderAccountDefaultRouteLayer = registerProxyRoute({
|
|
|
298433
298523
|
orgIdSource: "none",
|
|
298434
298524
|
responseShape: "unwrapData"
|
|
298435
298525
|
});
|
|
298436
|
-
const resolveConnectedClaudeGeneration = (session) => require_Schema$1.gen(function* () {
|
|
298437
|
-
const outcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
298438
|
-
method: "GET",
|
|
298439
|
-
jwt,
|
|
298440
|
-
path: "/api/forge/context/providers/claude/credential"
|
|
298441
|
-
}));
|
|
298442
|
-
if (!outcome.ok) return outcome;
|
|
298443
|
-
const state = unwrapForgeEnvelope(outcome.value);
|
|
298444
|
-
if (state === null || typeof state !== "object" || !("connected" in state) || state.connected !== true || !("generationId" in state) || typeof state.generationId !== "string") return {
|
|
298445
|
-
ok: true,
|
|
298446
|
-
value: null
|
|
298447
|
-
};
|
|
298448
|
-
return {
|
|
298449
|
-
ok: true,
|
|
298450
|
-
value: {
|
|
298451
|
-
generationId: state.generationId,
|
|
298452
|
-
generationHash: (0, node_crypto.createHash)("sha256").update(state.generationId).digest("hex")
|
|
298453
|
-
}
|
|
298454
|
-
};
|
|
298455
|
-
});
|
|
298456
|
-
/**
|
|
298457
|
-
* The GET path is read-only. The explicit per-account POST refresh invokes
|
|
298458
|
-
* this helper and propagates any CMMD forward failure to the caller.
|
|
298459
|
-
*/
|
|
298460
|
-
const forwardClaudeUsageTelemetry = (session, requestedProviderAccountId, activelyPoll = false, fetchClaudeUsage = fetchClaudeUsageViaOfficialClient) => require_Schema$1.gen(function* () {
|
|
298461
|
-
const credentialOutcome = yield* resolveConnectedClaudeGeneration(session);
|
|
298462
|
-
if (!credentialOutcome.ok) return credentialOutcome;
|
|
298463
|
-
if (credentialOutcome.value === null) return null;
|
|
298464
|
-
const { generationId, generationHash } = credentialOutcome.value;
|
|
298465
|
-
const providerAccountId = requestedProviderAccountId ?? generationId;
|
|
298466
|
-
const activeSnapshot = activelyPoll && providerAccountId === generationId ? yield* require_Schema$1.tryPromise({
|
|
298467
|
-
try: () => fetchClaudeUsage({ binaryPath: resolveClaudeBinaryPath("claude") }),
|
|
298468
|
-
catch: (cause) => new ClaudeUsageReadError({ cause })
|
|
298469
|
-
}).pipe(require_Schema$1.orElseSucceed(() => null)) : null;
|
|
298470
|
-
const snapshot = activeSnapshot ? {
|
|
298471
|
-
...activeSnapshot,
|
|
298472
|
-
observedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
298473
|
-
} : getLatestClaudeRateLimitTelemetry(generationHash, providerAccountId);
|
|
298474
|
-
if (!snapshot) return null;
|
|
298475
|
-
return yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
298476
|
-
method: "POST",
|
|
298477
|
-
jwt,
|
|
298478
|
-
path: "/api/forge/context/providers/usage/claude/telemetry",
|
|
298479
|
-
body: {
|
|
298480
|
-
providerAccountId,
|
|
298481
|
-
credentialGenerationId: generationId,
|
|
298482
|
-
source: activeSnapshot ? "active_poll" : "passive_sdk_telemetry",
|
|
298483
|
-
fiveHour: snapshot.fiveHour,
|
|
298484
|
-
sevenDay: snapshot.sevenDay,
|
|
298485
|
-
observedAt: snapshot.observedAt
|
|
298486
|
-
}
|
|
298487
|
-
}));
|
|
298488
|
-
});
|
|
298489
298526
|
const cmmdGetProviderUsageRouteLayer = add$1("GET", "/api/cmmd/providers/usage", require_Schema$1.gen(function* () {
|
|
298490
298527
|
const request = yield* require_HttpServer.HttpServerRequest;
|
|
298491
298528
|
const outcome = yield* runCmmdRestProxy(yield* (yield* ServerAuth).authenticateHttpRequest(request), (jwt) => cmmdGateway.request({
|
|
@@ -298506,15 +298543,63 @@ function parseProviderUsageRefreshInput(rawBody) {
|
|
|
298506
298543
|
providerAccountId: body.providerAccountId
|
|
298507
298544
|
};
|
|
298508
298545
|
}
|
|
298509
|
-
|
|
298510
|
-
const
|
|
298511
|
-
const
|
|
298512
|
-
|
|
298513
|
-
|
|
298514
|
-
|
|
298515
|
-
|
|
298516
|
-
|
|
298517
|
-
|
|
298546
|
+
function resolveProviderUsageOwnerUserId(session) {
|
|
298547
|
+
const identity = readCmmdUserIdentityForSession(session.sessionId);
|
|
298548
|
+
const userId = identity === null ? NaN : Number(identity.id);
|
|
298549
|
+
return Number.isSafeInteger(userId) && userId > 0 ? userId : null;
|
|
298550
|
+
}
|
|
298551
|
+
function buildClaudeUsageRefreshErrorResponse(error) {
|
|
298552
|
+
const status = error instanceof CmmdProxyRequestError && error.status === 503 ? 503 : 502;
|
|
298553
|
+
return require_HttpServer.jsonUnsafe({
|
|
298554
|
+
error: "Claude usage refresh is unavailable.",
|
|
298555
|
+
code: "CLAUDE_USAGE_REFRESH_UNAVAILABLE"
|
|
298556
|
+
}, { status });
|
|
298557
|
+
}
|
|
298558
|
+
function makeRefreshProviderUsageHandler(dependencies = {}) {
|
|
298559
|
+
return require_Schema$1.gen(function* () {
|
|
298560
|
+
const request = yield* require_HttpServer.HttpServerRequest;
|
|
298561
|
+
const session = yield* (yield* ServerAuth).authenticateHttpRequest(request);
|
|
298562
|
+
const input = parseProviderUsageRefreshInput(yield* request.json);
|
|
298563
|
+
if (input === null) return require_HttpServer.jsonUnsafe({ error: "provider and providerAccountId must identify a connected provider account" }, { status: 400 });
|
|
298564
|
+
if (input.provider === "claude") {
|
|
298565
|
+
const requestJwt = yield* (dependencies.resolveJwt ?? resolveCmmdJwtForSession)({
|
|
298566
|
+
sessionId: session.sessionId,
|
|
298567
|
+
subject: session.subject,
|
|
298568
|
+
logPrefix: "claude-usage-refresh"
|
|
298569
|
+
});
|
|
298570
|
+
if (!requestJwt) return buildClaudeUsageRefreshErrorResponse(/* @__PURE__ */ new Error("CMMD authentication required."));
|
|
298571
|
+
const ownerUserId = resolveProviderUsageOwnerUserId(session);
|
|
298572
|
+
if (ownerUserId === null) return require_HttpServer.jsonUnsafe({
|
|
298573
|
+
error: "CMMD owner identity is unavailable for Claude usage refresh.",
|
|
298574
|
+
code: "CLAUDE_USAGE_ENVIRONMENT_UNAVAILABLE"
|
|
298575
|
+
}, { status: 503 });
|
|
298576
|
+
const catalogOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
298577
|
+
method: "GET",
|
|
298578
|
+
jwt,
|
|
298579
|
+
path: CMMD_RUNTIMES_PATH
|
|
298580
|
+
}), { jwt: requestJwt });
|
|
298581
|
+
if (!catalogOutcome.ok) return buildClaudeUsageRefreshErrorResponse(catalogOutcome.error);
|
|
298582
|
+
const target = selectProviderUsageEnvironment(catalogOutcome.value, ownerUserId);
|
|
298583
|
+
if (target.kind === "unavailable") return require_HttpServer.jsonUnsafe({
|
|
298584
|
+
error: "No owned Environment with running intent is available for Claude usage refresh.",
|
|
298585
|
+
code: "CLAUDE_USAGE_ENVIRONMENT_UNAVAILABLE"
|
|
298586
|
+
}, { status: 503 });
|
|
298587
|
+
const refreshOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
298588
|
+
method: "POST",
|
|
298589
|
+
jwt,
|
|
298590
|
+
path: "/api/forge/context/providers/usage/claude/refresh",
|
|
298591
|
+
body: { providerAccountId: input.providerAccountId },
|
|
298592
|
+
orgId: String(target.organizationId)
|
|
298593
|
+
}), { jwt: requestJwt });
|
|
298594
|
+
if (!refreshOutcome.ok) return buildClaudeUsageRefreshErrorResponse(refreshOutcome.error);
|
|
298595
|
+
const snapshotOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
298596
|
+
method: "GET",
|
|
298597
|
+
jwt,
|
|
298598
|
+
path: "/api/forge/context/providers/usage"
|
|
298599
|
+
}), { jwt: requestJwt });
|
|
298600
|
+
if (!snapshotOutcome.ok) return buildClaudeUsageRefreshErrorResponse(snapshotOutcome.error);
|
|
298601
|
+
return require_HttpServer.jsonUnsafe(unwrapForgeEnvelope(snapshotOutcome.value), { status: 200 });
|
|
298602
|
+
}
|
|
298518
298603
|
const refreshOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
298519
298604
|
method: "POST",
|
|
298520
298605
|
jwt,
|
|
@@ -298522,16 +298607,16 @@ const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/us
|
|
|
298522
298607
|
body: { providerAccountId: input.providerAccountId }
|
|
298523
298608
|
}));
|
|
298524
298609
|
if (!refreshOutcome.ok) return buildProxyErrorResponse(refreshOutcome.error);
|
|
298525
|
-
|
|
298526
|
-
|
|
298527
|
-
|
|
298528
|
-
|
|
298529
|
-
|
|
298530
|
-
|
|
298531
|
-
|
|
298532
|
-
|
|
298533
|
-
|
|
298534
|
-
|
|
298610
|
+
const snapshotOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
298611
|
+
method: "GET",
|
|
298612
|
+
jwt,
|
|
298613
|
+
path: "/api/forge/context/providers/usage"
|
|
298614
|
+
}));
|
|
298615
|
+
if (!snapshotOutcome.ok) return buildProxyErrorResponse(snapshotOutcome.error);
|
|
298616
|
+
return require_HttpServer.jsonUnsafe(unwrapForgeEnvelope(snapshotOutcome.value), { status: 200 });
|
|
298617
|
+
}).pipe(require_Schema$1.catchTag("AuthError", (error) => respondToAuthError(error)));
|
|
298618
|
+
}
|
|
298619
|
+
const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/usage/refresh", makeRefreshProviderUsageHandler());
|
|
298535
298620
|
const cmmdGetUserCodexCredentialRouteLayer = registerProxyRoute({
|
|
298536
298621
|
forgePath: "/api/cmmd/providers/codex/credential",
|
|
298537
298622
|
method: "GET",
|
|
@@ -309609,6 +309694,82 @@ const claudeNativeGenerationProofRouteLayer = add$1("GET", "/api/runtime/provide
|
|
|
309609
309694
|
generationHash
|
|
309610
309695
|
});
|
|
309611
309696
|
}));
|
|
309697
|
+
const defaultClaudeUsageRouteDependencies = {
|
|
309698
|
+
readCredential: async (token) => {
|
|
309699
|
+
const base = process.env.FORGE_CMMD_RUNTIME_CONTROL_PLANE_URL?.trim() ?? "";
|
|
309700
|
+
if (!base) return null;
|
|
309701
|
+
const response = await fetch(`${base.replace(/\/+$/u, "")}/api/forge/context/auth-runtime-claude-credential`, {
|
|
309702
|
+
headers: {
|
|
309703
|
+
authorization: `Bearer ${token}`,
|
|
309704
|
+
accept: "application/json"
|
|
309705
|
+
},
|
|
309706
|
+
signal: AbortSignal.timeout(2e4)
|
|
309707
|
+
});
|
|
309708
|
+
return response.ok ? response.text() : null;
|
|
309709
|
+
},
|
|
309710
|
+
createDirectory: () => (0, node_fs_promises.mkdtemp)((0, node_path.join)((0, node_os.tmpdir)(), "forge-claude-usage-")),
|
|
309711
|
+
writeCredential: (directory, credential) => (0, node_fs_promises.writeFile)((0, node_path.join)(directory, ".credentials.json"), credential, { mode: 384 }),
|
|
309712
|
+
loadUsage: (directory) => fetchClaudeUsageViaOfficialClient({
|
|
309713
|
+
binaryPath: resolveClaudeBinaryPath("claude"),
|
|
309714
|
+
claudeConfigDir: directory
|
|
309715
|
+
}),
|
|
309716
|
+
removeDirectory: (directory) => (0, node_fs_promises.rm)(directory, {
|
|
309717
|
+
recursive: true,
|
|
309718
|
+
force: false
|
|
309719
|
+
}),
|
|
309720
|
+
now: () => /* @__PURE__ */ new Date()
|
|
309721
|
+
};
|
|
309722
|
+
const claudeUsageHandler = (dependencies) => require_Schema$1.gen(function* () {
|
|
309723
|
+
const request = yield* require_HttpServer.HttpServerRequest;
|
|
309724
|
+
const config = yield* ServerConfig;
|
|
309725
|
+
const token = claudeReadinessToken(request.headers.authorization);
|
|
309726
|
+
const required = completeClaudeReadinessExpectations(config);
|
|
309727
|
+
if (!token || !required) return unauthorizedClaudeReadinessResponse();
|
|
309728
|
+
const claims = require_runtimeControlAuthority.verifyCmmdClaudeUsageTicket(token, required);
|
|
309729
|
+
if (!claims) return unauthorizedClaudeReadinessResponse();
|
|
309730
|
+
const claimed = claimClaudeReadinessJti({
|
|
309731
|
+
jti: claims.jti,
|
|
309732
|
+
expiresAtSeconds: claims.expiresAtSeconds,
|
|
309733
|
+
nowSeconds: Math.floor(Date.now() / 1e3)
|
|
309734
|
+
});
|
|
309735
|
+
if (claimed === "replayed") return unauthorizedClaudeReadinessResponse();
|
|
309736
|
+
if (claimed === "capacity_exhausted") return require_HttpServer.jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
|
|
309737
|
+
return yield* require_Schema$1.promise(async () => {
|
|
309738
|
+
let directory = null;
|
|
309739
|
+
let response = require_HttpServer.jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
|
|
309740
|
+
try {
|
|
309741
|
+
directory = await dependencies.createDirectory();
|
|
309742
|
+
const credentialJson = await dependencies.readCredential(token);
|
|
309743
|
+
if (credentialJson !== null && isClaudeSubscriptionCredential(credentialJson)) {
|
|
309744
|
+
await dependencies.writeCredential(directory, credentialJson);
|
|
309745
|
+
const usage = await dependencies.loadUsage(directory);
|
|
309746
|
+
response = require_HttpServer.jsonUnsafe({
|
|
309747
|
+
fiveHour: usage.fiveHour,
|
|
309748
|
+
sevenDay: usage.sevenDay,
|
|
309749
|
+
observedAt: dependencies.now().toISOString(),
|
|
309750
|
+
receipt: {
|
|
309751
|
+
orgId: claims.orgId,
|
|
309752
|
+
userId: claims.userId,
|
|
309753
|
+
runtimeId: claims.runtimeId,
|
|
309754
|
+
machineId: claims.machineId,
|
|
309755
|
+
credentialEpoch: claims.credentialEpoch,
|
|
309756
|
+
providerAccountId: claims.providerAccountId,
|
|
309757
|
+
credentialGenerationId: claims.generationId
|
|
309758
|
+
}
|
|
309759
|
+
}, { headers: { "cache-control": "no-store" } });
|
|
309760
|
+
}
|
|
309761
|
+
} catch {}
|
|
309762
|
+
if (directory === null) return response;
|
|
309763
|
+
try {
|
|
309764
|
+
await dependencies.removeDirectory(directory);
|
|
309765
|
+
} catch {
|
|
309766
|
+
return require_HttpServer.jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
|
|
309767
|
+
}
|
|
309768
|
+
return response;
|
|
309769
|
+
});
|
|
309770
|
+
});
|
|
309771
|
+
const createClaudeUsageRouteLayer = (dependencies = defaultClaudeUsageRouteDependencies) => add$1("POST", "/api/runtime/provider-usage/claude", claudeUsageHandler(dependencies));
|
|
309772
|
+
const claudeUsageRouteLayer = createClaudeUsageRouteLayer();
|
|
309612
309773
|
/**
|
|
309613
309774
|
* FINDING-CB1 — workspace readiness SSE endpoint.
|
|
309614
309775
|
*
|
|
@@ -309956,7 +310117,7 @@ const MiscRuntimeLayerLive = require_Schema$1.mergeAll(AnalyticsServiceLayerLive
|
|
|
309956
310117
|
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));
|
|
309957
310118
|
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));
|
|
309958
310119
|
const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(require_Schema$1.provideMerge(RuntimeDependenciesLive));
|
|
309959
|
-
const makeRoutesLayer = require_Schema$1.mergeAll(authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authCommandBearerBootstrapRouteLayer, authCommandBootstrapRouteLayer, authOAuthTokenExchangeRouteLayer, authWebSocketTicketRouteLayer, 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, cmmdForgeCloudProjectRemovalPreviewRouteLayer, 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));
|
|
310120
|
+
const makeRoutesLayer = require_Schema$1.mergeAll(authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authCommandBearerBootstrapRouteLayer, authCommandBootstrapRouteLayer, authOAuthTokenExchangeRouteLayer, authWebSocketTicketRouteLayer, 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, cmmdForgeCloudProjectRemovalPreviewRouteLayer, 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, claudeUsageRouteLayer, codexRuntimeProviderReadinessRouteLayer, runtimeDiagnosticsRouteLayer, cloudFoldersRouteLayer, cloudProjectCreateRouteLayer, gitUrlCloneRouteLayer, websocketRpcRouteLayer).pipe(require_Schema$1.provide$1(browserApiCorsLayer));
|
|
309960
310121
|
const makeServerLayer = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
|
|
309961
310122
|
const config = yield* ServerConfig;
|
|
309962
310123
|
fixPath();
|