@cmmd-center/forge 0.9.13 → 0.9.14
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 +281 -135
- package/dist/bin.mjs +278 -133
- 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/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.mjs
CHANGED
|
@@ -11,7 +11,7 @@ import { a as make$48, i as keys, n as getOption, o as makeWith$1, r as invalida
|
|
|
11
11
|
import { S as layer$9, _ as defaultEscape, a as DeadlockError, b as makeCompiler$1, c as SqlError, d as UnknownError, g as custom, h as make$49, i as ConstraintError, l as SqlSyntaxError, m as SqlClient, n as AuthorizationError, o as LockTimeoutError, r as ConnectionError, s as SerializationError, t as AuthenticationError, u as StatementTimeoutError, v as defaultTransforms, y as fragment } from "./SqlError-B2g5pJux.mjs";
|
|
12
12
|
import { r as wrapper_default, t as Mime_default } from "./Mime-Dq9IoNiV.mjs";
|
|
13
13
|
import { a as diag, c as SpanKind$1, d as TraceFlags, f as ROOT_CONTEXT, i as propagation, l as isSpanContextValid, m as DiagLogLevel, n as init_esm$1, o as context$1, p as createContextKey, r as trace, s as SpanStatusCode, t as esm_exports$1 } from "./esm-wLIF-u3N.mjs";
|
|
14
|
-
import { a as verifyCmmdAuthRuntimeTicket, c as
|
|
14
|
+
import { a as verifyCmmdAuthRuntimeTicket, c as verifyCmmdRuntimeTicket, d as setRuntimeGrantToken, f as createReadOnceFileTokenAccessor, i as sendRuntimeControlHeartbeat, l as verifyCmmdRuntimeTicketRefreshProof, n as bootstrapRuntimeControlAuthorityFromNarrowGrant, o as verifyCmmdClaudeReadinessTicket, r as readRuntimeControlAuthority, s as verifyCmmdClaudeUsageTicket, t as bootstrapRuntimeControlAuthority, u as runtimeGrantToken } from "./runtimeControlAuthority-COHmz_WT.mjs";
|
|
15
15
|
import { n as PtySpawnError, t as PtyAdapter } from "./PTY-Cx_YKiEO.mjs";
|
|
16
16
|
import { createRequire } from "node:module";
|
|
17
17
|
import * as HE from "node:child_process";
|
|
@@ -32066,7 +32066,7 @@ function requiredString(value, minimumLength = 1) {
|
|
|
32066
32066
|
if (typeof value !== "string" || value.length < minimumLength) return identityCorrupt();
|
|
32067
32067
|
return value;
|
|
32068
32068
|
}
|
|
32069
|
-
function positiveInteger$
|
|
32069
|
+
function positiveInteger$2(value) {
|
|
32070
32070
|
if (!Number.isInteger(value) || Number(value) <= 0) return identityCorrupt();
|
|
32071
32071
|
return Number(value);
|
|
32072
32072
|
}
|
|
@@ -32086,7 +32086,7 @@ function parseChallenge(value) {
|
|
|
32086
32086
|
if (!value || typeof value !== "object") return identityCorrupt();
|
|
32087
32087
|
const record = value;
|
|
32088
32088
|
return {
|
|
32089
|
-
deviceId: positiveInteger$
|
|
32089
|
+
deviceId: positiveInteger$2(record.deviceId),
|
|
32090
32090
|
challengeId: requiredString(record.challengeId, 8),
|
|
32091
32091
|
signingPayload: requiredString(record.signingPayload),
|
|
32092
32092
|
currentKeyId: requiredString(record.currentKeyId),
|
|
@@ -64870,7 +64870,7 @@ function normalizeNumberish(value) {
|
|
|
64870
64870
|
}
|
|
64871
64871
|
//#endregion
|
|
64872
64872
|
//#region package.json
|
|
64873
|
-
var version$1 = "0.9.
|
|
64873
|
+
var version$1 = "0.9.14";
|
|
64874
64874
|
//#endregion
|
|
64875
64875
|
//#region src/sentry.ts
|
|
64876
64876
|
const SERVER_APP_NAME = "forge-server";
|
|
@@ -65343,7 +65343,7 @@ function readCmmdAvatarUrl(raw) {
|
|
|
65343
65343
|
function readTrimmedString$2(value) {
|
|
65344
65344
|
return typeof value === "string" ? value.trim() || null : null;
|
|
65345
65345
|
}
|
|
65346
|
-
function asRecord$
|
|
65346
|
+
function asRecord$12(value) {
|
|
65347
65347
|
return value && typeof value === "object" ? value : null;
|
|
65348
65348
|
}
|
|
65349
65349
|
function readDirectPlanLabelFromRecord(obj) {
|
|
@@ -65355,26 +65355,26 @@ function readNestedPlanLabelFromRecord(obj) {
|
|
|
65355
65355
|
function readCmmdPlanLabel(obj) {
|
|
65356
65356
|
const direct = readDirectPlanLabelFromRecord(obj);
|
|
65357
65357
|
if (direct) return direct;
|
|
65358
|
-
const plan = asRecord$
|
|
65358
|
+
const plan = asRecord$12(obj["plan"]);
|
|
65359
65359
|
if (plan) {
|
|
65360
65360
|
const label = readNestedPlanLabelFromRecord(plan);
|
|
65361
65361
|
if (label) return label;
|
|
65362
65362
|
}
|
|
65363
|
-
const subscription = asRecord$
|
|
65363
|
+
const subscription = asRecord$12(obj["subscription"]);
|
|
65364
65364
|
if (subscription) {
|
|
65365
65365
|
const label = readNestedPlanLabelFromRecord(subscription);
|
|
65366
65366
|
if (label) return label;
|
|
65367
|
-
const subscriptionPlan = asRecord$
|
|
65367
|
+
const subscriptionPlan = asRecord$12(subscription["plan"]);
|
|
65368
65368
|
if (subscriptionPlan) {
|
|
65369
65369
|
const nestedLabel = readNestedPlanLabelFromRecord(subscriptionPlan);
|
|
65370
65370
|
if (nestedLabel) return nestedLabel;
|
|
65371
65371
|
}
|
|
65372
65372
|
}
|
|
65373
|
-
const billing = asRecord$
|
|
65373
|
+
const billing = asRecord$12(obj["billing"]);
|
|
65374
65374
|
if (billing) {
|
|
65375
65375
|
const label = readNestedPlanLabelFromRecord(billing);
|
|
65376
65376
|
if (label) return label;
|
|
65377
|
-
const billingPlan = asRecord$
|
|
65377
|
+
const billingPlan = asRecord$12(billing["plan"]);
|
|
65378
65378
|
if (billingPlan) return readNestedPlanLabelFromRecord(billingPlan);
|
|
65379
65379
|
}
|
|
65380
65380
|
return null;
|
|
@@ -65511,7 +65511,7 @@ function constantTimeEqual(left, right) {
|
|
|
65511
65511
|
function integerSeconds(value) {
|
|
65512
65512
|
return Number.isSafeInteger(value) && value >= 0 ? value : null;
|
|
65513
65513
|
}
|
|
65514
|
-
function positiveInteger(value) {
|
|
65514
|
+
function positiveInteger$1(value) {
|
|
65515
65515
|
return Number.isSafeInteger(value) && value > 0 ? value : null;
|
|
65516
65516
|
}
|
|
65517
65517
|
function parseAssertion(token) {
|
|
@@ -65538,7 +65538,7 @@ function hasExpectedPayloadContext(payload) {
|
|
|
65538
65538
|
function readRequiredClaims(payload) {
|
|
65539
65539
|
const subject = nonEmptyString$1(payload["sub"]);
|
|
65540
65540
|
if (!subject) return null;
|
|
65541
|
-
const userId = positiveInteger(payload["user_id"]);
|
|
65541
|
+
const userId = positiveInteger$1(payload["user_id"]);
|
|
65542
65542
|
if (!userId) return null;
|
|
65543
65543
|
const jti = nonEmptyString$1(payload["jti"]);
|
|
65544
65544
|
if (!jti) return null;
|
|
@@ -69135,22 +69135,22 @@ const EMPTY_PARSED_ERROR = {
|
|
|
69135
69135
|
message: null,
|
|
69136
69136
|
raw: null
|
|
69137
69137
|
};
|
|
69138
|
-
function asRecord$
|
|
69138
|
+
function asRecord$11(value) {
|
|
69139
69139
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
69140
69140
|
}
|
|
69141
69141
|
function readTrimmedString$1(value) {
|
|
69142
69142
|
return (typeof value === "string" ? value.trim() : "") || null;
|
|
69143
69143
|
}
|
|
69144
69144
|
function readErrorEnvelope(record) {
|
|
69145
|
-
return asRecord$
|
|
69145
|
+
return asRecord$11(record["error"]);
|
|
69146
69146
|
}
|
|
69147
69147
|
function readUpstreamErrorCode(body) {
|
|
69148
|
-
const record = asRecord$
|
|
69148
|
+
const record = asRecord$11(body);
|
|
69149
69149
|
if (record === null) return null;
|
|
69150
69150
|
return readTrimmedString$1(record["code"]) ?? readTrimmedString$1(readErrorEnvelope(record)?.["code"]);
|
|
69151
69151
|
}
|
|
69152
69152
|
function readErrorMessage$2(raw) {
|
|
69153
|
-
const record = asRecord$
|
|
69153
|
+
const record = asRecord$11(raw);
|
|
69154
69154
|
if (record === null) return null;
|
|
69155
69155
|
const error = record["error"];
|
|
69156
69156
|
const nestedMessage = readErrorEnvelope(record)?.["message"];
|
|
@@ -69782,7 +69782,7 @@ function buildProxyErrorResponse(error) {
|
|
|
69782
69782
|
code: error.code
|
|
69783
69783
|
}, { status: 403 });
|
|
69784
69784
|
if (error instanceof CmmdProxyRequestError) {
|
|
69785
|
-
const status = error.status >= 500 ? 502 : error.status;
|
|
69785
|
+
const status = error.status === 503 ? 503 : error.status >= 500 ? 502 : error.status;
|
|
69786
69786
|
return jsonUnsafe({
|
|
69787
69787
|
error: error.detail ?? "CMMD REST request failed.",
|
|
69788
69788
|
code: error.code,
|
|
@@ -96479,7 +96479,7 @@ const EMPTY_PLAN_VALUES = new Set([
|
|
|
96479
96479
|
"none",
|
|
96480
96480
|
"null"
|
|
96481
96481
|
]);
|
|
96482
|
-
function asRecord$
|
|
96482
|
+
function asRecord$10(value) {
|
|
96483
96483
|
if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
|
|
96484
96484
|
return value;
|
|
96485
96485
|
}
|
|
@@ -96496,7 +96496,7 @@ function decodeJwtClaims(token) {
|
|
|
96496
96496
|
try {
|
|
96497
96497
|
const decoded = Buffer.from(payload, "base64url");
|
|
96498
96498
|
if (decoded.byteLength > MAX_CLAIMS_BYTES) return void 0;
|
|
96499
|
-
return asRecord$
|
|
96499
|
+
return asRecord$10(JSON.parse(decoded.toString("utf8")));
|
|
96500
96500
|
} catch {
|
|
96501
96501
|
return;
|
|
96502
96502
|
}
|
|
@@ -96518,7 +96518,7 @@ function findPlanType(claims) {
|
|
|
96518
96518
|
const direct = fromRecord(claims);
|
|
96519
96519
|
if (direct) return direct;
|
|
96520
96520
|
for (const value of Object.values(claims)) {
|
|
96521
|
-
const nested = asRecord$
|
|
96521
|
+
const nested = asRecord$10(value);
|
|
96522
96522
|
if (!nested) continue;
|
|
96523
96523
|
const found = fromRecord(nested);
|
|
96524
96524
|
if (found) return found;
|
|
@@ -96535,7 +96535,7 @@ function readCodexAuthIdentity(authJson) {
|
|
|
96535
96535
|
} catch {
|
|
96536
96536
|
return {};
|
|
96537
96537
|
}
|
|
96538
|
-
const claims = decodeJwtClaims(asRecord$
|
|
96538
|
+
const claims = decodeJwtClaims(asRecord$10(asRecord$10(parsed)?.tokens)?.id_token);
|
|
96539
96539
|
if (!claims) return {};
|
|
96540
96540
|
const email = findEmail(claims);
|
|
96541
96541
|
const planType = findPlanType(claims);
|
|
@@ -96732,11 +96732,6 @@ function recordClaudeRateLimitTelemetry(info, generationHash = currentClaudeUsag
|
|
|
96732
96732
|
observedAt: [fiveHourObservedAt, sevenDayObservedAt].filter((value) => value !== null).toSorted()[0]
|
|
96733
96733
|
});
|
|
96734
96734
|
}
|
|
96735
|
-
function getLatestClaudeRateLimitTelemetry(generationHash = currentClaudeUsageGenerationHash(), providerAccountId) {
|
|
96736
|
-
if (generationHash === null) return null;
|
|
96737
|
-
const cacheKey = providerAccountId ? `${providerAccountId}:${generationHash}` : generationHash;
|
|
96738
|
-
return cachedSnapshots.get(cacheKey) ?? null;
|
|
96739
|
-
}
|
|
96740
96735
|
//#endregion
|
|
96741
96736
|
//#region src/providerAuth/ClaudeDeviceAuth.ts
|
|
96742
96737
|
const AUTHORIZE_URL_PATTERN = /https:\/\/[^\s]*\/oauth\/authorize\?[^\s]+/u;
|
|
@@ -97115,17 +97110,23 @@ async function loadClaudeAccountMetadataFromCli(homePath) {
|
|
|
97115
97110
|
function extractClaudeCredentialGenerationId(response) {
|
|
97116
97111
|
if (typeof response !== "object" || response === null || !("data" in response)) return null;
|
|
97117
97112
|
const data = response.data;
|
|
97118
|
-
if (typeof data !== "object" || data === null
|
|
97119
|
-
if (
|
|
97120
|
-
|
|
97113
|
+
if (typeof data !== "object" || data === null) return null;
|
|
97114
|
+
if ("connected" in data && data.connected === true && "generationId" in data && typeof data.generationId === "string") {
|
|
97115
|
+
const generationId = data.generationId.trim();
|
|
97116
|
+
return generationId.length > 0 ? generationId : null;
|
|
97117
|
+
}
|
|
97118
|
+
if (!("account" in data) || typeof data.account !== "object" || data.account === null) return null;
|
|
97119
|
+
const account = data.account;
|
|
97120
|
+
if (!("credentialGenerationId" in account) || typeof account.credentialGenerationId !== "string") return null;
|
|
97121
|
+
const generationId = account.credentialGenerationId.trim();
|
|
97121
97122
|
return generationId.length > 0 ? generationId : null;
|
|
97122
97123
|
}
|
|
97123
97124
|
function extractClaudeProviderAccountId(response) {
|
|
97124
|
-
const generationId = extractClaudeCredentialGenerationId(response);
|
|
97125
|
-
if (generationId !== null) return generationId;
|
|
97126
97125
|
if (typeof response !== "object" || response === null || !("data" in response)) return null;
|
|
97127
97126
|
const data = response.data;
|
|
97128
|
-
if (typeof data !== "object" || data === null
|
|
97127
|
+
if (typeof data !== "object" || data === null) return null;
|
|
97128
|
+
if ("connected" in data && data.connected === true) return extractClaudeCredentialGenerationId(response);
|
|
97129
|
+
if (!("account" in data)) return null;
|
|
97129
97130
|
const account = data.account;
|
|
97130
97131
|
if (typeof account !== "object" || account === null || !("providerAccountId" in account) || typeof account.providerAccountId !== "string") return null;
|
|
97131
97132
|
const providerAccountId = account.providerAccountId.trim();
|
|
@@ -97153,7 +97154,7 @@ async function publishClaudeUsageAfterSync(input) {
|
|
|
97153
97154
|
path: input.auth.path === AUTH_RUNTIME_CLAUDE_CREDENTIAL_PATH ? AUTH_RUNTIME_CLAUDE_USAGE_PATH : USER_CLAUDE_USAGE_PATH,
|
|
97154
97155
|
body: {
|
|
97155
97156
|
providerAccountId: input.providerAccountId,
|
|
97156
|
-
credentialGenerationId: input.
|
|
97157
|
+
credentialGenerationId: input.credentialGenerationId,
|
|
97157
97158
|
accountEmail: input.accountEmail,
|
|
97158
97159
|
accountDisplayName: input.accountDisplayName,
|
|
97159
97160
|
planType: input.planType,
|
|
@@ -97170,11 +97171,13 @@ async function publishClaudeUsageAfterSync(input) {
|
|
|
97170
97171
|
}
|
|
97171
97172
|
async function finalizeClaudeCredentialSync(input) {
|
|
97172
97173
|
const providerAccountId = extractClaudeProviderAccountId(input.response);
|
|
97173
|
-
|
|
97174
|
-
if (
|
|
97174
|
+
const credentialGenerationId = extractClaudeCredentialGenerationId(input.response);
|
|
97175
|
+
if (providerAccountId === null || credentialGenerationId === null) return null;
|
|
97176
|
+
if (input.auth.path === USER_CLAUDE_CREDENTIAL_PATH) setLocalClaudeUsageGeneration(credentialGenerationId);
|
|
97175
97177
|
return publishClaudeUsageAfterSync({
|
|
97176
97178
|
auth: input.auth,
|
|
97177
97179
|
providerAccountId,
|
|
97180
|
+
credentialGenerationId,
|
|
97178
97181
|
accountEmail: input.accountEmail,
|
|
97179
97182
|
accountDisplayName: input.accountDisplayName,
|
|
97180
97183
|
planType: input.planType,
|
|
@@ -203517,7 +203520,7 @@ const collectStreamAsString = (stream) => stream.pipe(decodeText$1(), runFold(()
|
|
|
203517
203520
|
//#region src/orchestration/WorkerPlanCodexTools.ts
|
|
203518
203521
|
const FORGE_PROPOSE_WORKER_TASKS_TOOL = "forge_propose_worker_tasks";
|
|
203519
203522
|
const MAX_WORKER_PLAN_ITEMS = 5;
|
|
203520
|
-
function asRecord$
|
|
203523
|
+
function asRecord$9(value) {
|
|
203521
203524
|
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
|
|
203522
203525
|
}
|
|
203523
203526
|
function readTrimmedString(value) {
|
|
@@ -203533,7 +203536,7 @@ function isValidWorkerSummary(value) {
|
|
|
203533
203536
|
return value !== void 0 && value.length > 0 && value.length <= 4e3;
|
|
203534
203537
|
}
|
|
203535
203538
|
function decodeWorkerPlanItem(value) {
|
|
203536
|
-
const item = asRecord$
|
|
203539
|
+
const item = asRecord$9(value);
|
|
203537
203540
|
const slug = readTrimmedString(item?.slug);
|
|
203538
203541
|
const title = readTrimmedString(item?.title);
|
|
203539
203542
|
const summary = readTrimmedString(item?.summary);
|
|
@@ -203597,7 +203600,7 @@ function createWorkerPlanDynamicTools() {
|
|
|
203597
203600
|
function createWorkerPlanDynamicToolHandler() {
|
|
203598
203601
|
return async (input) => {
|
|
203599
203602
|
if (input.tool !== "forge_propose_worker_tasks") throw new Error(`Unsupported worker-plan tool: ${input.tool}`);
|
|
203600
|
-
if (!decodeWorkerPlanItems(asRecord$
|
|
203603
|
+
if (!decodeWorkerPlanItems(asRecord$9(input.arguments)?.items)) throw new Error("Worker plans require one to five unique, fully described items.");
|
|
203601
203604
|
return {
|
|
203602
203605
|
success: true,
|
|
203603
203606
|
contentItems: [{
|
|
@@ -205315,25 +205318,25 @@ const AUTH_METHOD_CONTAINER_KEYS = [
|
|
|
205315
205318
|
/** Lift an unknown value into `Option<string>` if it is a non-empty string. */
|
|
205316
205319
|
const asNonEmptyString = (v) => typeof v === "string" && v.length > 0 ? some(v) : none$4();
|
|
205317
205320
|
/** Lift an unknown value into `Option<Record>` if it is a plain object. */
|
|
205318
|
-
const asRecord$
|
|
205321
|
+
const asRecord$8 = (v) => typeof v === "object" && v !== null && !globalThis.Array.isArray(v) ? some(v) : none$4();
|
|
205319
205322
|
/**
|
|
205320
205323
|
* Walk an unknown parsed JSON value looking for a subscription/plan
|
|
205321
205324
|
* identifier, returning the first match as an `Option`.
|
|
205322
205325
|
*/
|
|
205323
205326
|
function findSubscriptionType(value) {
|
|
205324
205327
|
if (globalThis.Array.isArray(value)) return firstSomeOf(value.map(findSubscriptionType));
|
|
205325
|
-
return asRecord$
|
|
205328
|
+
return asRecord$8(value).pipe(flatMap$2((record) => {
|
|
205326
205329
|
const direct = firstSomeOf(SUBSCRIPTION_TYPE_KEYS.map((key) => asNonEmptyString(record[key])));
|
|
205327
205330
|
if (isSome(direct)) return direct;
|
|
205328
|
-
return firstSomeOf(SUBSCRIPTION_CONTAINER_KEYS.map((key) => asRecord$
|
|
205331
|
+
return firstSomeOf(SUBSCRIPTION_CONTAINER_KEYS.map((key) => asRecord$8(record[key]).pipe(flatMap$2(findSubscriptionType))));
|
|
205329
205332
|
}));
|
|
205330
205333
|
}
|
|
205331
205334
|
function findAuthMethod(value) {
|
|
205332
205335
|
if (globalThis.Array.isArray(value)) return firstSomeOf(value.map(findAuthMethod));
|
|
205333
|
-
return asRecord$
|
|
205336
|
+
return asRecord$8(value).pipe(flatMap$2((record) => {
|
|
205334
205337
|
const direct = firstSomeOf(AUTH_METHOD_KEYS.map((key) => asNonEmptyString(record[key])));
|
|
205335
205338
|
if (isSome(direct)) return direct;
|
|
205336
|
-
return firstSomeOf(AUTH_METHOD_CONTAINER_KEYS.map((key) => asRecord$
|
|
205339
|
+
return firstSomeOf(AUTH_METHOD_CONTAINER_KEYS.map((key) => asRecord$8(record[key]).pipe(flatMap$2(findAuthMethod))));
|
|
205337
205340
|
}));
|
|
205338
205341
|
}
|
|
205339
205342
|
/**
|
|
@@ -206481,7 +206484,7 @@ function userInputQuestionsFromToolInput(toolInput) {
|
|
|
206481
206484
|
return (Array.isArray(toolInput.questions) ? toolInput.questions : []).map((question, idx) => userInputQuestionFromUnknown(question, idx));
|
|
206482
206485
|
}
|
|
206483
206486
|
function userInputQuestionFromUnknown(question, idx) {
|
|
206484
|
-
const value = asRecord$
|
|
206487
|
+
const value = asRecord$7(question) ?? {};
|
|
206485
206488
|
return {
|
|
206486
206489
|
id: typeof value.header === "string" ? value.header : `q-${idx}`,
|
|
206487
206490
|
header: typeof value.header === "string" ? value.header : `Question ${idx + 1}`,
|
|
@@ -206491,13 +206494,13 @@ function userInputQuestionFromUnknown(question, idx) {
|
|
|
206491
206494
|
};
|
|
206492
206495
|
}
|
|
206493
206496
|
function userInputOptionFromUnknown(option) {
|
|
206494
|
-
const value = asRecord$
|
|
206497
|
+
const value = asRecord$7(option) ?? {};
|
|
206495
206498
|
return {
|
|
206496
206499
|
label: typeof value.label === "string" ? value.label : "",
|
|
206497
206500
|
description: typeof value.description === "string" ? value.description : ""
|
|
206498
206501
|
};
|
|
206499
206502
|
}
|
|
206500
|
-
function asRecord$
|
|
206503
|
+
function asRecord$7(value) {
|
|
206501
206504
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
206502
206505
|
}
|
|
206503
206506
|
function permissionResultFromDecision(decision, toolInput, suggestions) {
|
|
@@ -207304,7 +207307,7 @@ const makeClaudeAdapter = fn$1("makeClaudeAdapter")(function* (options) {
|
|
|
207304
207307
|
const updateResumeCursor = fn$1("updateResumeCursor")(function* (context) {
|
|
207305
207308
|
const threadId = context.session.threadId;
|
|
207306
207309
|
if (!threadId) return;
|
|
207307
|
-
const providerDeliveryBinding = readProviderDeliveryBinding(asRecord$
|
|
207310
|
+
const providerDeliveryBinding = readProviderDeliveryBinding(asRecord$7(context.session.resumeCursor)?.providerDeliveryBinding);
|
|
207308
207311
|
const resumeCursor = {
|
|
207309
207312
|
threadId,
|
|
207310
207313
|
...context.resumeSessionId ? { resume: context.resumeSessionId } : {},
|
|
@@ -212370,7 +212373,7 @@ function makeAcpContentDeltaEvent(input) {
|
|
|
212370
212373
|
}
|
|
212371
212374
|
//#endregion
|
|
212372
212375
|
//#region ../../packages/shared/src/toolActivity.ts
|
|
212373
|
-
function asRecord$
|
|
212376
|
+
function asRecord$6(value) {
|
|
212374
212377
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
212375
212378
|
}
|
|
212376
212379
|
function asTrimmedString(value) {
|
|
@@ -212396,10 +212399,10 @@ function extractCommandFromTitle$1(title) {
|
|
|
212396
212399
|
return /`([^`]+)`/u.exec(title)?.[1]?.trim() || void 0;
|
|
212397
212400
|
}
|
|
212398
212401
|
function extractToolCommand(data, title) {
|
|
212399
|
-
const item = asRecord$
|
|
212400
|
-
const itemInput = asRecord$
|
|
212401
|
-
const itemResult = asRecord$
|
|
212402
|
-
const rawInput = asRecord$
|
|
212402
|
+
const item = asRecord$6(data?.item);
|
|
212403
|
+
const itemInput = asRecord$6(item?.input);
|
|
212404
|
+
const itemResult = asRecord$6(item?.result);
|
|
212405
|
+
const rawInput = asRecord$6(data?.rawInput);
|
|
212403
212406
|
const direct = [
|
|
212404
212407
|
normalizeCommandValue$1(item?.command),
|
|
212405
212408
|
normalizeCommandValue$1(itemInput?.command),
|
|
@@ -212427,7 +212430,7 @@ function collectPaths(value, paths, seen, depth) {
|
|
|
212427
212430
|
}
|
|
212428
212431
|
return;
|
|
212429
212432
|
}
|
|
212430
|
-
const record = asRecord$
|
|
212433
|
+
const record = asRecord$6(value);
|
|
212431
212434
|
if (!record) return;
|
|
212432
212435
|
for (const key of [
|
|
212433
212436
|
"path",
|
|
@@ -212486,7 +212489,7 @@ function deriveToolActivityPresentation(input) {
|
|
|
212486
212489
|
const title = asTrimmedString(input.title);
|
|
212487
212490
|
const detail = stripTrailingExitCode(asTrimmedString(input.detail));
|
|
212488
212491
|
const fallbackSummary = asTrimmedString(input.fallbackSummary) ?? "Tool";
|
|
212489
|
-
const data = asRecord$
|
|
212492
|
+
const data = asRecord$6(input.data);
|
|
212490
212493
|
const command = extractToolCommand(data, title);
|
|
212491
212494
|
const primaryPath = extractPrimaryPath(data);
|
|
212492
212495
|
const action = classifyToolAction({
|
|
@@ -212510,7 +212513,7 @@ function deriveToolActivityPresentation(input) {
|
|
|
212510
212513
|
...primaryPath ? { detail: primaryPath } : {}
|
|
212511
212514
|
};
|
|
212512
212515
|
if (action === "search") {
|
|
212513
|
-
const query = asTrimmedString(asRecord$
|
|
212516
|
+
const query = asTrimmedString(asRecord$6(data?.rawInput)?.query) ?? asTrimmedString(asRecord$6(data?.rawInput)?.pattern) ?? asTrimmedString(asRecord$6(data?.rawInput)?.searchTerm);
|
|
212514
212517
|
return {
|
|
212515
212518
|
summary: "Searched files",
|
|
212516
212519
|
...query ? { detail: query } : {}
|
|
@@ -278901,7 +278904,7 @@ function makeApprovedWorkerPlanEventState() {
|
|
|
278901
278904
|
function promptKey(masterThreadId, promptId) {
|
|
278902
278905
|
return `${masterThreadId}\n${promptId}`;
|
|
278903
278906
|
}
|
|
278904
|
-
function asRecord$
|
|
278907
|
+
function asRecord$5(value) {
|
|
278905
278908
|
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
|
|
278906
278909
|
}
|
|
278907
278910
|
function exactMaterializedTaskIds(value, expectedCount) {
|
|
@@ -278911,7 +278914,7 @@ function exactMaterializedTaskIds(value, expectedCount) {
|
|
|
278911
278914
|
}
|
|
278912
278915
|
function readyBatchFromActivity(state, event) {
|
|
278913
278916
|
if (event.payload.activity.kind !== "plan.task-creation.batch-succeeded") return null;
|
|
278914
|
-
const payload = asRecord$
|
|
278917
|
+
const payload = asRecord$5(event.payload.activity.payload);
|
|
278915
278918
|
const promptId = payload?.["promptId"];
|
|
278916
278919
|
if (typeof promptId !== "string") return null;
|
|
278917
278920
|
const key = promptKey(event.payload.threadId, promptId);
|
|
@@ -280049,7 +280052,7 @@ function runtimeGrantNeedsRefresh(token, identity, nowSeconds = Math.floor(Date.
|
|
|
280049
280052
|
return claims.expiresAtSeconds - nowSeconds <= RUNTIME_GRANT_REFRESH_SKEW_SECONDS;
|
|
280050
280053
|
}
|
|
280051
280054
|
/** Narrow an unknown to a plain object, or null. */
|
|
280052
|
-
function asRecord$
|
|
280055
|
+
function asRecord$4(value) {
|
|
280053
280056
|
return value !== null && typeof value === "object" ? value : null;
|
|
280054
280057
|
}
|
|
280055
280058
|
/** The raw (untrimmed) string when it is present and not blank, else null. */
|
|
@@ -280061,7 +280064,7 @@ function asTimestamp(value) {
|
|
|
280061
280064
|
return typeof value === "string" && Number.isFinite(Date.parse(value)) ? value : null;
|
|
280062
280065
|
}
|
|
280063
280066
|
function parseRuntimeGrantRefreshResponse(runtimeId, value) {
|
|
280064
|
-
const data = asRecord$
|
|
280067
|
+
const data = asRecord$4(asRecord$4(value)?.data);
|
|
280065
280068
|
if (!data || data.runtimeId !== runtimeId) return null;
|
|
280066
280069
|
const grantToken = asNonBlankString(data.grantToken);
|
|
280067
280070
|
const expiresAt = asTimestamp(data.expiresAt);
|
|
@@ -296157,6 +296160,74 @@ const LocalAutomationSchedulerLive = effectDiscard(gen(function* () {
|
|
|
296157
296160
|
yield* forkScoped(startup.awaitCommandReady.pipe(andThen(forever$1(tick.pipe(andThen(sleep$4("60 seconds")))))));
|
|
296158
296161
|
}));
|
|
296159
296162
|
//#endregion
|
|
296163
|
+
//#region src/command/providerUsageEnvironment.ts
|
|
296164
|
+
function asRecord$3(value) {
|
|
296165
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
296166
|
+
}
|
|
296167
|
+
function positiveInteger(value) {
|
|
296168
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : null;
|
|
296169
|
+
}
|
|
296170
|
+
function readEnvironmentId(value) {
|
|
296171
|
+
return typeof value === "string" && value.trim() !== "" ? value : null;
|
|
296172
|
+
}
|
|
296173
|
+
function readEligibleStatus(value) {
|
|
296174
|
+
return value === "running" || value === "suspended" ? value : null;
|
|
296175
|
+
}
|
|
296176
|
+
function isOwnedRuntime(row, ownerUserId) {
|
|
296177
|
+
return positiveInteger(row["userId"]) === ownerUserId;
|
|
296178
|
+
}
|
|
296179
|
+
function readRuntimeId(row) {
|
|
296180
|
+
const runtimeId = row["runtimeId"];
|
|
296181
|
+
return typeof runtimeId === "string" && runtimeId.trim() !== "" ? runtimeId : null;
|
|
296182
|
+
}
|
|
296183
|
+
function readCandidate(runtime, ownerUserId) {
|
|
296184
|
+
const row = asRecord$3(runtime);
|
|
296185
|
+
if (row === null || !isOwnedRuntime(row, ownerUserId) || row["desiredState"] !== "running") return null;
|
|
296186
|
+
const organizationId = positiveInteger(row["organizationId"]);
|
|
296187
|
+
const environmentId = readEnvironmentId(row["environmentId"]);
|
|
296188
|
+
const runtimeId = readRuntimeId(row);
|
|
296189
|
+
const status = readEligibleStatus(row["status"]);
|
|
296190
|
+
if (organizationId === null || environmentId === null || runtimeId === null || status === null) return null;
|
|
296191
|
+
return {
|
|
296192
|
+
organizationId,
|
|
296193
|
+
environmentId,
|
|
296194
|
+
runtimeId,
|
|
296195
|
+
status
|
|
296196
|
+
};
|
|
296197
|
+
}
|
|
296198
|
+
function candidateKey(candidate) {
|
|
296199
|
+
return `${candidate.organizationId}:${candidate.environmentId ?? ""}`;
|
|
296200
|
+
}
|
|
296201
|
+
function statusRank(status) {
|
|
296202
|
+
return status === "running" ? 0 : 1;
|
|
296203
|
+
}
|
|
296204
|
+
function deduplicateCandidates(candidates) {
|
|
296205
|
+
const byEnvironment = /* @__PURE__ */ new Map();
|
|
296206
|
+
for (const candidate of candidates) {
|
|
296207
|
+
const key = candidateKey(candidate);
|
|
296208
|
+
const existing = byEnvironment.get(key);
|
|
296209
|
+
if (existing === void 0 || statusRank(candidate.status) < statusRank(existing.status)) byEnvironment.set(key, candidate);
|
|
296210
|
+
}
|
|
296211
|
+
return [...byEnvironment.values()];
|
|
296212
|
+
}
|
|
296213
|
+
/**
|
|
296214
|
+
* Selects one authenticated owner's Environment from CMMD's projectless runtime
|
|
296215
|
+
* catalog. A tied best candidate fails closed, so Forge never chooses an
|
|
296216
|
+
* organization from browser input.
|
|
296217
|
+
*/
|
|
296218
|
+
function selectProviderUsageEnvironment(rawCatalog, ownerUserId) {
|
|
296219
|
+
const runtimes = asRecord$3(asRecord$3(rawCatalog)?.["data"])?.["runtimes"];
|
|
296220
|
+
if (!Array.isArray(runtimes)) return { kind: "unavailable" };
|
|
296221
|
+
const candidates = deduplicateCandidates(runtimes.map((runtime) => readCandidate(runtime, ownerUserId)).filter((candidate) => candidate !== null));
|
|
296222
|
+
const bestRank = Math.min(...candidates.map((candidate) => statusRank(candidate.status)));
|
|
296223
|
+
const bestCandidates = candidates.filter((candidate) => statusRank(candidate.status) === bestRank);
|
|
296224
|
+
if (bestCandidates.length !== 1) return { kind: "unavailable" };
|
|
296225
|
+
return {
|
|
296226
|
+
kind: "ready",
|
|
296227
|
+
organizationId: bestCandidates[0].organizationId
|
|
296228
|
+
};
|
|
296229
|
+
}
|
|
296230
|
+
//#endregion
|
|
296160
296231
|
//#region src/command/wsToken.ts
|
|
296161
296232
|
/**
|
|
296162
296233
|
* Build the WS token response given an optional PAT and the configured CMMD
|
|
@@ -296193,13 +296264,13 @@ function resolveWsUrl(baseUrl) {
|
|
|
296193
296264
|
const callCmmdTool = legacyCmmdToolBridge.callTool;
|
|
296194
296265
|
const extractMcpToolText = legacyCmmdToolBridge.extractText;
|
|
296195
296266
|
const isCmmdMcpAuthError = legacyCmmdToolBridge.isAuthError;
|
|
296196
|
-
var ClaudeUsageReadError = class extends TaggedError("ClaudeUsageReadError") {};
|
|
296197
296267
|
/**
|
|
296198
296268
|
* CMMD-side path for the PROJECT-keyed Forge Cloud catalog. Shared by the list
|
|
296199
296269
|
* proxy, the SSE poll-and-emit proxy, and the register/unregister proxies so the
|
|
296200
296270
|
* upstream contract lives in exactly one place.
|
|
296201
296271
|
*/
|
|
296202
296272
|
const CMMD_CLOUD_PROJECTS_PATH = "/api/forge/context/cloud-projects";
|
|
296273
|
+
const CMMD_RUNTIMES_PATH = "/api/forge/context/runtimes";
|
|
296203
296274
|
/**
|
|
296204
296275
|
* Authenticate the browser session and resolve the CMMD JWT to forward
|
|
296205
296276
|
* upstream. Returns null when no token could be resolved, which every caller
|
|
@@ -296323,6 +296394,10 @@ const cmmdBillingSeriesRouteLayer = registerProxyRoute({
|
|
|
296323
296394
|
const cmmdRestUnavailable = () => new CmmdProxyAuthenticationRequiredError("CMMD connection required. Reconnect CMMD to continue.");
|
|
296324
296395
|
function runCmmdRestProxy(session, proxy, dependencies = {}) {
|
|
296325
296396
|
return gen(function* () {
|
|
296397
|
+
if (dependencies.jwt !== void 0) {
|
|
296398
|
+
const explicitJwt = dependencies.jwt;
|
|
296399
|
+
return yield* promise(() => (dependencies.runProxy ?? runProxy)(() => proxy(explicitJwt)));
|
|
296400
|
+
}
|
|
296326
296401
|
const resolveJwt = dependencies.resolveJwt ?? resolveCmmdJwtForSession;
|
|
296327
296402
|
const jwt = yield* resolveJwt({
|
|
296328
296403
|
sessionId: session.sessionId,
|
|
@@ -297863,59 +297938,6 @@ const cmmdSetProviderAccountDefaultRouteLayer = registerProxyRoute({
|
|
|
297863
297938
|
orgIdSource: "none",
|
|
297864
297939
|
responseShape: "unwrapData"
|
|
297865
297940
|
});
|
|
297866
|
-
const resolveConnectedClaudeGeneration = (session) => gen(function* () {
|
|
297867
|
-
const outcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
297868
|
-
method: "GET",
|
|
297869
|
-
jwt,
|
|
297870
|
-
path: "/api/forge/context/providers/claude/credential"
|
|
297871
|
-
}));
|
|
297872
|
-
if (!outcome.ok) return outcome;
|
|
297873
|
-
const state = unwrapForgeEnvelope(outcome.value);
|
|
297874
|
-
if (state === null || typeof state !== "object" || !("connected" in state) || state.connected !== true || !("generationId" in state) || typeof state.generationId !== "string") return {
|
|
297875
|
-
ok: true,
|
|
297876
|
-
value: null
|
|
297877
|
-
};
|
|
297878
|
-
return {
|
|
297879
|
-
ok: true,
|
|
297880
|
-
value: {
|
|
297881
|
-
generationId: state.generationId,
|
|
297882
|
-
generationHash: createHash("sha256").update(state.generationId).digest("hex")
|
|
297883
|
-
}
|
|
297884
|
-
};
|
|
297885
|
-
});
|
|
297886
|
-
/**
|
|
297887
|
-
* The GET path is read-only. The explicit per-account POST refresh invokes
|
|
297888
|
-
* this helper and propagates any CMMD forward failure to the caller.
|
|
297889
|
-
*/
|
|
297890
|
-
const forwardClaudeUsageTelemetry = (session, requestedProviderAccountId, activelyPoll = false, fetchClaudeUsage = fetchClaudeUsageViaOfficialClient) => gen(function* () {
|
|
297891
|
-
const credentialOutcome = yield* resolveConnectedClaudeGeneration(session);
|
|
297892
|
-
if (!credentialOutcome.ok) return credentialOutcome;
|
|
297893
|
-
if (credentialOutcome.value === null) return null;
|
|
297894
|
-
const { generationId, generationHash } = credentialOutcome.value;
|
|
297895
|
-
const providerAccountId = requestedProviderAccountId ?? generationId;
|
|
297896
|
-
const activeSnapshot = activelyPoll && providerAccountId === generationId ? yield* tryPromise({
|
|
297897
|
-
try: () => fetchClaudeUsage({ binaryPath: resolveClaudeBinaryPath("claude") }),
|
|
297898
|
-
catch: (cause) => new ClaudeUsageReadError({ cause })
|
|
297899
|
-
}).pipe(orElseSucceed(() => null)) : null;
|
|
297900
|
-
const snapshot = activeSnapshot ? {
|
|
297901
|
-
...activeSnapshot,
|
|
297902
|
-
observedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
297903
|
-
} : getLatestClaudeRateLimitTelemetry(generationHash, providerAccountId);
|
|
297904
|
-
if (!snapshot) return null;
|
|
297905
|
-
return yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
297906
|
-
method: "POST",
|
|
297907
|
-
jwt,
|
|
297908
|
-
path: "/api/forge/context/providers/usage/claude/telemetry",
|
|
297909
|
-
body: {
|
|
297910
|
-
providerAccountId,
|
|
297911
|
-
credentialGenerationId: generationId,
|
|
297912
|
-
source: activeSnapshot ? "active_poll" : "passive_sdk_telemetry",
|
|
297913
|
-
fiveHour: snapshot.fiveHour,
|
|
297914
|
-
sevenDay: snapshot.sevenDay,
|
|
297915
|
-
observedAt: snapshot.observedAt
|
|
297916
|
-
}
|
|
297917
|
-
}));
|
|
297918
|
-
});
|
|
297919
297941
|
const cmmdGetProviderUsageRouteLayer = add$1("GET", "/api/cmmd/providers/usage", gen(function* () {
|
|
297920
297942
|
const request = yield* HttpServerRequest;
|
|
297921
297943
|
const outcome = yield* runCmmdRestProxy(yield* (yield* ServerAuth).authenticateHttpRequest(request), (jwt) => cmmdGateway.request({
|
|
@@ -297936,15 +297958,62 @@ function parseProviderUsageRefreshInput(rawBody) {
|
|
|
297936
297958
|
providerAccountId: body.providerAccountId
|
|
297937
297959
|
};
|
|
297938
297960
|
}
|
|
297939
|
-
|
|
297940
|
-
const
|
|
297941
|
-
const
|
|
297942
|
-
|
|
297943
|
-
|
|
297944
|
-
|
|
297945
|
-
|
|
297946
|
-
|
|
297947
|
-
|
|
297961
|
+
function resolveProviderUsageOwnerUserId(session) {
|
|
297962
|
+
const identity = readCmmdUserIdentityForSession(session.sessionId);
|
|
297963
|
+
const userId = identity === null ? NaN : Number(identity.id);
|
|
297964
|
+
return Number.isSafeInteger(userId) && userId > 0 ? userId : null;
|
|
297965
|
+
}
|
|
297966
|
+
function buildClaudeUsageRefreshErrorResponse(error) {
|
|
297967
|
+
return jsonUnsafe({
|
|
297968
|
+
error: "Claude usage refresh is unavailable.",
|
|
297969
|
+
code: "CLAUDE_USAGE_REFRESH_UNAVAILABLE"
|
|
297970
|
+
}, { status: error instanceof CmmdProxyRequestError && error.status === 503 ? 503 : 502 });
|
|
297971
|
+
}
|
|
297972
|
+
function makeRefreshProviderUsageHandler(dependencies = {}) {
|
|
297973
|
+
return gen(function* () {
|
|
297974
|
+
const request = yield* HttpServerRequest;
|
|
297975
|
+
const session = yield* (yield* ServerAuth).authenticateHttpRequest(request);
|
|
297976
|
+
const input = parseProviderUsageRefreshInput(yield* request.json);
|
|
297977
|
+
if (input === null) return jsonUnsafe({ error: "provider and providerAccountId must identify a connected provider account" }, { status: 400 });
|
|
297978
|
+
if (input.provider === "claude") {
|
|
297979
|
+
const requestJwt = yield* (dependencies.resolveJwt ?? resolveCmmdJwtForSession)({
|
|
297980
|
+
sessionId: session.sessionId,
|
|
297981
|
+
subject: session.subject,
|
|
297982
|
+
logPrefix: "claude-usage-refresh"
|
|
297983
|
+
});
|
|
297984
|
+
if (!requestJwt) return buildClaudeUsageRefreshErrorResponse(/* @__PURE__ */ new Error("CMMD authentication required."));
|
|
297985
|
+
const ownerUserId = resolveProviderUsageOwnerUserId(session);
|
|
297986
|
+
if (ownerUserId === null) return jsonUnsafe({
|
|
297987
|
+
error: "CMMD owner identity is unavailable for Claude usage refresh.",
|
|
297988
|
+
code: "CLAUDE_USAGE_ENVIRONMENT_UNAVAILABLE"
|
|
297989
|
+
}, { status: 503 });
|
|
297990
|
+
const catalogOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
297991
|
+
method: "GET",
|
|
297992
|
+
jwt,
|
|
297993
|
+
path: CMMD_RUNTIMES_PATH
|
|
297994
|
+
}), { jwt: requestJwt });
|
|
297995
|
+
if (!catalogOutcome.ok) return buildClaudeUsageRefreshErrorResponse(catalogOutcome.error);
|
|
297996
|
+
const target = selectProviderUsageEnvironment(catalogOutcome.value, ownerUserId);
|
|
297997
|
+
if (target.kind === "unavailable") return jsonUnsafe({
|
|
297998
|
+
error: "No owned Environment with running intent is available for Claude usage refresh.",
|
|
297999
|
+
code: "CLAUDE_USAGE_ENVIRONMENT_UNAVAILABLE"
|
|
298000
|
+
}, { status: 503 });
|
|
298001
|
+
const refreshOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
298002
|
+
method: "POST",
|
|
298003
|
+
jwt,
|
|
298004
|
+
path: "/api/forge/context/providers/usage/claude/refresh",
|
|
298005
|
+
body: { providerAccountId: input.providerAccountId },
|
|
298006
|
+
orgId: String(target.organizationId)
|
|
298007
|
+
}), { jwt: requestJwt });
|
|
298008
|
+
if (!refreshOutcome.ok) return buildClaudeUsageRefreshErrorResponse(refreshOutcome.error);
|
|
298009
|
+
const snapshotOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
298010
|
+
method: "GET",
|
|
298011
|
+
jwt,
|
|
298012
|
+
path: "/api/forge/context/providers/usage"
|
|
298013
|
+
}), { jwt: requestJwt });
|
|
298014
|
+
if (!snapshotOutcome.ok) return buildClaudeUsageRefreshErrorResponse(snapshotOutcome.error);
|
|
298015
|
+
return jsonUnsafe(unwrapForgeEnvelope(snapshotOutcome.value), { status: 200 });
|
|
298016
|
+
}
|
|
297948
298017
|
const refreshOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
297949
298018
|
method: "POST",
|
|
297950
298019
|
jwt,
|
|
@@ -297952,16 +298021,16 @@ const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/us
|
|
|
297952
298021
|
body: { providerAccountId: input.providerAccountId }
|
|
297953
298022
|
}));
|
|
297954
298023
|
if (!refreshOutcome.ok) return buildProxyErrorResponse(refreshOutcome.error);
|
|
297955
|
-
|
|
297956
|
-
|
|
297957
|
-
|
|
297958
|
-
|
|
297959
|
-
|
|
297960
|
-
|
|
297961
|
-
|
|
297962
|
-
|
|
297963
|
-
|
|
297964
|
-
|
|
298024
|
+
const snapshotOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
298025
|
+
method: "GET",
|
|
298026
|
+
jwt,
|
|
298027
|
+
path: "/api/forge/context/providers/usage"
|
|
298028
|
+
}));
|
|
298029
|
+
if (!snapshotOutcome.ok) return buildProxyErrorResponse(snapshotOutcome.error);
|
|
298030
|
+
return jsonUnsafe(unwrapForgeEnvelope(snapshotOutcome.value), { status: 200 });
|
|
298031
|
+
}).pipe(catchTag("AuthError", (error) => respondToAuthError(error)));
|
|
298032
|
+
}
|
|
298033
|
+
const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/usage/refresh", makeRefreshProviderUsageHandler());
|
|
297965
298034
|
const cmmdGetUserCodexCredentialRouteLayer = registerProxyRoute({
|
|
297966
298035
|
forgePath: "/api/cmmd/providers/codex/credential",
|
|
297967
298036
|
method: "GET",
|
|
@@ -308993,6 +309062,82 @@ const claudeNativeGenerationProofRouteLayer = add$1("GET", "/api/runtime/provide
|
|
|
308993
309062
|
generationHash: yield* readUsableClaudeGenerationHash(config)
|
|
308994
309063
|
});
|
|
308995
309064
|
}));
|
|
309065
|
+
const defaultClaudeUsageRouteDependencies = {
|
|
309066
|
+
readCredential: async (token) => {
|
|
309067
|
+
const base = process.env.FORGE_CMMD_RUNTIME_CONTROL_PLANE_URL?.trim() ?? "";
|
|
309068
|
+
if (!base) return null;
|
|
309069
|
+
const response = await fetch(`${base.replace(/\/+$/u, "")}/api/forge/context/auth-runtime-claude-credential`, {
|
|
309070
|
+
headers: {
|
|
309071
|
+
authorization: `Bearer ${token}`,
|
|
309072
|
+
accept: "application/json"
|
|
309073
|
+
},
|
|
309074
|
+
signal: AbortSignal.timeout(2e4)
|
|
309075
|
+
});
|
|
309076
|
+
return response.ok ? response.text() : null;
|
|
309077
|
+
},
|
|
309078
|
+
createDirectory: () => mkdtemp(join(tmpdir(), "forge-claude-usage-")),
|
|
309079
|
+
writeCredential: (directory, credential) => writeFile(join(directory, ".credentials.json"), credential, { mode: 384 }),
|
|
309080
|
+
loadUsage: (directory) => fetchClaudeUsageViaOfficialClient({
|
|
309081
|
+
binaryPath: resolveClaudeBinaryPath("claude"),
|
|
309082
|
+
claudeConfigDir: directory
|
|
309083
|
+
}),
|
|
309084
|
+
removeDirectory: (directory) => rm(directory, {
|
|
309085
|
+
recursive: true,
|
|
309086
|
+
force: false
|
|
309087
|
+
}),
|
|
309088
|
+
now: () => /* @__PURE__ */ new Date()
|
|
309089
|
+
};
|
|
309090
|
+
const claudeUsageHandler = (dependencies) => gen(function* () {
|
|
309091
|
+
const request = yield* HttpServerRequest;
|
|
309092
|
+
const config = yield* ServerConfig;
|
|
309093
|
+
const token = claudeReadinessToken(request.headers.authorization);
|
|
309094
|
+
const required = completeClaudeReadinessExpectations(config);
|
|
309095
|
+
if (!token || !required) return unauthorizedClaudeReadinessResponse();
|
|
309096
|
+
const claims = verifyCmmdClaudeUsageTicket(token, required);
|
|
309097
|
+
if (!claims) return unauthorizedClaudeReadinessResponse();
|
|
309098
|
+
const claimed = claimClaudeReadinessJti({
|
|
309099
|
+
jti: claims.jti,
|
|
309100
|
+
expiresAtSeconds: claims.expiresAtSeconds,
|
|
309101
|
+
nowSeconds: Math.floor(Date.now() / 1e3)
|
|
309102
|
+
});
|
|
309103
|
+
if (claimed === "replayed") return unauthorizedClaudeReadinessResponse();
|
|
309104
|
+
if (claimed === "capacity_exhausted") return jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
|
|
309105
|
+
return yield* promise(async () => {
|
|
309106
|
+
let directory = null;
|
|
309107
|
+
let response = jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
|
|
309108
|
+
try {
|
|
309109
|
+
directory = await dependencies.createDirectory();
|
|
309110
|
+
const credentialJson = await dependencies.readCredential(token);
|
|
309111
|
+
if (credentialJson !== null && isClaudeSubscriptionCredential(credentialJson)) {
|
|
309112
|
+
await dependencies.writeCredential(directory, credentialJson);
|
|
309113
|
+
const usage = await dependencies.loadUsage(directory);
|
|
309114
|
+
response = jsonUnsafe({
|
|
309115
|
+
fiveHour: usage.fiveHour,
|
|
309116
|
+
sevenDay: usage.sevenDay,
|
|
309117
|
+
observedAt: dependencies.now().toISOString(),
|
|
309118
|
+
receipt: {
|
|
309119
|
+
orgId: claims.orgId,
|
|
309120
|
+
userId: claims.userId,
|
|
309121
|
+
runtimeId: claims.runtimeId,
|
|
309122
|
+
machineId: claims.machineId,
|
|
309123
|
+
credentialEpoch: claims.credentialEpoch,
|
|
309124
|
+
providerAccountId: claims.providerAccountId,
|
|
309125
|
+
credentialGenerationId: claims.generationId
|
|
309126
|
+
}
|
|
309127
|
+
}, { headers: { "cache-control": "no-store" } });
|
|
309128
|
+
}
|
|
309129
|
+
} catch {}
|
|
309130
|
+
if (directory === null) return response;
|
|
309131
|
+
try {
|
|
309132
|
+
await dependencies.removeDirectory(directory);
|
|
309133
|
+
} catch {
|
|
309134
|
+
return jsonUnsafe({ error: "temporarily_unavailable" }, { status: 503 });
|
|
309135
|
+
}
|
|
309136
|
+
return response;
|
|
309137
|
+
});
|
|
309138
|
+
});
|
|
309139
|
+
const createClaudeUsageRouteLayer = (dependencies = defaultClaudeUsageRouteDependencies) => add$1("POST", "/api/runtime/provider-usage/claude", claudeUsageHandler(dependencies));
|
|
309140
|
+
const claudeUsageRouteLayer = createClaudeUsageRouteLayer();
|
|
308996
309141
|
/**
|
|
308997
309142
|
* FINDING-CB1 — workspace readiness SSE endpoint.
|
|
308998
309143
|
*
|
|
@@ -309336,7 +309481,7 @@ const MiscRuntimeLayerLive = mergeAll(AnalyticsServiceLayerLive, OpenLive, Serve
|
|
|
309336
309481
|
const RuntimeDependenciesWithoutPullRequestsLive = ReactorLayerLive.pipe(provideMerge(CheckpointingLayerLive), provideMerge(GitLayerLive), provideMerge(OrchestrationLayerLive), provideMerge(ProviderLayerLive), provideMerge(TerminalLayerLive), provideMerge(AgentBrowserManagerLive), provideMerge(mergeAll(ThreadDevRuntimeLive, DevTunnelLive.pipe(provide$1(ThreadDevRuntimeLive)))), provideMerge(PersistenceLayerLive), provideMerge(KeybindingsLive), provideMerge(ProviderRegistryLive), provideMerge(mergeAll(ServerSettingsLive, UsageServiceLive.pipe(provide$1(ServerSettingsLive)))), provideMerge(WorkspaceLayerLive), provideMerge(WorkspaceReadinessStateLive), provideMerge(ProjectFaviconResolverLive), provideMerge(RepositoryIdentityResolverLive), provideMerge(ServerEnvironmentLive), provideMerge(AuthLayerLive), provideMerge(ServerSecretStoreLayerLive), provideMerge(mergeAll(CloudRedisCoordinationLive, CloudStateSyncLive.pipe(provide$1(PersistenceLayerLive)))), provideMerge(MiscRuntimeLayerLive));
|
|
309337
309482
|
const RuntimeDependenciesLive = pullRequestServiceFactoryLayer.pipe(provideMerge(RuntimeDependenciesWithoutPullRequestsLive), provideMerge(cmmdProjectIdentityResolverLive.pipe(provide$1(RuntimeDependenciesWithoutPullRequestsLive))), provideMerge(pullRequestProviderRuntimeLive));
|
|
309338
309483
|
const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(provideMerge(RuntimeDependenciesLive));
|
|
309339
|
-
const makeRoutesLayer = 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(provide$1(browserApiCorsLayer));
|
|
309484
|
+
const makeRoutesLayer = 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(provide$1(browserApiCorsLayer));
|
|
309340
309485
|
const runServer = launch$1(unwrap(gen(function* () {
|
|
309341
309486
|
const config = yield* ServerConfig;
|
|
309342
309487
|
fixPath();
|