@cmmd-center/forge 0.9.12 → 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 +331 -140
- package/dist/bin.mjs +328 -138
- package/dist/client/assets/{CanvasPanel-CNtJjkFi.js → CanvasPanel-Dc8j2ouo.js} +2 -2
- package/dist/client/assets/{CompositeItem-BYLWaYF6.js → CompositeItem-Cn5DdObI.js} +2 -2
- package/dist/client/assets/{DiffPanel-BilYcllQ.js → DiffPanel-CRdkVPEz.js} +3 -3
- package/dist/client/assets/{DiffPanel.logic-Caky6F_f.js → DiffPanel.logic-BIPcNz_o.js} +2 -2
- package/dist/client/assets/DiffPanelShell-tIdXu7mn.js +2531 -0
- package/dist/client/assets/{DiffWorkerPoolProvider-CTUAka0e.js → DiffWorkerPoolProvider-tFSGuVfC.js} +51 -51
- package/dist/client/assets/PullRequestCodePanel-inwJYfZC.js +5 -0
- package/dist/client/assets/{Virtualizer-CFg_81uW.js → Virtualizer-DeKxnAeU.js} +2 -2
- package/dist/client/assets/{canvasStateStore-BdDORpO9.js → canvasStateStore-Dlm4tanv.js} +2 -2
- package/dist/client/assets/{cmmdAuthRedirect-CrxxHqHr.js → cmmdAuthRedirect-C1FjO86g.js} +2 -2
- package/dist/client/assets/index-4a61qSZ4.css +1 -0
- package/dist/client/assets/{index-BUY6pZDx.js → index-Bublmabf.js} +59 -59
- package/dist/client/assets/src-DljvAdHI.js +3 -0
- package/dist/client/assets/{toggle-BUlphA25.js → toggle-It2CvaLA.js} +2 -2
- package/dist/client/assets/{useTriggerFocusGuards-D2jbdUMe.js → useTriggerFocusGuards-DfUh9uvu.js} +2 -2
- package/dist/client/index.html +11 -11
- 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/DiffPanelShell-DXP_jwHj.js +0 -2531
- package/dist/client/assets/PullRequestCodePanel-4bf4PYHp.js +0 -5
- package/dist/client/assets/index-BydoCpMZ.css +0 -1
- package/dist/client/assets/src-Dqe_-4FQ.js +0 -3
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;
|
|
@@ -96825,6 +96820,7 @@ const runClaudeLogout = (runtime) => new Promise((resolve, reject) => {
|
|
|
96825
96820
|
const execFileAsync$4 = promisify$1(execFile);
|
|
96826
96821
|
const USAGE_ARGS = [
|
|
96827
96822
|
"--safe-mode",
|
|
96823
|
+
"--no-session-persistence",
|
|
96828
96824
|
"-p",
|
|
96829
96825
|
"/usage",
|
|
96830
96826
|
"--output-format",
|
|
@@ -96892,7 +96888,7 @@ function zonedDateTimeToUtc(input) {
|
|
|
96892
96888
|
}
|
|
96893
96889
|
}
|
|
96894
96890
|
function parseResetAt(value, now) {
|
|
96895
|
-
const match = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{1,2}) at (\d{1,2})(?::(\d{2}))?(am|pm) \(([^)]+)\)$/.exec(value);
|
|
96891
|
+
const match = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{1,2})(?:,| at) (\d{1,2})(?::(\d{2}))?(am|pm) \(([^)]+)\)$/.exec(value);
|
|
96896
96892
|
if (!match) return null;
|
|
96897
96893
|
const month = MONTH_BY_NAME[match[1]];
|
|
96898
96894
|
if (month === void 0) return null;
|
|
@@ -97114,17 +97110,23 @@ async function loadClaudeAccountMetadataFromCli(homePath) {
|
|
|
97114
97110
|
function extractClaudeCredentialGenerationId(response) {
|
|
97115
97111
|
if (typeof response !== "object" || response === null || !("data" in response)) return null;
|
|
97116
97112
|
const data = response.data;
|
|
97117
|
-
if (typeof data !== "object" || data === null
|
|
97118
|
-
if (
|
|
97119
|
-
|
|
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();
|
|
97120
97122
|
return generationId.length > 0 ? generationId : null;
|
|
97121
97123
|
}
|
|
97122
97124
|
function extractClaudeProviderAccountId(response) {
|
|
97123
|
-
const generationId = extractClaudeCredentialGenerationId(response);
|
|
97124
|
-
if (generationId !== null) return generationId;
|
|
97125
97125
|
if (typeof response !== "object" || response === null || !("data" in response)) return null;
|
|
97126
97126
|
const data = response.data;
|
|
97127
|
-
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;
|
|
97128
97130
|
const account = data.account;
|
|
97129
97131
|
if (typeof account !== "object" || account === null || !("providerAccountId" in account) || typeof account.providerAccountId !== "string") return null;
|
|
97130
97132
|
const providerAccountId = account.providerAccountId.trim();
|
|
@@ -97152,7 +97154,7 @@ async function publishClaudeUsageAfterSync(input) {
|
|
|
97152
97154
|
path: input.auth.path === AUTH_RUNTIME_CLAUDE_CREDENTIAL_PATH ? AUTH_RUNTIME_CLAUDE_USAGE_PATH : USER_CLAUDE_USAGE_PATH,
|
|
97153
97155
|
body: {
|
|
97154
97156
|
providerAccountId: input.providerAccountId,
|
|
97155
|
-
credentialGenerationId: input.
|
|
97157
|
+
credentialGenerationId: input.credentialGenerationId,
|
|
97156
97158
|
accountEmail: input.accountEmail,
|
|
97157
97159
|
accountDisplayName: input.accountDisplayName,
|
|
97158
97160
|
planType: input.planType,
|
|
@@ -97169,11 +97171,13 @@ async function publishClaudeUsageAfterSync(input) {
|
|
|
97169
97171
|
}
|
|
97170
97172
|
async function finalizeClaudeCredentialSync(input) {
|
|
97171
97173
|
const providerAccountId = extractClaudeProviderAccountId(input.response);
|
|
97172
|
-
|
|
97173
|
-
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);
|
|
97174
97177
|
return publishClaudeUsageAfterSync({
|
|
97175
97178
|
auth: input.auth,
|
|
97176
97179
|
providerAccountId,
|
|
97180
|
+
credentialGenerationId,
|
|
97177
97181
|
accountEmail: input.accountEmail,
|
|
97178
97182
|
accountDisplayName: input.accountDisplayName,
|
|
97179
97183
|
planType: input.planType,
|
|
@@ -203516,7 +203520,7 @@ const collectStreamAsString = (stream) => stream.pipe(decodeText$1(), runFold(()
|
|
|
203516
203520
|
//#region src/orchestration/WorkerPlanCodexTools.ts
|
|
203517
203521
|
const FORGE_PROPOSE_WORKER_TASKS_TOOL = "forge_propose_worker_tasks";
|
|
203518
203522
|
const MAX_WORKER_PLAN_ITEMS = 5;
|
|
203519
|
-
function asRecord$
|
|
203523
|
+
function asRecord$9(value) {
|
|
203520
203524
|
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
|
|
203521
203525
|
}
|
|
203522
203526
|
function readTrimmedString(value) {
|
|
@@ -203532,7 +203536,7 @@ function isValidWorkerSummary(value) {
|
|
|
203532
203536
|
return value !== void 0 && value.length > 0 && value.length <= 4e3;
|
|
203533
203537
|
}
|
|
203534
203538
|
function decodeWorkerPlanItem(value) {
|
|
203535
|
-
const item = asRecord$
|
|
203539
|
+
const item = asRecord$9(value);
|
|
203536
203540
|
const slug = readTrimmedString(item?.slug);
|
|
203537
203541
|
const title = readTrimmedString(item?.title);
|
|
203538
203542
|
const summary = readTrimmedString(item?.summary);
|
|
@@ -203596,7 +203600,7 @@ function createWorkerPlanDynamicTools() {
|
|
|
203596
203600
|
function createWorkerPlanDynamicToolHandler() {
|
|
203597
203601
|
return async (input) => {
|
|
203598
203602
|
if (input.tool !== "forge_propose_worker_tasks") throw new Error(`Unsupported worker-plan tool: ${input.tool}`);
|
|
203599
|
-
if (!decodeWorkerPlanItems(asRecord$
|
|
203603
|
+
if (!decodeWorkerPlanItems(asRecord$9(input.arguments)?.items)) throw new Error("Worker plans require one to five unique, fully described items.");
|
|
203600
203604
|
return {
|
|
203601
203605
|
success: true,
|
|
203602
203606
|
contentItems: [{
|
|
@@ -205314,25 +205318,25 @@ const AUTH_METHOD_CONTAINER_KEYS = [
|
|
|
205314
205318
|
/** Lift an unknown value into `Option<string>` if it is a non-empty string. */
|
|
205315
205319
|
const asNonEmptyString = (v) => typeof v === "string" && v.length > 0 ? some(v) : none$4();
|
|
205316
205320
|
/** Lift an unknown value into `Option<Record>` if it is a plain object. */
|
|
205317
|
-
const asRecord$
|
|
205321
|
+
const asRecord$8 = (v) => typeof v === "object" && v !== null && !globalThis.Array.isArray(v) ? some(v) : none$4();
|
|
205318
205322
|
/**
|
|
205319
205323
|
* Walk an unknown parsed JSON value looking for a subscription/plan
|
|
205320
205324
|
* identifier, returning the first match as an `Option`.
|
|
205321
205325
|
*/
|
|
205322
205326
|
function findSubscriptionType(value) {
|
|
205323
205327
|
if (globalThis.Array.isArray(value)) return firstSomeOf(value.map(findSubscriptionType));
|
|
205324
|
-
return asRecord$
|
|
205328
|
+
return asRecord$8(value).pipe(flatMap$2((record) => {
|
|
205325
205329
|
const direct = firstSomeOf(SUBSCRIPTION_TYPE_KEYS.map((key) => asNonEmptyString(record[key])));
|
|
205326
205330
|
if (isSome(direct)) return direct;
|
|
205327
|
-
return firstSomeOf(SUBSCRIPTION_CONTAINER_KEYS.map((key) => asRecord$
|
|
205331
|
+
return firstSomeOf(SUBSCRIPTION_CONTAINER_KEYS.map((key) => asRecord$8(record[key]).pipe(flatMap$2(findSubscriptionType))));
|
|
205328
205332
|
}));
|
|
205329
205333
|
}
|
|
205330
205334
|
function findAuthMethod(value) {
|
|
205331
205335
|
if (globalThis.Array.isArray(value)) return firstSomeOf(value.map(findAuthMethod));
|
|
205332
|
-
return asRecord$
|
|
205336
|
+
return asRecord$8(value).pipe(flatMap$2((record) => {
|
|
205333
205337
|
const direct = firstSomeOf(AUTH_METHOD_KEYS.map((key) => asNonEmptyString(record[key])));
|
|
205334
205338
|
if (isSome(direct)) return direct;
|
|
205335
|
-
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))));
|
|
205336
205340
|
}));
|
|
205337
205341
|
}
|
|
205338
205342
|
/**
|
|
@@ -206480,7 +206484,7 @@ function userInputQuestionsFromToolInput(toolInput) {
|
|
|
206480
206484
|
return (Array.isArray(toolInput.questions) ? toolInput.questions : []).map((question, idx) => userInputQuestionFromUnknown(question, idx));
|
|
206481
206485
|
}
|
|
206482
206486
|
function userInputQuestionFromUnknown(question, idx) {
|
|
206483
|
-
const value = asRecord$
|
|
206487
|
+
const value = asRecord$7(question) ?? {};
|
|
206484
206488
|
return {
|
|
206485
206489
|
id: typeof value.header === "string" ? value.header : `q-${idx}`,
|
|
206486
206490
|
header: typeof value.header === "string" ? value.header : `Question ${idx + 1}`,
|
|
@@ -206490,13 +206494,13 @@ function userInputQuestionFromUnknown(question, idx) {
|
|
|
206490
206494
|
};
|
|
206491
206495
|
}
|
|
206492
206496
|
function userInputOptionFromUnknown(option) {
|
|
206493
|
-
const value = asRecord$
|
|
206497
|
+
const value = asRecord$7(option) ?? {};
|
|
206494
206498
|
return {
|
|
206495
206499
|
label: typeof value.label === "string" ? value.label : "",
|
|
206496
206500
|
description: typeof value.description === "string" ? value.description : ""
|
|
206497
206501
|
};
|
|
206498
206502
|
}
|
|
206499
|
-
function asRecord$
|
|
206503
|
+
function asRecord$7(value) {
|
|
206500
206504
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
206501
206505
|
}
|
|
206502
206506
|
function permissionResultFromDecision(decision, toolInput, suggestions) {
|
|
@@ -207303,7 +207307,7 @@ const makeClaudeAdapter = fn$1("makeClaudeAdapter")(function* (options) {
|
|
|
207303
207307
|
const updateResumeCursor = fn$1("updateResumeCursor")(function* (context) {
|
|
207304
207308
|
const threadId = context.session.threadId;
|
|
207305
207309
|
if (!threadId) return;
|
|
207306
|
-
const providerDeliveryBinding = readProviderDeliveryBinding(asRecord$
|
|
207310
|
+
const providerDeliveryBinding = readProviderDeliveryBinding(asRecord$7(context.session.resumeCursor)?.providerDeliveryBinding);
|
|
207307
207311
|
const resumeCursor = {
|
|
207308
207312
|
threadId,
|
|
207309
207313
|
...context.resumeSessionId ? { resume: context.resumeSessionId } : {},
|
|
@@ -212369,7 +212373,7 @@ function makeAcpContentDeltaEvent(input) {
|
|
|
212369
212373
|
}
|
|
212370
212374
|
//#endregion
|
|
212371
212375
|
//#region ../../packages/shared/src/toolActivity.ts
|
|
212372
|
-
function asRecord$
|
|
212376
|
+
function asRecord$6(value) {
|
|
212373
212377
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
212374
212378
|
}
|
|
212375
212379
|
function asTrimmedString(value) {
|
|
@@ -212395,10 +212399,10 @@ function extractCommandFromTitle$1(title) {
|
|
|
212395
212399
|
return /`([^`]+)`/u.exec(title)?.[1]?.trim() || void 0;
|
|
212396
212400
|
}
|
|
212397
212401
|
function extractToolCommand(data, title) {
|
|
212398
|
-
const item = asRecord$
|
|
212399
|
-
const itemInput = asRecord$
|
|
212400
|
-
const itemResult = asRecord$
|
|
212401
|
-
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);
|
|
212402
212406
|
const direct = [
|
|
212403
212407
|
normalizeCommandValue$1(item?.command),
|
|
212404
212408
|
normalizeCommandValue$1(itemInput?.command),
|
|
@@ -212426,7 +212430,7 @@ function collectPaths(value, paths, seen, depth) {
|
|
|
212426
212430
|
}
|
|
212427
212431
|
return;
|
|
212428
212432
|
}
|
|
212429
|
-
const record = asRecord$
|
|
212433
|
+
const record = asRecord$6(value);
|
|
212430
212434
|
if (!record) return;
|
|
212431
212435
|
for (const key of [
|
|
212432
212436
|
"path",
|
|
@@ -212485,7 +212489,7 @@ function deriveToolActivityPresentation(input) {
|
|
|
212485
212489
|
const title = asTrimmedString(input.title);
|
|
212486
212490
|
const detail = stripTrailingExitCode(asTrimmedString(input.detail));
|
|
212487
212491
|
const fallbackSummary = asTrimmedString(input.fallbackSummary) ?? "Tool";
|
|
212488
|
-
const data = asRecord$
|
|
212492
|
+
const data = asRecord$6(input.data);
|
|
212489
212493
|
const command = extractToolCommand(data, title);
|
|
212490
212494
|
const primaryPath = extractPrimaryPath(data);
|
|
212491
212495
|
const action = classifyToolAction({
|
|
@@ -212509,7 +212513,7 @@ function deriveToolActivityPresentation(input) {
|
|
|
212509
212513
|
...primaryPath ? { detail: primaryPath } : {}
|
|
212510
212514
|
};
|
|
212511
212515
|
if (action === "search") {
|
|
212512
|
-
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);
|
|
212513
212517
|
return {
|
|
212514
212518
|
summary: "Searched files",
|
|
212515
212519
|
...query ? { detail: query } : {}
|
|
@@ -224524,6 +224528,9 @@ function isMissingGitCwdError(error) {
|
|
|
224524
224528
|
const normalized = `${error.detail}\n${error.message}`.toLowerCase();
|
|
224525
224529
|
return normalized.includes("no such file or directory") || normalized.includes("notfound: filesystem.access") || normalized.includes("enoent") || normalized.includes("not a directory");
|
|
224526
224530
|
}
|
|
224531
|
+
function isUnregisteredWorktreeError(error) {
|
|
224532
|
+
return `${error.detail}\n${error.message}`.toLowerCase().includes("is not a working tree");
|
|
224533
|
+
}
|
|
224527
224534
|
function toGitCommandError(input, detail) {
|
|
224528
224535
|
return (cause) => is$1(GitCommandError)(cause) ? cause : new GitCommandError({
|
|
224529
224536
|
operation: input.operation,
|
|
@@ -224919,6 +224926,20 @@ const GitCoreLive = effect(GitCore, fn$1("makeGitCore")(function* (options) {
|
|
|
224919
224926
|
if (firstRemote) return firstRemote;
|
|
224920
224927
|
return yield* createGitCommandError("GitCore.resolvePrimaryRemoteName", cwd, ["remote"], "No git remote is configured for this repository.");
|
|
224921
224928
|
});
|
|
224929
|
+
const resolveNormalizedPrimaryRemoteUrl = fn$1("resolveNormalizedPrimaryRemoteUrl")(function* (cwd) {
|
|
224930
|
+
const remoteName = yield* resolvePrimaryRemoteName(cwd);
|
|
224931
|
+
const remoteUrl = yield* runGitStdout("GitCore.resolvePrimaryRemoteUrl", cwd, [
|
|
224932
|
+
"remote",
|
|
224933
|
+
"get-url",
|
|
224934
|
+
remoteName
|
|
224935
|
+
]).pipe(map$3((stdout) => normalizeRemoteUrl(stdout)));
|
|
224936
|
+
if (remoteUrl.length > 0) return remoteUrl;
|
|
224937
|
+
return yield* createGitCommandError("GitCore.resolvePrimaryRemoteUrl", cwd, [
|
|
224938
|
+
"remote",
|
|
224939
|
+
"get-url",
|
|
224940
|
+
remoteName
|
|
224941
|
+
], `Remote '${remoteName}' has no URL.`);
|
|
224942
|
+
});
|
|
224922
224943
|
const resolvePushRemoteName = fn$1("resolvePushRemoteName")(function* (cwd, branch) {
|
|
224923
224944
|
const branchPushRemote = yield* runGitStdout("GitCore.resolvePushRemoteName.branchPushRemote", cwd, [
|
|
224924
224945
|
"config",
|
|
@@ -225590,10 +225611,33 @@ const GitCoreLive = effect(GitCore, fn$1("makeGitCore")(function* (options) {
|
|
|
225590
225611
|
const args = ["worktree", "remove"];
|
|
225591
225612
|
if (input.force) args.push("--force");
|
|
225592
225613
|
args.push(input.path);
|
|
225593
|
-
|
|
225614
|
+
const executeRemoval = (cwd, removalArgs) => executeGit("GitCore.removeWorktree", cwd, removalArgs, {
|
|
225594
225615
|
timeoutMs: 15e3,
|
|
225595
225616
|
fallbackErrorMessage: "git worktree remove failed"
|
|
225596
|
-
}).pipe(mapError((error) => createGitCommandError("GitCore.removeWorktree",
|
|
225617
|
+
}).pipe(mapError((error) => createGitCommandError("GitCore.removeWorktree", cwd, removalArgs, `${commandLabel(removalArgs)} failed (cwd: ${cwd}): ${error.message}`, error)), asVoid);
|
|
225618
|
+
yield* executeRemoval(input.cwd, args).pipe(catch_((originalError) => {
|
|
225619
|
+
if (!input.force || !isUnregisteredWorktreeError(originalError)) return fail(originalError);
|
|
225620
|
+
return gen(function* () {
|
|
225621
|
+
const targetExists = yield* option(fileSystem.exists(input.path));
|
|
225622
|
+
if (isNone(targetExists)) return yield* originalError;
|
|
225623
|
+
if (!targetExists.value) return;
|
|
225624
|
+
const ownerContext = yield* option(all({
|
|
225625
|
+
callerRemoteUrl: resolveNormalizedPrimaryRemoteUrl(input.cwd),
|
|
225626
|
+
targetRemoteUrl: resolveNormalizedPrimaryRemoteUrl(input.path),
|
|
225627
|
+
targetGitCommonDir: resolveGitCommonDir(input.path)
|
|
225628
|
+
}));
|
|
225629
|
+
if (isNone(ownerContext) || ownerContext.value.callerRemoteUrl !== ownerContext.value.targetRemoteUrl) return yield* originalError;
|
|
225630
|
+
const ownerArgs = [
|
|
225631
|
+
"--git-dir",
|
|
225632
|
+
ownerContext.value.targetGitCommonDir,
|
|
225633
|
+
"worktree",
|
|
225634
|
+
"remove",
|
|
225635
|
+
"--force",
|
|
225636
|
+
input.path
|
|
225637
|
+
];
|
|
225638
|
+
yield* executeRemoval(input.cwd, ownerArgs);
|
|
225639
|
+
});
|
|
225640
|
+
}));
|
|
225597
225641
|
});
|
|
225598
225642
|
const pruneWorktrees = fn$1("pruneWorktrees")(function* (cwd) {
|
|
225599
225643
|
yield* executeGit("GitCore.pruneWorktrees", cwd, [
|
|
@@ -278860,7 +278904,7 @@ function makeApprovedWorkerPlanEventState() {
|
|
|
278860
278904
|
function promptKey(masterThreadId, promptId) {
|
|
278861
278905
|
return `${masterThreadId}\n${promptId}`;
|
|
278862
278906
|
}
|
|
278863
|
-
function asRecord$
|
|
278907
|
+
function asRecord$5(value) {
|
|
278864
278908
|
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
|
|
278865
278909
|
}
|
|
278866
278910
|
function exactMaterializedTaskIds(value, expectedCount) {
|
|
@@ -278870,7 +278914,7 @@ function exactMaterializedTaskIds(value, expectedCount) {
|
|
|
278870
278914
|
}
|
|
278871
278915
|
function readyBatchFromActivity(state, event) {
|
|
278872
278916
|
if (event.payload.activity.kind !== "plan.task-creation.batch-succeeded") return null;
|
|
278873
|
-
const payload = asRecord$
|
|
278917
|
+
const payload = asRecord$5(event.payload.activity.payload);
|
|
278874
278918
|
const promptId = payload?.["promptId"];
|
|
278875
278919
|
if (typeof promptId !== "string") return null;
|
|
278876
278920
|
const key = promptKey(event.payload.threadId, promptId);
|
|
@@ -280008,7 +280052,7 @@ function runtimeGrantNeedsRefresh(token, identity, nowSeconds = Math.floor(Date.
|
|
|
280008
280052
|
return claims.expiresAtSeconds - nowSeconds <= RUNTIME_GRANT_REFRESH_SKEW_SECONDS;
|
|
280009
280053
|
}
|
|
280010
280054
|
/** Narrow an unknown to a plain object, or null. */
|
|
280011
|
-
function asRecord$
|
|
280055
|
+
function asRecord$4(value) {
|
|
280012
280056
|
return value !== null && typeof value === "object" ? value : null;
|
|
280013
280057
|
}
|
|
280014
280058
|
/** The raw (untrimmed) string when it is present and not blank, else null. */
|
|
@@ -280020,7 +280064,7 @@ function asTimestamp(value) {
|
|
|
280020
280064
|
return typeof value === "string" && Number.isFinite(Date.parse(value)) ? value : null;
|
|
280021
280065
|
}
|
|
280022
280066
|
function parseRuntimeGrantRefreshResponse(runtimeId, value) {
|
|
280023
|
-
const data = asRecord$
|
|
280067
|
+
const data = asRecord$4(asRecord$4(value)?.data);
|
|
280024
280068
|
if (!data || data.runtimeId !== runtimeId) return null;
|
|
280025
280069
|
const grantToken = asNonBlankString(data.grantToken);
|
|
280026
280070
|
const expiresAt = asTimestamp(data.expiresAt);
|
|
@@ -296116,6 +296160,74 @@ const LocalAutomationSchedulerLive = effectDiscard(gen(function* () {
|
|
|
296116
296160
|
yield* forkScoped(startup.awaitCommandReady.pipe(andThen(forever$1(tick.pipe(andThen(sleep$4("60 seconds")))))));
|
|
296117
296161
|
}));
|
|
296118
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
|
|
296119
296231
|
//#region src/command/wsToken.ts
|
|
296120
296232
|
/**
|
|
296121
296233
|
* Build the WS token response given an optional PAT and the configured CMMD
|
|
@@ -296152,13 +296264,13 @@ function resolveWsUrl(baseUrl) {
|
|
|
296152
296264
|
const callCmmdTool = legacyCmmdToolBridge.callTool;
|
|
296153
296265
|
const extractMcpToolText = legacyCmmdToolBridge.extractText;
|
|
296154
296266
|
const isCmmdMcpAuthError = legacyCmmdToolBridge.isAuthError;
|
|
296155
|
-
var ClaudeUsageReadError = class extends TaggedError("ClaudeUsageReadError") {};
|
|
296156
296267
|
/**
|
|
296157
296268
|
* CMMD-side path for the PROJECT-keyed Forge Cloud catalog. Shared by the list
|
|
296158
296269
|
* proxy, the SSE poll-and-emit proxy, and the register/unregister proxies so the
|
|
296159
296270
|
* upstream contract lives in exactly one place.
|
|
296160
296271
|
*/
|
|
296161
296272
|
const CMMD_CLOUD_PROJECTS_PATH = "/api/forge/context/cloud-projects";
|
|
296273
|
+
const CMMD_RUNTIMES_PATH = "/api/forge/context/runtimes";
|
|
296162
296274
|
/**
|
|
296163
296275
|
* Authenticate the browser session and resolve the CMMD JWT to forward
|
|
296164
296276
|
* upstream. Returns null when no token could be resolved, which every caller
|
|
@@ -296282,6 +296394,10 @@ const cmmdBillingSeriesRouteLayer = registerProxyRoute({
|
|
|
296282
296394
|
const cmmdRestUnavailable = () => new CmmdProxyAuthenticationRequiredError("CMMD connection required. Reconnect CMMD to continue.");
|
|
296283
296395
|
function runCmmdRestProxy(session, proxy, dependencies = {}) {
|
|
296284
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
|
+
}
|
|
296285
296401
|
const resolveJwt = dependencies.resolveJwt ?? resolveCmmdJwtForSession;
|
|
296286
296402
|
const jwt = yield* resolveJwt({
|
|
296287
296403
|
sessionId: session.sessionId,
|
|
@@ -297822,59 +297938,6 @@ const cmmdSetProviderAccountDefaultRouteLayer = registerProxyRoute({
|
|
|
297822
297938
|
orgIdSource: "none",
|
|
297823
297939
|
responseShape: "unwrapData"
|
|
297824
297940
|
});
|
|
297825
|
-
const resolveConnectedClaudeGeneration = (session) => gen(function* () {
|
|
297826
|
-
const outcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
297827
|
-
method: "GET",
|
|
297828
|
-
jwt,
|
|
297829
|
-
path: "/api/forge/context/providers/claude/credential"
|
|
297830
|
-
}));
|
|
297831
|
-
if (!outcome.ok) return outcome;
|
|
297832
|
-
const state = unwrapForgeEnvelope(outcome.value);
|
|
297833
|
-
if (state === null || typeof state !== "object" || !("connected" in state) || state.connected !== true || !("generationId" in state) || typeof state.generationId !== "string") return {
|
|
297834
|
-
ok: true,
|
|
297835
|
-
value: null
|
|
297836
|
-
};
|
|
297837
|
-
return {
|
|
297838
|
-
ok: true,
|
|
297839
|
-
value: {
|
|
297840
|
-
generationId: state.generationId,
|
|
297841
|
-
generationHash: createHash("sha256").update(state.generationId).digest("hex")
|
|
297842
|
-
}
|
|
297843
|
-
};
|
|
297844
|
-
});
|
|
297845
|
-
/**
|
|
297846
|
-
* The GET path is read-only. The explicit per-account POST refresh invokes
|
|
297847
|
-
* this helper and propagates any CMMD forward failure to the caller.
|
|
297848
|
-
*/
|
|
297849
|
-
const forwardClaudeUsageTelemetry = (session, requestedProviderAccountId, activelyPoll = false, fetchClaudeUsage = fetchClaudeUsageViaOfficialClient) => gen(function* () {
|
|
297850
|
-
const credentialOutcome = yield* resolveConnectedClaudeGeneration(session);
|
|
297851
|
-
if (!credentialOutcome.ok) return credentialOutcome;
|
|
297852
|
-
if (credentialOutcome.value === null) return null;
|
|
297853
|
-
const { generationId, generationHash } = credentialOutcome.value;
|
|
297854
|
-
const providerAccountId = requestedProviderAccountId ?? generationId;
|
|
297855
|
-
const activeSnapshot = activelyPoll && providerAccountId === generationId ? yield* tryPromise({
|
|
297856
|
-
try: () => fetchClaudeUsage({ binaryPath: resolveClaudeBinaryPath("claude") }),
|
|
297857
|
-
catch: (cause) => new ClaudeUsageReadError({ cause })
|
|
297858
|
-
}).pipe(orElseSucceed(() => null)) : null;
|
|
297859
|
-
const snapshot = activeSnapshot ? {
|
|
297860
|
-
...activeSnapshot,
|
|
297861
|
-
observedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
297862
|
-
} : getLatestClaudeRateLimitTelemetry(generationHash, providerAccountId);
|
|
297863
|
-
if (!snapshot) return null;
|
|
297864
|
-
return yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
297865
|
-
method: "POST",
|
|
297866
|
-
jwt,
|
|
297867
|
-
path: "/api/forge/context/providers/usage/claude/telemetry",
|
|
297868
|
-
body: {
|
|
297869
|
-
providerAccountId,
|
|
297870
|
-
credentialGenerationId: generationId,
|
|
297871
|
-
source: activeSnapshot ? "active_poll" : "passive_sdk_telemetry",
|
|
297872
|
-
fiveHour: snapshot.fiveHour,
|
|
297873
|
-
sevenDay: snapshot.sevenDay,
|
|
297874
|
-
observedAt: snapshot.observedAt
|
|
297875
|
-
}
|
|
297876
|
-
}));
|
|
297877
|
-
});
|
|
297878
297941
|
const cmmdGetProviderUsageRouteLayer = add$1("GET", "/api/cmmd/providers/usage", gen(function* () {
|
|
297879
297942
|
const request = yield* HttpServerRequest;
|
|
297880
297943
|
const outcome = yield* runCmmdRestProxy(yield* (yield* ServerAuth).authenticateHttpRequest(request), (jwt) => cmmdGateway.request({
|
|
@@ -297895,15 +297958,62 @@ function parseProviderUsageRefreshInput(rawBody) {
|
|
|
297895
297958
|
providerAccountId: body.providerAccountId
|
|
297896
297959
|
};
|
|
297897
297960
|
}
|
|
297898
|
-
|
|
297899
|
-
const
|
|
297900
|
-
const
|
|
297901
|
-
|
|
297902
|
-
|
|
297903
|
-
|
|
297904
|
-
|
|
297905
|
-
|
|
297906
|
-
|
|
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
|
+
}
|
|
297907
298017
|
const refreshOutcome = yield* runCmmdRestProxy(session, (jwt) => cmmdGateway.request({
|
|
297908
298018
|
method: "POST",
|
|
297909
298019
|
jwt,
|
|
@@ -297911,16 +298021,16 @@ const cmmdRefreshProviderUsageRouteLayer = add$1("POST", "/api/cmmd/providers/us
|
|
|
297911
298021
|
body: { providerAccountId: input.providerAccountId }
|
|
297912
298022
|
}));
|
|
297913
298023
|
if (!refreshOutcome.ok) return buildProxyErrorResponse(refreshOutcome.error);
|
|
297914
|
-
|
|
297915
|
-
|
|
297916
|
-
|
|
297917
|
-
|
|
297918
|
-
|
|
297919
|
-
|
|
297920
|
-
|
|
297921
|
-
|
|
297922
|
-
|
|
297923
|
-
|
|
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());
|
|
297924
298034
|
const cmmdGetUserCodexCredentialRouteLayer = registerProxyRoute({
|
|
297925
298035
|
forgePath: "/api/cmmd/providers/codex/credential",
|
|
297926
298036
|
method: "GET",
|
|
@@ -298086,9 +298196,10 @@ const cmmdForgeCloudProjectRemovalReceiptRouteLayer = registerProxyRoute({
|
|
|
298086
298196
|
});
|
|
298087
298197
|
const FORGE_RUNTIMES_POLL_INTERVAL = seconds(5);
|
|
298088
298198
|
const FORGE_RUNTIMES_KEEPALIVE_INTERVAL = seconds(25);
|
|
298089
|
-
function encodeForgeCloudProjectsFrame(projects, capacity = null) {
|
|
298199
|
+
function encodeForgeCloudProjectsFrame(projects, environments, capacity = null) {
|
|
298090
298200
|
return new TextEncoder().encode(`event: cloud-projects\ndata: ${JSON.stringify({
|
|
298091
298201
|
projects,
|
|
298202
|
+
environments,
|
|
298092
298203
|
capacity
|
|
298093
298204
|
})}\n\n`);
|
|
298094
298205
|
}
|
|
@@ -298132,7 +298243,10 @@ function makeFetchCloudProjectsFrameEffect(upstreamUrl, accessToken) {
|
|
|
298132
298243
|
}
|
|
298133
298244
|
const json = await res.json();
|
|
298134
298245
|
const unwrapped = json && typeof json === "object" && "data" in json && json["data"] ? json["data"] : json;
|
|
298135
|
-
|
|
298246
|
+
const projects = unwrapped?.["projects"];
|
|
298247
|
+
const environments = unwrapped?.["environments"];
|
|
298248
|
+
if (!Array.isArray(projects) || !Array.isArray(environments)) return null;
|
|
298249
|
+
return encodeForgeCloudProjectsFrame(projects, environments, unwrapped?.["capacity"] ?? null);
|
|
298136
298250
|
})).pipe(catch_(() => succeed(null)));
|
|
298137
298251
|
}
|
|
298138
298252
|
const cmmdForgeCloudProjectsEventsRouteLayer = add$1("GET", "/api/cmmd/forge-cloud-projects/events", gen(function* () {
|
|
@@ -308948,6 +309062,82 @@ const claudeNativeGenerationProofRouteLayer = add$1("GET", "/api/runtime/provide
|
|
|
308948
309062
|
generationHash: yield* readUsableClaudeGenerationHash(config)
|
|
308949
309063
|
});
|
|
308950
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();
|
|
308951
309141
|
/**
|
|
308952
309142
|
* FINDING-CB1 — workspace readiness SSE endpoint.
|
|
308953
309143
|
*
|
|
@@ -309291,7 +309481,7 @@ const MiscRuntimeLayerLive = mergeAll(AnalyticsServiceLayerLive, OpenLive, Serve
|
|
|
309291
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));
|
|
309292
309482
|
const RuntimeDependenciesLive = pullRequestServiceFactoryLayer.pipe(provideMerge(RuntimeDependenciesWithoutPullRequestsLive), provideMerge(cmmdProjectIdentityResolverLive.pipe(provide$1(RuntimeDependenciesWithoutPullRequestsLive))), provideMerge(pullRequestProviderRuntimeLive));
|
|
309293
309483
|
const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(provideMerge(RuntimeDependenciesLive));
|
|
309294
|
-
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));
|
|
309295
309485
|
const runServer = launch$1(unwrap(gen(function* () {
|
|
309296
309486
|
const config = yield* ServerConfig;
|
|
309297
309487
|
fixPath();
|