@cmmd-center/forge 0.13.64 → 0.13.66

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 CHANGED
@@ -26977,6 +26977,24 @@ const RelayWsRpcGroup = WsRpcGroup.middleware(RelayAuthorizationMiddleware).midd
26977
26977
  */
26978
26978
  const SessionWsRpcGroup = WsRpcGroup.middleware(SessionAuthorizationMiddleware);
26979
26979
  //#endregion
26980
+ //#region ../../packages/contracts/src/cmmdRuntimeSpriteIdentity.ts
26981
+ function nonEmptyString$3(value) {
26982
+ return typeof value === "string" && value.length > 0 ? value : null;
26983
+ }
26984
+ /**
26985
+ * Resolve the operational Sprite name for provision / connect / readiness gates.
26986
+ *
26987
+ * @see CmmdRuntimeSpriteIdentitySource for the dual-contract rules.
26988
+ */
26989
+ function resolveCmmdRuntimeSpriteName(runtime) {
26990
+ if (Object.hasOwn(runtime, "spriteName")) return nonEmptyString$3(runtime.spriteName);
26991
+ return nonEmptyString$3(runtime.flyMachineId);
26992
+ }
26993
+ /** True when the payload carries an operational Sprite name after dual-read. */
26994
+ function hasCmmdRuntimeSpriteIdentity(runtime) {
26995
+ return resolveCmmdRuntimeSpriteName(runtime) !== null;
26996
+ }
26997
+ //#endregion
26980
26998
  //#region ../../packages/contracts/src/cmmdRuntimeThreadLifecycle.ts
26981
26999
  const FORGE_LIFECYCLE_METADATA_KEY = "forgeLifecycle";
26982
27000
  const FORGE_LIFECYCLE_SCHEMA_VERSION = 1;
@@ -66257,7 +66275,7 @@ function normalizeNumberish(value) {
66257
66275
  }
66258
66276
  //#endregion
66259
66277
  //#region package.json
66260
- var version$1 = "0.13.64";
66278
+ var version$1 = "0.13.66";
66261
66279
  //#endregion
66262
66280
  //#region src/sentry.ts
66263
66281
  const SERVER_APP_NAME = "forge-server";
@@ -89349,26 +89367,60 @@ var GitHubBroker = class {
89349
89367
  }
89350
89368
  /**
89351
89369
  * On a "github" scope cache miss, re-requests it once through the existing
89352
- * CMMD client before the caller refuses (CMMD-Center/forge#3496). CMMD
89353
- * delivers the grant proactively on thread.create and the kick, so a miss
89354
- * on a woken runtime is a cache or ticket TTL problem, not a missing
89355
- * request: this closes the gap where the ticket lands in the broker
89356
- * authority cache mid-request, and logs the outcome either way so the
89357
- * cause is visible instead of a silent refusal.
89370
+ * CMMD client before the caller refuses (CMMD-Center/forge#3496,
89371
+ * CMMD-Center/forge#3498). CMMD delivers the grant proactively on
89372
+ * thread.create and the kick, so a miss on a woken runtime is a cache or
89373
+ * ticket TTL problem, not a missing request: this closes the gap where the
89374
+ * ticket lands in the broker authority cache mid-request, and logs the
89375
+ * outcome on failure so the cause is visible instead of a silent refusal.
89376
+ *
89377
+ * A CMMD cloud runtime (every sprite) must still make this round trip
89378
+ * itself: `status()`'s own grant gate fails closed before ever reaching
89379
+ * the network for that runtime class (ADR-015 — it must never fall
89380
+ * through to the human JWT), so this uses `probeRuntimeGithubGrantDelivery`
89381
+ * instead, which makes the identical round trip without that JWT
89382
+ * fallback.
89358
89383
  */
89359
89384
  async requestRuntimeGithubGrant() {
89360
89385
  const cached = this.runtimeGrantAuthContext("github");
89361
89386
  if (cached) return cached;
89362
89387
  const runtimeId = process.env.FORGE_CMMD_RUNTIME_ID?.trim();
89363
89388
  if (!runtimeId) return null;
89364
- const result = await this.status({
89389
+ if (this.isCmmdCloudRuntimeMode) await this.probeRuntimeGithubGrantDelivery(runtimeId);
89390
+ else await this.status({
89365
89391
  sessionId: AuthSessionId.make(`cmmd-runtime:${runtimeId}`),
89366
89392
  subject: `runtime:${runtimeId}`
89367
89393
  });
89368
89394
  const grant = this.runtimeGrantAuthContext("github");
89369
- console.warn(`[github-broker] re-requested the github scope grant for runtime ${runtimeId}: ${grant ? "cache populated" : `still missing (broker answered ${result.ok ? "ok" : result.code ?? "no grant"})`}`);
89395
+ if (!grant) console.warn(`[github-broker] re-requested the github scope grant for runtime ${runtimeId}: still missing after one network round trip`);
89370
89396
  return grant;
89371
89397
  }
89398
+ /**
89399
+ * The cloud-runtime half of `requestRuntimeGithubGrant`'s re-request.
89400
+ *
89401
+ * CMMD's status route always requires a Bearer that already carries the
89402
+ * "github" scope (verified server-side against the presented ticket's own
89403
+ * claims — see `forge-runtime-grants.routes.ts` on CMMD main), and there is
89404
+ * no separate CMMD route that mints a "github"-scoped grant on demand. So
89405
+ * this call's own response can never carry a grant to install; its purpose
89406
+ * is the wait. CMMD delivers a fresh grant on this same runtime's inbound
89407
+ * thread.create/kick requests (`ServerAuth.authenticateHttpRequest` /
89408
+ * `authenticateWebSocketUpgrade`, which install it into the broker
89409
+ * authority cache as a side effect of authenticating each request), and a
89410
+ * delivery already in flight when the caller checked the cache gets this
89411
+ * round trip's worth of extra time to land before the caller gives up.
89412
+ * Bounded by the same timeout as every other runtime-grant call, and
89413
+ * deliberately unauthenticated: sending no Bearer is exactly as
89414
+ * informative to CMMD as sending one lacking the required scope, and
89415
+ * skips resolving one for a request whose own response is never used.
89416
+ */
89417
+ async probeRuntimeGithubGrantDelivery(runtimeId) {
89418
+ const response = await this.fetchImpl(makeUrl(this.commandAppUrl, `/api/forge/runtimes/${encodeURIComponent(runtimeId)}/github/status`), {
89419
+ method: "GET",
89420
+ signal: AbortSignal.timeout(GITHUB_BROKER_REQUEST_TIMEOUT_MS)
89421
+ }).catch(() => null);
89422
+ if (response !== null) await parseResponseBody(response);
89423
+ }
89372
89424
  async workspaceStatus(input) {
89373
89425
  const cwdValidation = validateCwd(input.cwd);
89374
89426
  if (cwdValidation) return cwdValidation;
@@ -151589,7 +151641,9 @@ const SERVER_ONLY_PROVIDER_CHILD_ENV_KEYS = new Set([
151589
151641
  "FORGE_CMMD_RUNTIME_PUBLIC_KEY",
151590
151642
  "FORGE_PROVIDER_PROXY_URL",
151591
151643
  "FORGE_PROXY_HMAC_SECRET",
151592
- "FORGE_PPROXY_HMAC_SECRET"
151644
+ "FORGE_PPROXY_HMAC_SECRET",
151645
+ "SPRITE_API_TOKEN",
151646
+ "SPRITES_TOKEN"
151593
151647
  ]);
151594
151648
  function scrubForgeProviderChildEnvSecrets(env) {
151595
151649
  const scrubbed = { ...env };
@@ -298346,7 +298400,7 @@ function resolveBuildCommitFromEnv(env) {
298346
298400
  * environment descriptor down instead of reporting an honest "unknown".
298347
298401
  */
298348
298402
  function readBakedBuildCommit() {
298349
- return "589c5f6a52f5cd82c598399da0ece13acd43d50d";
298403
+ return "00be113a2d44d7842004edc5cef20ef7e4f24518";
298350
298404
  }
298351
298405
  async function resolveServerBuildCommit(input) {
298352
298406
  if (isFullCommitSha(input.baked)) return input.baked;
@@ -311019,7 +311073,10 @@ function isLegacyRuntimeConnection(value, expectedRuntimeId) {
311019
311073
  return [
311020
311074
  runtime.runtimeId === expectedRuntimeId,
311021
311075
  runtime.runtimeCapabilityMode === "legacy_env",
311022
- isNonEmptyString$1(runtime.flyMachineId),
311076
+ hasCmmdRuntimeSpriteIdentity({
311077
+ ...Object.hasOwn(runtime, "spriteName") ? { spriteName: typeof runtime.spriteName === "string" ? runtime.spriteName : null } : {},
311078
+ ...Object.hasOwn(runtime, "flyMachineId") ? { flyMachineId: typeof runtime.flyMachineId === "string" ? runtime.flyMachineId : null } : {}
311079
+ }),
311023
311080
  !Object.hasOwn(runtime, "brokerAuthorityAttestedForgeGitCommit"),
311024
311081
  runtime.brokerAuthorityAttestedImageRef === null,
311025
311082
  runtime.brokerAuthorityAttestedImageVersion === null,
@@ -321134,7 +321191,7 @@ const execFilePromise = (0, node_util.promisify)(node_child_process.execFile);
321134
321191
  const COMMAND_TIMEOUT_MS = 15e3;
321135
321192
  const MAX_COMMAND_OUTPUT_BYTES = 32e3;
321136
321193
  const MAX_PROCESSES = 80;
321137
- const sanitizeRuntimeDiagnosticText = (value) => value.replace(/\b(OPENAI_API_KEY|ANTHROPIC_API_KEY|ANTHROPIC_AUTH_TOKEN|FLY_ACCESS_TOKEN|FLY_API_TOKEN|GITHUB_TOKEN|FORGE_CMMD_RUNTIME_GRANT_TOKEN|FORGE_NPM_PROXY_TOKEN|FORGE_PROXY_HMAC_SECRET|FORGE_PPROXY_HMAC_SECRET|CMMD_FORGE_RUNTIME_TICKET_PRIVATE_KEY|CMMD_FORGE_RUNTIME_BROWSER_WEBRTC_ICE_SERVERS)=\S+/g, "$1=[redacted]").replace(/\bforge_proxy_[A-Za-z0-9._-]+/g, "forge_proxy_[redacted]").replace(/\bcmmd_provider_[A-Za-z0-9._-]+/g, "cmmd_provider_[redacted]").replace(/\bruntime-grant\.[A-Za-z0-9._-]+/g, "runtime-grant.[redacted]").replace(/\b(sk|ghp|github_pat)_[A-Za-z0-9._-]+/g, "$1_[redacted]").replace(/\bsk-[A-Za-z0-9._-]+/g, "sk-[redacted]");
321194
+ const sanitizeRuntimeDiagnosticText = (value) => value.replace(/\b(OPENAI_API_KEY|ANTHROPIC_API_KEY|ANTHROPIC_AUTH_TOKEN|FLY_ACCESS_TOKEN|FLY_API_TOKEN|SPRITES_TOKEN|SPRITE_API_TOKEN|GITHUB_TOKEN|FORGE_CMMD_RUNTIME_GRANT_TOKEN|FORGE_NPM_PROXY_TOKEN|FORGE_PROXY_HMAC_SECRET|FORGE_PPROXY_HMAC_SECRET|CMMD_FORGE_RUNTIME_TICKET_PRIVATE_KEY|CMMD_FORGE_RUNTIME_BROWSER_WEBRTC_ICE_SERVERS)=\S+/g, "$1=[redacted]").replace(/\bforge_proxy_[A-Za-z0-9._-]+/g, "forge_proxy_[redacted]").replace(/\bcmmd_provider_[A-Za-z0-9._-]+/g, "cmmd_provider_[redacted]").replace(/\bruntime-grant\.[A-Za-z0-9._-]+/g, "runtime-grant.[redacted]").replace(/\b(sk|ghp|github_pat)_[A-Za-z0-9._-]+/g, "$1_[redacted]").replace(/\bsk-[A-Za-z0-9._-]+/g, "sk-[redacted]");
321138
321195
  const sanitizeRuntimeDiagnosticValue = (value) => {
321139
321196
  const trimmed = value?.trim();
321140
321197
  if (!trimmed) return void 0;
@@ -321181,16 +321238,15 @@ const parseProcessList = (output) => output.split("\n").map((line) => line.trim(
321181
321238
  if (!Number.isFinite(pid) || !Number.isFinite(ppid) || !stat || !command) return void 0;
321182
321239
  const cpuPercent = parseMeasurement(cpuRaw);
321183
321240
  const rssKb = parseMeasurement(rssRaw);
321184
- const measurements = {};
321185
- if (cpuPercent !== null) measurements.cpuPercent = cpuPercent;
321186
- if (rssKb !== null) measurements.rssKb = rssKb;
321187
- return {
321241
+ const parsed = {
321188
321242
  pid,
321189
321243
  ppid,
321190
321244
  stat: sanitizeRuntimeDiagnosticText(stat),
321191
- command: sanitizeRuntimeDiagnosticText(command),
321192
- ...measurements
321245
+ command: sanitizeRuntimeDiagnosticText(command)
321193
321246
  };
321247
+ if (cpuPercent !== null) parsed.cpuPercent = cpuPercent;
321248
+ if (rssKb !== null) parsed.rssKb = rssKb;
321249
+ return parsed;
321194
321250
  }).filter((process) => process !== void 0).slice(0, MAX_PROCESSES);
321195
321251
  /**
321196
321252
  * The process tree, or the reason there isn't one.
package/dist/bin.mjs CHANGED
@@ -26689,6 +26689,24 @@ const RelayWsRpcGroup = WsRpcGroup.middleware(RelayAuthorizationMiddleware).midd
26689
26689
  */
26690
26690
  const SessionWsRpcGroup = WsRpcGroup.middleware(SessionAuthorizationMiddleware);
26691
26691
  //#endregion
26692
+ //#region ../../packages/contracts/src/cmmdRuntimeSpriteIdentity.ts
26693
+ function nonEmptyString$3(value) {
26694
+ return typeof value === "string" && value.length > 0 ? value : null;
26695
+ }
26696
+ /**
26697
+ * Resolve the operational Sprite name for provision / connect / readiness gates.
26698
+ *
26699
+ * @see CmmdRuntimeSpriteIdentitySource for the dual-contract rules.
26700
+ */
26701
+ function resolveCmmdRuntimeSpriteName(runtime) {
26702
+ if (Object.hasOwn(runtime, "spriteName")) return nonEmptyString$3(runtime.spriteName);
26703
+ return nonEmptyString$3(runtime.flyMachineId);
26704
+ }
26705
+ /** True when the payload carries an operational Sprite name after dual-read. */
26706
+ function hasCmmdRuntimeSpriteIdentity(runtime) {
26707
+ return resolveCmmdRuntimeSpriteName(runtime) !== null;
26708
+ }
26709
+ //#endregion
26692
26710
  //#region ../../packages/contracts/src/cmmdRuntimeThreadLifecycle.ts
26693
26711
  const FORGE_LIFECYCLE_METADATA_KEY = "forgeLifecycle";
26694
26712
  const FORGE_LIFECYCLE_SCHEMA_VERSION = 1;
@@ -65961,7 +65979,7 @@ function normalizeNumberish(value) {
65961
65979
  }
65962
65980
  //#endregion
65963
65981
  //#region package.json
65964
- var version$1 = "0.13.64";
65982
+ var version$1 = "0.13.66";
65965
65983
  //#endregion
65966
65984
  //#region src/sentry.ts
65967
65985
  const SERVER_APP_NAME = "forge-server";
@@ -88993,26 +89011,60 @@ var GitHubBroker = class {
88993
89011
  }
88994
89012
  /**
88995
89013
  * On a "github" scope cache miss, re-requests it once through the existing
88996
- * CMMD client before the caller refuses (CMMD-Center/forge#3496). CMMD
88997
- * delivers the grant proactively on thread.create and the kick, so a miss
88998
- * on a woken runtime is a cache or ticket TTL problem, not a missing
88999
- * request: this closes the gap where the ticket lands in the broker
89000
- * authority cache mid-request, and logs the outcome either way so the
89001
- * cause is visible instead of a silent refusal.
89014
+ * CMMD client before the caller refuses (CMMD-Center/forge#3496,
89015
+ * CMMD-Center/forge#3498). CMMD delivers the grant proactively on
89016
+ * thread.create and the kick, so a miss on a woken runtime is a cache or
89017
+ * ticket TTL problem, not a missing request: this closes the gap where the
89018
+ * ticket lands in the broker authority cache mid-request, and logs the
89019
+ * outcome on failure so the cause is visible instead of a silent refusal.
89020
+ *
89021
+ * A CMMD cloud runtime (every sprite) must still make this round trip
89022
+ * itself: `status()`'s own grant gate fails closed before ever reaching
89023
+ * the network for that runtime class (ADR-015 — it must never fall
89024
+ * through to the human JWT), so this uses `probeRuntimeGithubGrantDelivery`
89025
+ * instead, which makes the identical round trip without that JWT
89026
+ * fallback.
89002
89027
  */
89003
89028
  async requestRuntimeGithubGrant() {
89004
89029
  const cached = this.runtimeGrantAuthContext("github");
89005
89030
  if (cached) return cached;
89006
89031
  const runtimeId = process.env.FORGE_CMMD_RUNTIME_ID?.trim();
89007
89032
  if (!runtimeId) return null;
89008
- const result = await this.status({
89033
+ if (this.isCmmdCloudRuntimeMode) await this.probeRuntimeGithubGrantDelivery(runtimeId);
89034
+ else await this.status({
89009
89035
  sessionId: AuthSessionId.make(`cmmd-runtime:${runtimeId}`),
89010
89036
  subject: `runtime:${runtimeId}`
89011
89037
  });
89012
89038
  const grant = this.runtimeGrantAuthContext("github");
89013
- console.warn(`[github-broker] re-requested the github scope grant for runtime ${runtimeId}: ${grant ? "cache populated" : `still missing (broker answered ${result.ok ? "ok" : result.code ?? "no grant"})`}`);
89039
+ if (!grant) console.warn(`[github-broker] re-requested the github scope grant for runtime ${runtimeId}: still missing after one network round trip`);
89014
89040
  return grant;
89015
89041
  }
89042
+ /**
89043
+ * The cloud-runtime half of `requestRuntimeGithubGrant`'s re-request.
89044
+ *
89045
+ * CMMD's status route always requires a Bearer that already carries the
89046
+ * "github" scope (verified server-side against the presented ticket's own
89047
+ * claims — see `forge-runtime-grants.routes.ts` on CMMD main), and there is
89048
+ * no separate CMMD route that mints a "github"-scoped grant on demand. So
89049
+ * this call's own response can never carry a grant to install; its purpose
89050
+ * is the wait. CMMD delivers a fresh grant on this same runtime's inbound
89051
+ * thread.create/kick requests (`ServerAuth.authenticateHttpRequest` /
89052
+ * `authenticateWebSocketUpgrade`, which install it into the broker
89053
+ * authority cache as a side effect of authenticating each request), and a
89054
+ * delivery already in flight when the caller checked the cache gets this
89055
+ * round trip's worth of extra time to land before the caller gives up.
89056
+ * Bounded by the same timeout as every other runtime-grant call, and
89057
+ * deliberately unauthenticated: sending no Bearer is exactly as
89058
+ * informative to CMMD as sending one lacking the required scope, and
89059
+ * skips resolving one for a request whose own response is never used.
89060
+ */
89061
+ async probeRuntimeGithubGrantDelivery(runtimeId) {
89062
+ const response = await this.fetchImpl(makeUrl(this.commandAppUrl, `/api/forge/runtimes/${encodeURIComponent(runtimeId)}/github/status`), {
89063
+ method: "GET",
89064
+ signal: AbortSignal.timeout(GITHUB_BROKER_REQUEST_TIMEOUT_MS)
89065
+ }).catch(() => null);
89066
+ if (response !== null) await parseResponseBody(response);
89067
+ }
89016
89068
  async workspaceStatus(input) {
89017
89069
  const cwdValidation = validateCwd(input.cwd);
89018
89070
  if (cwdValidation) return cwdValidation;
@@ -151162,7 +151214,9 @@ const SERVER_ONLY_PROVIDER_CHILD_ENV_KEYS = new Set([
151162
151214
  "FORGE_CMMD_RUNTIME_PUBLIC_KEY",
151163
151215
  "FORGE_PROVIDER_PROXY_URL",
151164
151216
  "FORGE_PROXY_HMAC_SECRET",
151165
- "FORGE_PPROXY_HMAC_SECRET"
151217
+ "FORGE_PPROXY_HMAC_SECRET",
151218
+ "SPRITE_API_TOKEN",
151219
+ "SPRITES_TOKEN"
151166
151220
  ]);
151167
151221
  function scrubForgeProviderChildEnvSecrets(env) {
151168
151222
  const scrubbed = { ...env };
@@ -297791,7 +297845,7 @@ function resolveBuildCommitFromEnv(env) {
297791
297845
  * environment descriptor down instead of reporting an honest "unknown".
297792
297846
  */
297793
297847
  function readBakedBuildCommit() {
297794
- return "589c5f6a52f5cd82c598399da0ece13acd43d50d";
297848
+ return "00be113a2d44d7842004edc5cef20ef7e4f24518";
297795
297849
  }
297796
297850
  async function resolveServerBuildCommit(input) {
297797
297851
  if (isFullCommitSha(input.baked)) return input.baked;
@@ -310392,7 +310446,10 @@ function isLegacyRuntimeConnection(value, expectedRuntimeId) {
310392
310446
  return [
310393
310447
  runtime.runtimeId === expectedRuntimeId,
310394
310448
  runtime.runtimeCapabilityMode === "legacy_env",
310395
- isNonEmptyString$1(runtime.flyMachineId),
310449
+ hasCmmdRuntimeSpriteIdentity({
310450
+ ...Object.hasOwn(runtime, "spriteName") ? { spriteName: typeof runtime.spriteName === "string" ? runtime.spriteName : null } : {},
310451
+ ...Object.hasOwn(runtime, "flyMachineId") ? { flyMachineId: typeof runtime.flyMachineId === "string" ? runtime.flyMachineId : null } : {}
310452
+ }),
310396
310453
  !Object.hasOwn(runtime, "brokerAuthorityAttestedForgeGitCommit"),
310397
310454
  runtime.brokerAuthorityAttestedImageRef === null,
310398
310455
  runtime.brokerAuthorityAttestedImageVersion === null,
@@ -320464,7 +320521,7 @@ const execFilePromise = promisify$1(execFile);
320464
320521
  const COMMAND_TIMEOUT_MS = 15e3;
320465
320522
  const MAX_COMMAND_OUTPUT_BYTES = 32e3;
320466
320523
  const MAX_PROCESSES = 80;
320467
- const sanitizeRuntimeDiagnosticText = (value) => value.replace(/\b(OPENAI_API_KEY|ANTHROPIC_API_KEY|ANTHROPIC_AUTH_TOKEN|FLY_ACCESS_TOKEN|FLY_API_TOKEN|GITHUB_TOKEN|FORGE_CMMD_RUNTIME_GRANT_TOKEN|FORGE_NPM_PROXY_TOKEN|FORGE_PROXY_HMAC_SECRET|FORGE_PPROXY_HMAC_SECRET|CMMD_FORGE_RUNTIME_TICKET_PRIVATE_KEY|CMMD_FORGE_RUNTIME_BROWSER_WEBRTC_ICE_SERVERS)=\S+/g, "$1=[redacted]").replace(/\bforge_proxy_[A-Za-z0-9._-]+/g, "forge_proxy_[redacted]").replace(/\bcmmd_provider_[A-Za-z0-9._-]+/g, "cmmd_provider_[redacted]").replace(/\bruntime-grant\.[A-Za-z0-9._-]+/g, "runtime-grant.[redacted]").replace(/\b(sk|ghp|github_pat)_[A-Za-z0-9._-]+/g, "$1_[redacted]").replace(/\bsk-[A-Za-z0-9._-]+/g, "sk-[redacted]");
320524
+ const sanitizeRuntimeDiagnosticText = (value) => value.replace(/\b(OPENAI_API_KEY|ANTHROPIC_API_KEY|ANTHROPIC_AUTH_TOKEN|FLY_ACCESS_TOKEN|FLY_API_TOKEN|SPRITES_TOKEN|SPRITE_API_TOKEN|GITHUB_TOKEN|FORGE_CMMD_RUNTIME_GRANT_TOKEN|FORGE_NPM_PROXY_TOKEN|FORGE_PROXY_HMAC_SECRET|FORGE_PPROXY_HMAC_SECRET|CMMD_FORGE_RUNTIME_TICKET_PRIVATE_KEY|CMMD_FORGE_RUNTIME_BROWSER_WEBRTC_ICE_SERVERS)=\S+/g, "$1=[redacted]").replace(/\bforge_proxy_[A-Za-z0-9._-]+/g, "forge_proxy_[redacted]").replace(/\bcmmd_provider_[A-Za-z0-9._-]+/g, "cmmd_provider_[redacted]").replace(/\bruntime-grant\.[A-Za-z0-9._-]+/g, "runtime-grant.[redacted]").replace(/\b(sk|ghp|github_pat)_[A-Za-z0-9._-]+/g, "$1_[redacted]").replace(/\bsk-[A-Za-z0-9._-]+/g, "sk-[redacted]");
320468
320525
  const sanitizeRuntimeDiagnosticValue = (value) => {
320469
320526
  const trimmed = value?.trim();
320470
320527
  if (!trimmed) return void 0;
@@ -320511,16 +320568,15 @@ const parseProcessList = (output) => output.split("\n").map((line) => line.trim(
320511
320568
  if (!Number.isFinite(pid) || !Number.isFinite(ppid) || !stat || !command) return void 0;
320512
320569
  const cpuPercent = parseMeasurement(cpuRaw);
320513
320570
  const rssKb = parseMeasurement(rssRaw);
320514
- const measurements = {};
320515
- if (cpuPercent !== null) measurements.cpuPercent = cpuPercent;
320516
- if (rssKb !== null) measurements.rssKb = rssKb;
320517
- return {
320571
+ const parsed = {
320518
320572
  pid,
320519
320573
  ppid,
320520
320574
  stat: sanitizeRuntimeDiagnosticText(stat),
320521
- command: sanitizeRuntimeDiagnosticText(command),
320522
- ...measurements
320575
+ command: sanitizeRuntimeDiagnosticText(command)
320523
320576
  };
320577
+ if (cpuPercent !== null) parsed.cpuPercent = cpuPercent;
320578
+ if (rssKb !== null) parsed.rssKb = rssKb;
320579
+ return parsed;
320524
320580
  }).filter((process) => process !== void 0).slice(0, MAX_PROCESSES);
320525
320581
  /**
320526
320582
  * The process tree, or the reason there isn't one.
@@ -1,4 +1,4 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Ha as t,Mi as n,Ua as r,Wa as i}from"./Stream-mUTFnSY9.js";import{Al as a,Fn as o,Gc as s,Hr as c,Jc as l,Qr as u,Rr as d,Sr as f,Tn as p,Uc as m,Xr as h,_r as g,d as _,fn as v,fr as y,gr as b,i as x,is as S,jn as C,l as w,m as T,ms as E,n as D,qc as O,qt as k,r as A,u as j,za as M,zr as N}from"./DiffPanelShell-BOfiU8pF.js";import{hn as P}from"./CompositeItem-BsSeqHOM.js";import{a as F,c as I,f as L,i as R,l as z,m as B,n as V,o as H,p as U,r as W,s as G,t as K}from"./Virtualizer-DA9X_YiJ.js";import{Dn as q,at as J,it as ee}from"./src-IM0FnQax.js";import{a as te,c as ne,d as re,h as ie,i as ae,l as oe,m as se,n as ce,o as Y,p as le,r as ue,s as de,t as fe,u as pe}from"./DiffPanel.logic-Bo8iewty.js";var X=e(i(),1),me=typeof window>`u`?X.useEffect:X.useLayoutEffect;function he({fileDiff:e,options:t,editorOptions:n,lineAnnotations:r,selectedLines:i,prerenderedHTML:a,metrics:o,hasGutterRenderUtility:s,hasCustomHeader:c,disableWorkerPool:l,edit:u}){let d=V(),f=i!==void 0,p=(0,X.useContext)(x),m=j(),h=(0,X.useRef)(null),g=_(n=>{if(n!=null){if(h.current!=null)throw Error(`useFileDiffInstance: An instance should not already exist when a node is created`);d==null?h.current=new re(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),l?void 0:p,!0):h.current=new pe(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),d,o,l?void 0:p,!0),h.current.hydrate({fileDiff:e,fileContainer:n,lineAnnotations:r,prerenderedHTML:a})}else{if(h.current==null)throw Error(`useFileDiffInstance: A FileDiff instance should exist when unmounting`);h.current.cleanUp(),h.current=null}});return me(()=>{let{current:n}=h;if(n==null)return;let a=Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),o=a!==void 0&&!k(n.options,a);n.setOptions(a),n.render({forceRender:o,fileDiff:e,lineAnnotations:r}),i!==void 0&&n.setSelectedLines(i)}),me(()=>{if(u&&h.current!=null){if(m===void 0)throw Error(`FileDiff: EditContext is not attached`);let e=m(n??{});if(e==null)throw Error(`FileDiff: EditProvider.createEditor must return an editor instance`);try{return e.edit(h.current)}catch(t){throw e.cleanUp(),t}}},[u]),{ref:g,getHoveredLine:(0,X.useCallback)(()=>h.current?.getHoveredLine(),[])}}function Z({options:e,controlledSelection:t,hasCustomHeader:n,hasGutterRenderUtility:r}){return t||r||n?{...e,controlledSelection:t,renderCustomHeader:n?w:e?.renderCustomHeader,renderGutterUtility:r?w:e?.renderGutterUtility}:e}var Q=r();function ge({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,className:o,style:s,prerenderedHTML:c,renderAnnotation:l,renderCustomHeader:u,renderHeaderPrefix:d,renderHeaderFilenameSuffix:f,renderHeaderMetadata:p,renderGutterUtility:m,disableWorkerPool:h=!1,edit:g=!1}){let{ref:_,getHoveredLine:y}=he({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,prerenderedHTML:c,hasGutterRenderUtility:m!=null,hasCustomHeader:u!=null,disableWorkerPool:h,edit:g});return(0,Q.jsx)(v,{ref:_,className:o,style:s,children:W(oe({fileDiff:e,renderCustomHeader:u,renderHeaderPrefix:d,renderHeaderFilenameSuffix:f,renderHeaderMetadata:p,renderAnnotation:l,renderGutterUtility:m,lineAnnotations:i,getHoveredLine:y}),c)})}var $=t();function _e(e){return e.fromTurnCount===0?q(ee)({threadId:e.threadId,toTurnCount:e.toTurnCount}).pipe(n(e=>({kind:`fullThreadDiff`,input:e}))):q(J)({threadId:e.threadId,fromTurnCount:e.fromTurnCount,toTurnCount:e.toTurnCount}).pipe(n(e=>({kind:`turnDiff`,input:e})))}function ve(e){return e instanceof Error?e.message:typeof e==`string`?e:``}function ye(e){let t=ve(e).trim();if(t.length===0)return`Failed to load checkpoint diff.`;let n=t.toLowerCase();if(n.includes(`not a git repository`))return`Turn diffs are unavailable because this project is not a git repository.`;if(n.includes(`checkpoint unavailable for thread`)||n.includes(`checkpoint invariant violation`)){let e=t.indexOf(`:`);if(e>=0){let n=t.slice(e+1).trim();if(n.length>0)return n}}return t}function be(e){let t=ve(e).toLowerCase();return t.includes(`exceeds current turn count`)||t.includes(`checkpoint is unavailable for turn`)||t.includes(`filesystem checkpoint is unavailable`)}function xe(e){let t=_e(e);return O({queryKey:M.checkpointDiff(e),queryFn:async({signal:n})=>{if(!e.environmentId||!e.threadId||t._tag===`None`)throw Error(`Checkpoint diff is unavailable.`);let r=c(e.environmentId);try{return t.value.kind===`fullThreadDiff`?await r.orchestration.getFullThreadDiff(t.value.input,{signal:n}):await r.orchestration.getTurnDiff(t.value.input,{signal:n})}catch(e){throw Error(ye(e),{cause:e})}},enabled:(e.enabled??!0)&&!!e.environmentId&&!!e.threadId&&t._tag===`Some`,staleTime:1/0,retry:(e,t)=>be(t)?e<12:e<3,retryDelay:(e,t)=>be(t)?Math.min(5e3,250*2**(e-1)):Math.min(1e3,100*2**(e-1))})}function Se(e){if(!(!e.canScrollLeft&&!e.canScrollRight))return{maskImage:`linear-gradient(to right, ${e.canScrollLeft?`transparent 24px, black 72px`:`black`}, ${e.canScrollRight?`black calc(100% - 72px), transparent calc(100% - 24px)`:`black`})`}}function Ce(e){return e instanceof Error?e.message:e?`Failed to load checkpoint diff.`:null}function we(e){return{environmentId:e.environmentId??null,threadId:e.threadId,fromTurnCount:e.range?.fromTurnCount??null,toTurnCount:e.range?.toTurnCount??null,cacheScope:e.selectedTurnId?`turn:${e.selectedTurnId}`:e.conversationCacheScope,enabled:e.enabled}}function Te(){let e=(0,$.c)(8),t=(0,X.useRef)(null),[n,r]=(0,X.useState)(!1),[i,a]=(0,X.useState)(!1),o;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(o=()=>{let e=t.current;if(!e){r(!1),a(!1);return}let n=de({scrollLeft:e.scrollLeft,scrollWidth:e.scrollWidth,clientWidth:e.clientWidth});r(n.canScrollLeft),a(n.canScrollRight)},e[0]=o):o=e[0];let s=o,c;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(c=e=>{t.current?.scrollBy({left:e,behavior:`smooth`})},e[1]=c):c=e[1];let l=c,u;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(u=e=>{let n=t.current;n&&ne({scrollWidth:n.scrollWidth,clientWidth:n.clientWidth,deltaX:e.deltaX,deltaY:e.deltaY})&&(e.preventDefault(),n.scrollBy({left:e.deltaY,behavior:`auto`}))},e[2]=u):u=e[2];let d=u,f,p;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(f=()=>{let e=t.current;if(!e)return;let n=window.requestAnimationFrame(s),r=()=>s();e.addEventListener(`scroll`,r,{passive:!0});let i=new ResizeObserver(()=>s());return i.observe(e),()=>{window.cancelAnimationFrame(n),e.removeEventListener(`scroll`,r),i.disconnect()}},p=[s],e[3]=f,e[4]=p):(f=e[3],p=e[4]),(0,X.useEffect)(f,p);let m;return e[5]!==n||e[6]!==i?(m={ref:t,canScrollLeft:n,canScrollRight:i,scrollBy:l,onWheel:d,remeasure:s},e[5]=n,e[6]=i,e[7]=m):m=e[7],m}function Ee(e,t){let n=(0,$.c)(5),r;n[0]===e.current?r=n[1]:(r=()=>{(e.current?.querySelector(`[data-turn-chip-selected='true']`))?.scrollIntoView({block:`nearest`,inline:`nearest`,behavior:`smooth`})},n[0]=e.current,n[1]=r);let i;n[2]!==e||n[3]!==t?(i=[e,t],n[2]=e,n[3]=t,n[4]=i):i=n[4],(0,X.useEffect)(r,i)}var De=`
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Ha as t,Mi as n,Ua as r,Wa as i}from"./Stream-mUTFnSY9.js";import{Al as a,Fn as o,Gc as s,Hr as c,Jc as l,Qr as u,Rr as d,Sr as f,Tn as p,Uc as m,Xr as h,_r as g,d as _,fn as v,fr as y,gr as b,i as x,is as S,jn as C,l as w,m as T,ms as E,n as D,qc as O,qt as k,r as A,u as j,za as M,zr as N}from"./DiffPanelShell-COwQln6y.js";import{hn as P}from"./CompositeItem-BsSeqHOM.js";import{a as F,c as I,f as L,i as R,l as z,m as B,n as V,o as H,p as U,r as W,s as G,t as K}from"./Virtualizer-BYyEY2Dk.js";import{Dn as q,at as J,it as ee}from"./src-IM0FnQax.js";import{a as te,c as ne,d as re,h as ie,i as ae,l as oe,m as se,n as ce,o as Y,p as le,r as ue,s as de,t as fe,u as pe}from"./DiffPanel.logic-N-_02IKx.js";var X=e(i(),1),me=typeof window>`u`?X.useEffect:X.useLayoutEffect;function he({fileDiff:e,options:t,editorOptions:n,lineAnnotations:r,selectedLines:i,prerenderedHTML:a,metrics:o,hasGutterRenderUtility:s,hasCustomHeader:c,disableWorkerPool:l,edit:u}){let d=V(),f=i!==void 0,p=(0,X.useContext)(x),m=j(),h=(0,X.useRef)(null),g=_(n=>{if(n!=null){if(h.current!=null)throw Error(`useFileDiffInstance: An instance should not already exist when a node is created`);d==null?h.current=new re(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),l?void 0:p,!0):h.current=new pe(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),d,o,l?void 0:p,!0),h.current.hydrate({fileDiff:e,fileContainer:n,lineAnnotations:r,prerenderedHTML:a})}else{if(h.current==null)throw Error(`useFileDiffInstance: A FileDiff instance should exist when unmounting`);h.current.cleanUp(),h.current=null}});return me(()=>{let{current:n}=h;if(n==null)return;let a=Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),o=a!==void 0&&!k(n.options,a);n.setOptions(a),n.render({forceRender:o,fileDiff:e,lineAnnotations:r}),i!==void 0&&n.setSelectedLines(i)}),me(()=>{if(u&&h.current!=null){if(m===void 0)throw Error(`FileDiff: EditContext is not attached`);let e=m(n??{});if(e==null)throw Error(`FileDiff: EditProvider.createEditor must return an editor instance`);try{return e.edit(h.current)}catch(t){throw e.cleanUp(),t}}},[u]),{ref:g,getHoveredLine:(0,X.useCallback)(()=>h.current?.getHoveredLine(),[])}}function Z({options:e,controlledSelection:t,hasCustomHeader:n,hasGutterRenderUtility:r}){return t||r||n?{...e,controlledSelection:t,renderCustomHeader:n?w:e?.renderCustomHeader,renderGutterUtility:r?w:e?.renderGutterUtility}:e}var Q=r();function ge({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,className:o,style:s,prerenderedHTML:c,renderAnnotation:l,renderCustomHeader:u,renderHeaderPrefix:d,renderHeaderFilenameSuffix:f,renderHeaderMetadata:p,renderGutterUtility:m,disableWorkerPool:h=!1,edit:g=!1}){let{ref:_,getHoveredLine:y}=he({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,prerenderedHTML:c,hasGutterRenderUtility:m!=null,hasCustomHeader:u!=null,disableWorkerPool:h,edit:g});return(0,Q.jsx)(v,{ref:_,className:o,style:s,children:W(oe({fileDiff:e,renderCustomHeader:u,renderHeaderPrefix:d,renderHeaderFilenameSuffix:f,renderHeaderMetadata:p,renderAnnotation:l,renderGutterUtility:m,lineAnnotations:i,getHoveredLine:y}),c)})}var $=t();function _e(e){return e.fromTurnCount===0?q(ee)({threadId:e.threadId,toTurnCount:e.toTurnCount}).pipe(n(e=>({kind:`fullThreadDiff`,input:e}))):q(J)({threadId:e.threadId,fromTurnCount:e.fromTurnCount,toTurnCount:e.toTurnCount}).pipe(n(e=>({kind:`turnDiff`,input:e})))}function ve(e){return e instanceof Error?e.message:typeof e==`string`?e:``}function ye(e){let t=ve(e).trim();if(t.length===0)return`Failed to load checkpoint diff.`;let n=t.toLowerCase();if(n.includes(`not a git repository`))return`Turn diffs are unavailable because this project is not a git repository.`;if(n.includes(`checkpoint unavailable for thread`)||n.includes(`checkpoint invariant violation`)){let e=t.indexOf(`:`);if(e>=0){let n=t.slice(e+1).trim();if(n.length>0)return n}}return t}function be(e){let t=ve(e).toLowerCase();return t.includes(`exceeds current turn count`)||t.includes(`checkpoint is unavailable for turn`)||t.includes(`filesystem checkpoint is unavailable`)}function xe(e){let t=_e(e);return O({queryKey:M.checkpointDiff(e),queryFn:async({signal:n})=>{if(!e.environmentId||!e.threadId||t._tag===`None`)throw Error(`Checkpoint diff is unavailable.`);let r=c(e.environmentId);try{return t.value.kind===`fullThreadDiff`?await r.orchestration.getFullThreadDiff(t.value.input,{signal:n}):await r.orchestration.getTurnDiff(t.value.input,{signal:n})}catch(e){throw Error(ye(e),{cause:e})}},enabled:(e.enabled??!0)&&!!e.environmentId&&!!e.threadId&&t._tag===`Some`,staleTime:1/0,retry:(e,t)=>be(t)?e<12:e<3,retryDelay:(e,t)=>be(t)?Math.min(5e3,250*2**(e-1)):Math.min(1e3,100*2**(e-1))})}function Se(e){if(!(!e.canScrollLeft&&!e.canScrollRight))return{maskImage:`linear-gradient(to right, ${e.canScrollLeft?`transparent 24px, black 72px`:`black`}, ${e.canScrollRight?`black calc(100% - 72px), transparent calc(100% - 24px)`:`black`})`}}function Ce(e){return e instanceof Error?e.message:e?`Failed to load checkpoint diff.`:null}function we(e){return{environmentId:e.environmentId??null,threadId:e.threadId,fromTurnCount:e.range?.fromTurnCount??null,toTurnCount:e.range?.toTurnCount??null,cacheScope:e.selectedTurnId?`turn:${e.selectedTurnId}`:e.conversationCacheScope,enabled:e.enabled}}function Te(){let e=(0,$.c)(8),t=(0,X.useRef)(null),[n,r]=(0,X.useState)(!1),[i,a]=(0,X.useState)(!1),o;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(o=()=>{let e=t.current;if(!e){r(!1),a(!1);return}let n=de({scrollLeft:e.scrollLeft,scrollWidth:e.scrollWidth,clientWidth:e.clientWidth});r(n.canScrollLeft),a(n.canScrollRight)},e[0]=o):o=e[0];let s=o,c;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(c=e=>{t.current?.scrollBy({left:e,behavior:`smooth`})},e[1]=c):c=e[1];let l=c,u;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(u=e=>{let n=t.current;n&&ne({scrollWidth:n.scrollWidth,clientWidth:n.clientWidth,deltaX:e.deltaX,deltaY:e.deltaY})&&(e.preventDefault(),n.scrollBy({left:e.deltaY,behavior:`auto`}))},e[2]=u):u=e[2];let d=u,f,p;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(f=()=>{let e=t.current;if(!e)return;let n=window.requestAnimationFrame(s),r=()=>s();e.addEventListener(`scroll`,r,{passive:!0});let i=new ResizeObserver(()=>s());return i.observe(e),()=>{window.cancelAnimationFrame(n),e.removeEventListener(`scroll`,r),i.disconnect()}},p=[s],e[3]=f,e[4]=p):(f=e[3],p=e[4]),(0,X.useEffect)(f,p);let m;return e[5]!==n||e[6]!==i?(m={ref:t,canScrollLeft:n,canScrollRight:i,scrollBy:l,onWheel:d,remeasure:s},e[5]=n,e[6]=i,e[7]=m):m=e[7],m}function Ee(e,t){let n=(0,$.c)(5),r;n[0]===e.current?r=n[1]:(r=()=>{(e.current?.querySelector(`[data-turn-chip-selected='true']`))?.scrollIntoView({block:`nearest`,inline:`nearest`,behavior:`smooth`})},n[0]=e.current,n[1]=r);let i;n[2]!==e||n[3]!==t?(i=[e,t],n[2]=e,n[3]=t,n[4]=i):i=n[4],(0,X.useEffect)(r,i)}var De=`
2
2
  [data-diffs-header],
3
3
  [data-diff],
4
4
  [data-file],
@@ -61,4 +61,4 @@ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Ha as t,Mi as n,Ua as
61
61
  text-decoration-color: currentColor;
62
62
  }
63
63
  `;function Oe(e){let t=(0,$.c)(44),{mode:n}=e,r=n===void 0?`inline`:n,{resolvedTheme:i}=b(),a=g(),[c,l]=(0,X.useState)(`stacked`),[u,d]=(0,X.useState)(a.diffWordWrap),h=(0,X.useRef)(null),_=(0,X.useRef)(!1),v=Te(),{activeCwd:y,activeThread:x,bodyState:S,diffOpen:C,inferredCheckpointTurnCountByTurnId:w,orderedTurnDiffSummaries:T,renderableFiles:E,renderablePatch:D,selectedFilePath:O,selectedTurn:k,selectedTurnId:j}=Le(i),M,P;t[0]!==C||t[1]!==a.diffWordWrap?(M=()=>{C&&!_.current&&d(a.diffWordWrap),_.current=C},P=[C,a.diffWordWrap],t[0]=C,t[1]=a.diffWordWrap,t[2]=M,t[3]=P):(M=t[2],P=t[3]),(0,X.useEffect)(M,P);let F;t[4]===O?F=t[5]:(F=()=>{!O||!h.current||Array.from(h.current.querySelectorAll(`[data-diff-file-path]`)).find(e=>e.dataset.diffFilePath===O)?.scrollIntoView({block:`nearest`})},t[4]=O,t[5]=F);let I;t[6]!==E||t[7]!==O?(I=[O,E],t[6]=E,t[7]=O,t[8]=I):I=t[8],(0,X.useEffect)(F,I);let L;t[9]===y?L=t[10]:(L=e=>{let t=f();if(!t)return;let n=y?p(e,y):e;N(t,n).catch(ke)},t[9]=y,t[10]=L);let R=L,z;t[11]===x?z=t[12]:(z=e=>{x&&o.getState().openDiff(s(m(x.environmentId,x.id)),e)},t[11]=x,t[12]=z);let B=z,V;t[13]===x?V=t[14]:(V=()=>{x&&o.getState().openDiff(s(m(x.environmentId,x.id)))},t[13]=x,t[14]=V);let H=V,U;t[15]===v.remeasure?U=t[16]:(U=()=>{let e=window.requestAnimationFrame(v.remeasure);return()=>window.cancelAnimationFrame(e)},t[15]=v.remeasure,t[16]=U);let W;t[17]!==T||t[18]!==j||t[19]!==v.remeasure?(W=[T,j,v.remeasure],t[17]=T,t[18]=j,t[19]=v.remeasure,t[20]=W):W=t[20],(0,X.useEffect)(U,W),Ee(v.ref,k?.turnId??j);let G;t[21]!==c||t[22]!==u||t[23]!==w||t[24]!==T||t[25]!==B||t[26]!==H||t[27]!==k||t[28]!==j||t[29]!==a||t[30]!==v?(G=(0,Q.jsx)(Ae,{diffRenderMode:c,diffWordWrap:u,inferredCheckpointTurnCountByTurnId:w,orderedTurnDiffSummaries:T,selectTurn:B,selectWholeConversation:H,selectedTurn:k,selectedTurnId:j,setDiffRenderMode:l,setDiffWordWrap:d,settings:a,turnStrip:v}),t[21]=c,t[22]=u,t[23]=w,t[24]=T,t[25]=B,t[26]=H,t[27]=k,t[28]=j,t[29]=a,t[30]=v,t[31]=G):G=t[31];let K=G,q;t[32]!==S||t[33]!==c||t[34]!==u||t[35]!==R||t[36]!==E||t[37]!==D||t[38]!==i?(q=(0,Q.jsx)(je,{bodyState:S,diffRenderMode:c,diffWordWrap:u,openDiffFileInEditor:R,patchViewportRef:h,renderableFiles:E,renderablePatch:D,resolvedTheme:i}),t[32]=S,t[33]=c,t[34]=u,t[35]=R,t[36]=E,t[37]=D,t[38]=i,t[39]=q):q=t[39];let J;return t[40]!==K||t[41]!==r||t[42]!==q?(J=(0,Q.jsx)(A,{mode:r,header:K,children:q}),t[40]=K,t[41]=r,t[42]=q,t[43]=J):J=t[43],J}function ke(e){console.warn(`Failed to open diff file in editor.`,e)}function Ae(e){let t=(0,$.c)(59),{diffRenderMode:n,diffWordWrap:r,inferredCheckpointTurnCountByTurnId:i,orderedTurnDiffSummaries:a,selectTurn:o,selectWholeConversation:s,selectedTurn:c,selectedTurnId:l,setDiffRenderMode:u,setDiffWordWrap:d,settings:f,turnStrip:p}=e,m,h;t[0]===p?(m=t[1],h=t[2]):(m=(0,Q.jsx)(Be,{direction:`left`,strip:p}),h=(0,Q.jsx)(Be,{direction:`right`,strip:p}),t[0]=p,t[1]=m,t[2]=h);let g=p.ref,_;t[3]!==p.canScrollLeft||t[4]!==p.canScrollRight?(_=Se({canScrollLeft:p.canScrollLeft,canScrollRight:p.canScrollRight}),t[3]=p.canScrollLeft,t[4]=p.canScrollRight,t[5]=_):_=t[5];let v=p.onWheel,y=l===null,b=l===null?`border-border bg-accent text-accent-foreground`:`border-border/70 bg-background/70 text-muted-foreground/80 hover:border-border hover:text-foreground/80`,x;t[6]===b?x=t[7]:(x=P(`rounded-md border px-2 py-1 text-left transition-colors`,b),t[6]=b,t[7]=x);let S;t[8]===Symbol.for(`react.memo_cache_sentinel`)?(S=(0,Q.jsx)(`div`,{className:`text-[10px] leading-tight font-medium`,children:`All turns`}),t[8]=S):S=t[8];let C;t[9]===x?C=t[10]:(C=(0,Q.jsx)(`div`,{className:x,children:S}),t[9]=x,t[10]=C);let w;t[11]!==s||t[12]!==C||t[13]!==y?(w=(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-md`,onClick:s,"data-turn-chip-selected":y,children:C}),t[11]=s,t[12]=C,t[13]=y,t[14]=w):w=t[14];let T;if(t[15]!==i||t[16]!==a||t[17]!==o||t[18]!==c?.turnId||t[19]!==f){let e;t[21]!==i||t[22]!==o||t[23]!==c?.turnId||t[24]!==f?(e=e=>(0,Q.jsx)(Ve,{summary:e,selected:e.turnId===c?.turnId,turnCount:e.checkpointTurnCount??i[e.turnId],timestampFormat:f.timestampFormat,onSelect:o},e.turnId),t[21]=i,t[22]=o,t[23]=c?.turnId,t[24]=f,t[25]=e):e=t[25],T=a.map(e),t[15]=i,t[16]=a,t[17]=o,t[18]=c?.turnId,t[19]=f,t[20]=T}else T=t[20];let E;t[26]!==w||t[27]!==T||t[28]!==_||t[29]!==p.onWheel||t[30]!==p.ref?(E=(0,Q.jsxs)(`div`,{ref:g,className:`turn-chip-strip flex gap-1 overflow-x-auto px-8 py-0.5`,style:_,onWheel:v,children:[w,T]}),t[26]=w,t[27]=T,t[28]=_,t[29]=p.onWheel,t[30]=p.ref,t[31]=E):E=t[31];let D;t[32]!==m||t[33]!==E||t[34]!==h?(D=(0,Q.jsxs)(`div`,{className:`relative min-w-0 flex-1 [-webkit-app-region:no-drag]`,children:[m,h,E]}),t[32]=m,t[33]=E,t[34]=h,t[35]=D):D=t[35];let O;t[36]===n?O=t[37]:(O=[n],t[36]=n,t[37]=O);let k;t[38]===u?k=t[39]:(k=e=>{let t=e[0];(t===`stacked`||t===`split`)&&u(t)},t[38]=u,t[39]=k);let A;t[40]===Symbol.for(`react.memo_cache_sentinel`)?(A=(0,Q.jsx)(R,{"aria-label":`Stacked diff view`,value:`stacked`,children:(0,Q.jsx)(se,{className:`size-3`})}),t[40]=A):A=t[40];let j;t[41]===Symbol.for(`react.memo_cache_sentinel`)?(j=(0,Q.jsx)(R,{"aria-label":`Split diff view`,value:`split`,children:(0,Q.jsx)(ie,{className:`size-3`})}),t[41]=j):j=t[41];let M;t[42]!==O||t[43]!==k?(M=(0,Q.jsxs)(F,{className:`shrink-0`,variant:`outline`,size:`xs`,value:O,onValueChange:k,children:[A,j]}),t[42]=O,t[43]=k,t[44]=M):M=t[44];let N=r?`Disable diff line wrapping`:`Enable diff line wrapping`,I=r?`Disable line wrapping`:`Enable line wrapping`,L;t[45]===d?L=t[46]:(L=e=>{d(!!e)},t[45]=d,t[46]=L);let z;t[47]===Symbol.for(`react.memo_cache_sentinel`)?(z=(0,Q.jsx)(le,{className:`size-3`}),t[47]=z):z=t[47];let B;t[48]!==r||t[49]!==N||t[50]!==I||t[51]!==L?(B=(0,Q.jsx)(R,{"aria-label":N,title:I,variant:`outline`,size:`xs`,pressed:r,onPressedChange:L,children:z}),t[48]=r,t[49]=N,t[50]=I,t[51]=L,t[52]=B):B=t[52];let V;t[53]!==M||t[54]!==B?(V=(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 [-webkit-app-region:no-drag]`,children:[M,B]}),t[53]=M,t[54]=B,t[55]=V):V=t[55];let H;return t[56]!==D||t[57]!==V?(H=(0,Q.jsxs)(Q.Fragment,{children:[D,V]}),t[56]=D,t[57]=V,t[58]=H):H=t[58],H}function je(e){let t=(0,$.c)(18),{bodyState:n,diffRenderMode:r,diffWordWrap:i,openDiffFileInEditor:a,patchViewportRef:o,renderableFiles:s,renderablePatch:c,resolvedTheme:l}=e;if(n.kind===`no-thread`){let e;return t[0]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(Ne,{children:`Select a thread to inspect turn diffs.`}),t[0]=e):e=t[0],e}if(n.kind===`not-git-repo`){let e;return t[1]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(Ne,{children:`Turn diffs are unavailable because this project is not a git repository.`}),t[1]=e):e=t[1],e}if(n.kind===`no-completed-turns`){let e;return t[2]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(Ne,{children:`No completed turns yet.`}),t[2]=e):e=t[2],e}let u;t[3]!==n.error||t[4]!==c?(u=n.error&&!c&&(0,Q.jsx)(`div`,{className:`px-3`,children:(0,Q.jsx)(`p`,{className:`mb-2 text-[11px] text-destructive-foreground`,children:n.error})}),t[3]=n.error,t[4]=c,t[5]=u):u=t[5];let d;t[6]!==n||t[7]!==r||t[8]!==i||t[9]!==a||t[10]!==s||t[11]!==c||t[12]!==l?(d=c?c.kind===`files`?(0,Q.jsx)(K,{className:`diff-render-surface h-full min-h-0 overflow-auto px-2 pb-2`,config:{overscrollSize:600,intersectionObserverMargin:1200},children:s.map(e=>{let t=Y(e),n=`${fe(e)}:${l}`;return(0,Q.jsx)(`div`,{"data-diff-file-path":t,className:`diff-render-file mb-2 rounded-md first:mt-2 last:mb-0`,onClickCapture:e=>{(e.nativeEvent.composedPath?.()??[]).some(Me)&&a(t)},children:(0,Q.jsx)(ge,{fileDiff:e,options:{diffStyle:r===`split`?`split`:`unified`,lineDiffType:`none`,overflow:i?`wrap`:`scroll`,theme:T(l),themeType:l,unsafeCSS:De}})},n)})}):(0,Q.jsx)(`div`,{className:`h-full overflow-auto p-2`,children:(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(`p`,{className:`text-[11px] text-muted-foreground/75`,children:c.reason}),(0,Q.jsx)(`pre`,{className:P(`max-h-[72vh] rounded-md border border-border/70 bg-background/70 p-3 font-mono text-[11px] leading-relaxed text-muted-foreground/90`,i?`overflow-auto whitespace-pre-wrap wrap-break-word`:`overflow-auto`),children:c.text})]})}):(0,Q.jsx)(Re,{bodyState:n}),t[6]=n,t[7]=r,t[8]=i,t[9]=a,t[10]=s,t[11]=c,t[12]=l,t[13]=d):d=t[13];let f;return t[14]!==o||t[15]!==u||t[16]!==d?(f=(0,Q.jsx)(Q.Fragment,{children:(0,Q.jsxs)(`div`,{ref:o,className:`diff-panel-viewport min-h-0 min-w-0 flex-1 overflow-hidden`,children:[u,d]})}),t[14]=o,t[15]=u,t[16]=d,t[17]=f):f=t[17],f}function Me(e){return e instanceof Element&&e.hasAttribute(`data-title`)}function Ne(e){let t=(0,$.c)(2),{children:n}=e,r;return t[0]===n?r=t[1]:(r=(0,Q.jsx)(`div`,{className:`flex flex-1 items-center justify-center px-5 text-center text-xs text-muted-foreground/70`,children:n}),t[0]=n,t[1]=r),r}function Pe(){let e=(0,$.c)(19),t;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t={strict:!1,select:Ie},e[0]=t):t=e[0];let n=a(t),r;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(r={strict:!1,select:Fe},e[1]=r):r=e[1];let i=B(r),o=i.rightPanel===`diff`,s=n?.threadId??null,c,l;e[2]===n?l=e[3]:(l=C(n),e[2]=n,e[3]=l),c=l;let u=E(c),f=He(u),p=u?.worktreePath,m=f?.cwd,h;e[4]!==p||e[5]!==m?(h=I({threadWorktreePath:p,projectCwd:m}),e[4]=p,e[5]=m,e[6]=h):h=e[6];let g=h,_=u?.environmentId??null,v=g??null,y;e[7]!==_||e[8]!==v?(y={environmentId:_,cwd:v},e[7]=_,e[8]=v,e[9]=y):y=e[9];let b=d(y),x;e[10]===b.data?x=e[11]:(x=z(b.data),e[10]=b.data,e[11]=x);let S=x,w;return e[12]!==g||e[13]!==u||e[14]!==s||e[15]!==o||e[16]!==i||e[17]!==S?(w={activeThread:u,activeThreadId:s,activeCwd:g,isGitRepo:S,diffSearch:i,diffOpen:o},e[12]=g,e[13]=u,e[14]=s,e[15]=o,e[16]=i,e[17]=S,e[18]=w):w=e[18],w}function Fe(e){return G(e)}function Ie(e){return h(e)}function Le(e){let{activeThread:t,activeThreadId:n,activeCwd:r,isGitRepo:i,diffSearch:a,diffOpen:o}=Pe(),{turnDiffSummaries:s,inferredCheckpointTurnCountByTurnId:c}=H(t),u=a.diffTurnId??null,d=u===null?null:a.diffFilePath??null,{activeCheckpointRange:f,conversationCacheScope:p,orderedTurnDiffSummaries:m,selectedTurn:h}=(0,X.useMemo)(()=>te({summaries:s,inferredCheckpointTurnCountByTurnId:c,selectedTurnId:u}),[c,u,s]),g=l(xe(we({environmentId:t?.environmentId,threadId:n,range:f,selectedTurnId:h?.turnId,conversationCacheScope:p,enabled:i}))),_=g.isLoading,v=Ce(g.error),y=g.data?.diff,b=typeof y==`string`&&y.trim().length===0,{emptyDiffMessage:x}=(0,X.useMemo)(()=>ae(h),[h]),S=(0,X.useMemo)(()=>ce(y,`diff-panel:${e}`),[e,y]),C=(0,X.useMemo)(()=>Ue(S),[S]);return{activeCwd:r,activeThread:t,bodyState:ue({hasActiveThread:!!t,isGitRepo:i,turnSummaryCount:m.length,checkpointDiffError:v,hasRenderablePatch:!!S,isLoadingCheckpointDiff:_,hasNoNetChanges:b,emptyDiffMessage:x}),diffOpen:o,inferredCheckpointTurnCountByTurnId:c,orderedTurnDiffSummaries:m,renderableFiles:C,renderablePatch:S,selectedFilePath:d,selectedTurn:h,selectedTurnId:u}}function Re(e){let t=(0,$.c)(4),{bodyState:n}=e;if(n.kind===`loading`){let e;return t[0]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(D,{label:`Loading checkpoint diff...`}),t[0]=e):e=t[0],e}let r;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,Q.jsx)(L,{className:`size-7 text-muted-foreground/25`}),t[1]=r):r=t[1];let i=n.kind===`empty`?n.message:`No diff is available for this range.`,a;return t[2]===i?a=t[3]:(a=(0,Q.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-2 px-5 py-2 text-center`,children:[r,(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground/70`,children:i})]}),t[2]=i,t[3]=a),a}var ze=180;function Be(e){let t=(0,$.c)(14),{direction:n,strip:r}=e,i=n===`left`,a=i?r.canScrollLeft:r.canScrollRight,o=i?U:u,s=i?`left-0`:`right-0`,c=a?`border-border/70 hover:border-border hover:text-foreground`:`cursor-not-allowed border-border/40 text-muted-foreground/40`,l;t[0]!==s||t[1]!==c?(l=P(`absolute top-1/2 z-20 inline-flex size-6 -translate-y-1/2 items-center justify-center rounded-md border bg-background/90 text-muted-foreground transition-colors`,s,c),t[0]=s,t[1]=c,t[2]=l):l=t[2];let d;t[3]!==i||t[4]!==r?(d=()=>r.scrollBy(i?-180:ze),t[3]=i,t[4]=r,t[5]=d):d=t[5];let f=!a,p=`Scroll turn list ${n}`,m;t[6]===o?m=t[7]:(m=(0,Q.jsx)(o,{className:`size-3.5`}),t[6]=o,t[7]=m);let h;return t[8]!==l||t[9]!==d||t[10]!==f||t[11]!==p||t[12]!==m?(h=(0,Q.jsx)(`button`,{type:`button`,className:l,onClick:d,disabled:f,"aria-label":p,children:m}),t[8]=l,t[9]=d,t[10]=f,t[11]=p,t[12]=m,t[13]=h):h=t[13],h}function Ve(e){let t=(0,$.c)(23),{summary:n,selected:r,turnCount:i,timestampFormat:a,onSelect:o}=e,s;t[0]!==o||t[1]!==n.turnId?(s=()=>o(n.turnId),t[0]=o,t[1]=n.turnId,t[2]=s):s=t[2];let c=n.turnId,l=r?`border-border bg-accent text-accent-foreground`:`border-border/70 bg-background/70 text-muted-foreground/80 hover:border-border hover:text-foreground/80`,u;t[3]===l?u=t[4]:(u=P(`rounded-md border px-2 py-1 text-left transition-colors`,l),t[3]=l,t[4]=u);let d=i??`?`,f;t[5]===d?f=t[6]:(f=(0,Q.jsxs)(`span`,{className:`text-[10px] leading-tight font-medium`,children:[`Turn `,d]}),t[5]=d,t[6]=f);let p;t[7]!==n.completedAt||t[8]!==a?(p=y(n.completedAt,a),t[7]=n.completedAt,t[8]=a,t[9]=p):p=t[9];let m;t[10]===p?m=t[11]:(m=(0,Q.jsx)(`span`,{className:`text-[9px] leading-tight opacity-70`,children:p}),t[10]=p,t[11]=m);let h;t[12]!==f||t[13]!==m?(h=(0,Q.jsxs)(`div`,{className:`flex items-center gap-1`,children:[f,m]}),t[12]=f,t[13]=m,t[14]=h):h=t[14];let g;t[15]!==u||t[16]!==h?(g=(0,Q.jsx)(`div`,{className:u,children:h}),t[15]=u,t[16]=h,t[17]=g):g=t[17];let _;return t[18]!==r||t[19]!==n.turnId||t[20]!==s||t[21]!==g?(_=(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-md`,onClick:s,title:c,"data-turn-chip-selected":r,children:g}),t[18]=r,t[19]=n.turnId,t[20]=s,t[21]=g,t[22]=_):_=t[22],_}function He(e){let t=(0,$.c)(3),n=e?.environmentId,r=e?.projectId,i;return t[0]!==n||t[1]!==r?(i=e=>n&&r?S(e,{environmentId:n,projectId:r}):void 0,t[0]=n,t[1]=r,t[2]=i):i=t[2],E(i)}function Ue(e){return!e||e.kind!==`files`?[]:e.files.toSorted((e,t)=>Y(e).localeCompare(Y(t),void 0,{numeric:!0,sensitivity:`base`}))}export{Oe as default};
64
- //# sourceMappingURL=DiffPanel-CMYTuX9T.js.map
64
+ //# sourceMappingURL=DiffPanel-C3dfPMJX.js.map