@cmmd-center/forge 0.13.88 → 0.13.89

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.mjs CHANGED
@@ -66005,7 +66005,7 @@ function normalizeNumberish(value) {
66005
66005
  }
66006
66006
  //#endregion
66007
66007
  //#region package.json
66008
- var version$1 = "0.13.88";
66008
+ var version$1 = "0.13.89";
66009
66009
  //#endregion
66010
66010
  //#region src/sentry.ts
66011
66011
  const SERVER_APP_NAME = "forge-server";
@@ -241348,6 +241348,22 @@ function resolveSpriteTaskHoldConfig(env = process.env) {
241348
241348
  function spriteTaskHoldName(namePrefix, turnId) {
241349
241349
  return `${namePrefix}${turnId}`;
241350
241350
  }
241351
+ /**
241352
+ * Thrown by the production transport when the guest API answers a non-2xx
241353
+ * status. Carries the status so a caller can tell a 409 (already held, and
241354
+ * generally benign) apart from a real transport failure.
241355
+ */
241356
+ var SpriteTaskHoldTransportError = class extends Error {
241357
+ status;
241358
+ constructor(status) {
241359
+ super(`sprite task API responded ${status}`);
241360
+ this.name = "SpriteTaskHoldTransportError";
241361
+ this.status = status;
241362
+ }
241363
+ };
241364
+ function transportStatus(cause) {
241365
+ return cause instanceof SpriteTaskHoldTransportError ? cause.status : void 0;
241366
+ }
241351
241367
  const noTimer = () => {};
241352
241368
  /**
241353
241369
  * Resolve with `promise`, but stop waiting after `timeoutMs`. Rejections pass
@@ -241381,12 +241397,25 @@ var SpriteTaskHoldManager = class {
241381
241397
  #transport;
241382
241398
  #timer;
241383
241399
  #onError;
241400
+ #onEvent;
241384
241401
  #holds = /* @__PURE__ */ new Map();
241385
241402
  constructor(options) {
241386
241403
  this.#config = options.config;
241387
241404
  this.#transport = options.transport;
241388
241405
  this.#timer = options.timer ?? DEFAULT_TIMER;
241389
241406
  this.#onError = options.onError ?? (() => {});
241407
+ this.#onEvent = options.onEvent ?? (() => {});
241408
+ }
241409
+ /** Compose and report one acquire/refresh/release outcome, if a caller wants to log it. */
241410
+ #emitEvent(action, holdKey, hold, outcome, status) {
241411
+ this.#onEvent({
241412
+ action,
241413
+ holdKey,
241414
+ holdName: hold.name,
241415
+ threadId: hold.threadId,
241416
+ outcome,
241417
+ ...status !== void 0 ? { status } : {}
241418
+ });
241390
241419
  }
241391
241420
  /** Turn ids that currently hold the sprite awake. Test/diagnostic surface. */
241392
241421
  activeTurnIds() {
@@ -241395,10 +241424,19 @@ var SpriteTaskHoldManager = class {
241395
241424
  /**
241396
241425
  * `maxRefreshes` bounds a hold that has no terminal event of its own, such as a launch
241397
241426
  * whose turn may never start. When the budget is spent the hold releases itself.
241427
+ *
241428
+ * Resolves to whether this hold has ever landed a PUT, never throwing (a
241429
+ * hold problem must not fail a turn). A caller handing off from a
241430
+ * predecessor hold (forge#3589) must not release it on anything less than
241431
+ * "succeeded": a failed initial PUT still installs the refresher below and
241432
+ * keeps retrying every `SPRITE_TASK_HOLD_REFRESH_MS`, so the predecessor is
241433
+ * the only thing covering the sprite until one of those retries lands. A
241434
+ * duplicate call against a live, unreleased hold reports that hold's own
241435
+ * confirmed state rather than a blanket "succeeded", for the same reason.
241398
241436
  */
241399
241437
  async acquire(turnId, threadId = null, options = {}) {
241400
- const existing = this.#holds.get(turnId);
241401
- if (existing !== void 0 && !existing.released) return;
241438
+ const existing = this.#liveHold(turnId);
241439
+ if (existing !== void 0) return existing.confirmed ? "succeeded" : "failed";
241402
241440
  let refreshesLeft = options.maxRefreshes ?? Number.POSITIVE_INFINITY;
241403
241441
  const name = spriteTaskHoldName(this.#config.namePrefix, turnId);
241404
241442
  const hold = {
@@ -241410,24 +241448,54 @@ var SpriteTaskHoldManager = class {
241410
241448
  phase: "idle",
241411
241449
  releaseAttempt: null,
241412
241450
  deletion: null,
241413
- uncertainPut: false
241451
+ uncertainPut: false,
241452
+ confirmed: false
241414
241453
  };
241415
241454
  this.#holds.set(turnId, hold);
241416
241455
  const put = this.#transport.put(name, 300);
241417
241456
  const tracked = put.then(() => "succeeded", () => "failed");
241418
241457
  hold.inFlight.add(tracked);
241458
+ let outcome = "succeeded";
241419
241459
  try {
241420
241460
  await put;
241421
241461
  hold.uncertainPut = false;
241462
+ hold.confirmed = true;
241463
+ this.#emitEvent("acquire", turnId, hold, "success");
241422
241464
  } catch (cause) {
241465
+ outcome = "failed";
241423
241466
  hold.uncertainPut = true;
241424
241467
  hold.inFlight.delete(tracked);
241425
241468
  this.#onError(`failed to acquire sprite task hold for turn ${turnId}`, cause);
241426
- if (hold.released || this.#holds.get(turnId) !== hold) return;
241469
+ this.#emitEvent("acquire", turnId, hold, "failure", transportStatus(cause));
241470
+ if (this.#isStale(turnId, hold)) return outcome;
241427
241471
  }
241428
241472
  hold.inFlight.delete(tracked);
241429
- if (hold.released || this.#holds.get(turnId) !== hold) return;
241430
- hold.refresher = this.#timer.setInterval(() => {
241473
+ if (this.#isStale(turnId, hold)) return outcome;
241474
+ hold.refresher = this.#installRefresher(turnId, hold, name, refreshesLeft);
241475
+ return outcome;
241476
+ }
241477
+ /** The hold registered for `turnId`, if it is still live: not mid-release or concluded. */
241478
+ #liveHold(turnId) {
241479
+ const existing = this.#holds.get(turnId);
241480
+ return existing !== void 0 && !existing.released ? existing : void 0;
241481
+ }
241482
+ /**
241483
+ * Whether `hold` has been superseded since the caller last checked: either
241484
+ * released, or no longer the map's current entry for `turnId` (a fresh
241485
+ * acquire replaced it). Both `acquire`'s post-await fences use this so
241486
+ * neither has to repeat the compound condition inline.
241487
+ */
241488
+ #isStale(turnId, hold) {
241489
+ return hold.released || this.#holds.get(turnId) !== hold;
241490
+ }
241491
+ /**
241492
+ * Install a hold's refresh interval. Extracted out of `acquire` so that
241493
+ * method's own branching stays flat; the ordering and identity-fence rules
241494
+ * around it are unchanged, and this closure owns only the refresh tick.
241495
+ */
241496
+ #installRefresher(turnId, hold, name, initialBudget) {
241497
+ let refreshesLeft = initialBudget;
241498
+ return this.#timer.setInterval(() => {
241431
241499
  if (hold.inFlight.size > 0) return;
241432
241500
  if (refreshesLeft <= 0) {
241433
241501
  if (this.#holds.get(turnId) === hold) this.release(turnId);
@@ -241436,10 +241504,13 @@ var SpriteTaskHoldManager = class {
241436
241504
  refreshesLeft -= 1;
241437
241505
  const refresh = this.#transport.put(name, 300).then(() => {
241438
241506
  hold.uncertainPut = false;
241507
+ hold.confirmed = true;
241508
+ this.#emitEvent("refresh", turnId, hold, "success");
241439
241509
  return "succeeded";
241440
241510
  }, (cause) => {
241441
241511
  hold.uncertainPut = true;
241442
241512
  this.#onError(`failed to refresh sprite task hold for turn ${turnId}`, cause);
241513
+ this.#emitEvent("refresh", turnId, hold, "failure", transportStatus(cause));
241443
241514
  return "failed";
241444
241515
  });
241445
241516
  hold.inFlight.add(refresh);
@@ -241483,6 +241554,7 @@ var SpriteTaskHoldManager = class {
241483
241554
  hold.phase = "joining";
241484
241555
  const attempt = (async () => {
241485
241556
  const outcome = await this.#concludeRelease(hold, turnId, options);
241557
+ this.#emitEvent("release", turnId, hold, outcome);
241486
241558
  if (outcome === "unreleased") {
241487
241559
  hold.phase = "idle";
241488
241560
  this.#removeIfCurrent(turnId, hold);
@@ -241666,7 +241738,7 @@ function makeSpriteTaskHoldTransport(config, fetchImpl = fetch) {
241666
241738
  signal: controller.signal,
241667
241739
  unix: config.socketPath
241668
241740
  });
241669
- if (!response.ok) throw new Error(`sprite task API responded ${response.status}`);
241741
+ if (!response.ok) throw new SpriteTaskHoldTransportError(response.status);
241670
241742
  } finally {
241671
241743
  clearTimeout(deadline);
241672
241744
  }
@@ -241702,13 +241774,14 @@ function makeSpriteTaskHoldTransport(config, fetchImpl = fetch) {
241702
241774
  * Build a manager for this process, or null when the runtime is not a sprite.
241703
241775
  * Callers treat null as "this feature does not apply here".
241704
241776
  */
241705
- function makeSpriteTaskHoldManager(env = process.env, onError) {
241777
+ function makeSpriteTaskHoldManager(env = process.env, onError, onEvent) {
241706
241778
  const config = resolveSpriteTaskHoldConfig(env);
241707
241779
  if (config === null) return null;
241708
241780
  return new SpriteTaskHoldManager({
241709
241781
  config,
241710
241782
  transport: makeSpriteTaskHoldTransport(config),
241711
- ...onError ? { onError } : {}
241783
+ ...onError ? { onError } : {},
241784
+ ...onEvent ? { onEvent } : {}
241712
241785
  });
241713
241786
  }
241714
241787
  //#endregion
@@ -286288,7 +286361,7 @@ const AgentBrowserManagerLive = effect(BrowserManager, gen(function* () {
286288
286361
  const displayPeers = createWebRtcDisplaySessionManager({
286289
286362
  mediaSourceFactory: displayCaptureRuntime.mediaSourceFactory,
286290
286363
  taskHold: displayTaskHoldManager ? {
286291
- acquire: (holdId) => displayTaskHoldManager.acquire(holdId),
286364
+ acquire: (holdId) => displayTaskHoldManager.acquire(holdId).then(() => {}),
286292
286365
  release: (holdId) => displayTaskHoldManager.release(holdId).then(() => {})
286293
286366
  } : void 0
286294
286367
  });
@@ -294626,6 +294699,15 @@ const SpriteTaskHoldReactorLive = effect(SpriteTaskHoldReactor, gen(function* ()
294626
294699
  const providerService = yield* ProviderService;
294627
294700
  const manager = makeSpriteTaskHoldManager(process.env, (message, cause) => {
294628
294701
  runFork(logWarning$1(message, { cause: cause instanceof Error ? cause.message : cause }));
294702
+ }, (event) => {
294703
+ runFork(logInfo("sprite task hold", {
294704
+ action: event.action,
294705
+ holdKey: event.holdKey,
294706
+ holdName: event.holdName,
294707
+ threadId: event.threadId,
294708
+ outcome: event.outcome,
294709
+ ...event.status !== void 0 ? { status: event.status } : {}
294710
+ }));
294629
294711
  });
294630
294712
  /**
294631
294713
  * Run a manager call, or nothing on runtimes that are not sprites. One
@@ -294641,27 +294723,58 @@ const SpriteTaskHoldReactorLive = effect(SpriteTaskHoldReactor, gen(function* ()
294641
294723
  deleteTimeoutMs: SPRITE_TASK_HOLD_RELEASE_DELETE_TIMEOUT_MS
294642
294724
  })));
294643
294725
  const launchCallers = /* @__PURE__ */ new Map();
294726
+ const launchGeneration = /* @__PURE__ */ new Map();
294727
+ const turnLaunchGeneration = /* @__PURE__ */ new Map();
294728
+ /**
294729
+ * Belt-and-braces cleanup for a turn reaching a terminal state
294730
+ * (turn.completed or turn.aborted): a launch hold whose hand-off never
294731
+ * confirmed (the turn hold's PUT kept failing) is still up, refreshing on
294732
+ * its own budget, and the turn ending either way means the launch phase is
294733
+ * over. `manager.release(String(turnId))` above can itself wait on the
294734
+ * guest API, so by the time this runs the NEXT stage's own dispatch may
294735
+ * already have acquired a fresh launch hold for the same thread; only
294736
+ * release it here when no such newer launch has started since this turn's
294737
+ * own turn.started was processed (CodeRabbit review, forge#3592). A no-op
294738
+ * when this turn's own generation is stale, or when the hold was already
294739
+ * released.
294740
+ */
294741
+ const releaseLingeringLaunchHold = async (turnId, threadId) => {
294742
+ const capturedGeneration = turnLaunchGeneration.get(turnId);
294743
+ turnLaunchGeneration.delete(turnId);
294744
+ if (manager === null || capturedGeneration === void 0) return;
294745
+ if (launchGeneration.get(threadId) !== capturedGeneration) return;
294746
+ await manager.release(launchHoldId(threadId));
294747
+ };
294644
294748
  const start = fn$1("start")(function* () {
294645
294749
  if (manager === null) return;
294646
294750
  yield* forkScoped(runForEach(providerService.streamEvents, (event) => {
294647
294751
  if (event.type === "turn.started") {
294648
294752
  const turnId = event.turnId;
294649
294753
  if (turnId === void 0) return void_$1;
294754
+ const threadId = String(event.threadId);
294755
+ const generation = launchGeneration.get(threadId) ?? 0;
294650
294756
  return promise(async () => {
294651
- await manager.acquire(String(turnId), String(event.threadId));
294652
- launchCallers.delete(String(event.threadId));
294653
- await manager.release(launchHoldId(String(event.threadId)));
294757
+ const outcome = await manager.acquire(String(turnId), threadId);
294758
+ launchCallers.delete(threadId);
294759
+ turnLaunchGeneration.set(String(turnId), generation);
294760
+ if (outcome === "succeeded") await manager.release(launchHoldId(threadId));
294654
294761
  });
294655
294762
  }
294656
294763
  if (event.type === "turn.completed") {
294657
294764
  const turnId = event.turnId;
294658
294765
  if (turnId === void 0) return void_$1;
294659
- return promise(() => manager.release(String(turnId)).then(() => {}));
294766
+ return promise(async () => {
294767
+ await manager.release(String(turnId));
294768
+ await releaseLingeringLaunchHold(String(turnId), String(event.threadId));
294769
+ });
294660
294770
  }
294661
294771
  if (event.type === "turn.aborted") {
294662
294772
  const turnId = event.turnId;
294663
294773
  if (turnId === void 0) return void_$1;
294664
- return promise(() => manager.release(String(turnId)).then(() => {}));
294774
+ return promise(async () => {
294775
+ await manager.release(String(turnId));
294776
+ await releaseLingeringLaunchHold(String(turnId), String(event.threadId));
294777
+ });
294665
294778
  }
294666
294779
  if (event.type === "session.exited") {
294667
294780
  launchCallers.delete(String(event.threadId));
@@ -294673,7 +294786,9 @@ const SpriteTaskHoldReactorLive = effect(SpriteTaskHoldReactor, gen(function* ()
294673
294786
  /** Takes the launch hold for one more caller. The budget bounds a launch that never starts a turn. */
294674
294787
  const holdLaunch = (threadId) => promise(async () => {
294675
294788
  if (manager === null) return;
294676
- launchCallers.set(threadId, (launchCallers.get(threadId) ?? 0) + 1);
294789
+ const callers = launchCallers.get(threadId) ?? 0;
294790
+ launchCallers.set(threadId, callers + 1);
294791
+ if (callers === 0) launchGeneration.set(threadId, (launchGeneration.get(threadId) ?? 0) + 1);
294677
294792
  await manager.acquire(launchHoldId(threadId), threadId, { maxRefreshes: LAUNCH_HOLD_MAX_REFRESHES });
294678
294793
  });
294679
294794
  /** Lets one caller go. The hold itself is released when the last caller has let go. */
@@ -298813,7 +298928,7 @@ function resolveBuildCommitFromEnv(env) {
298813
298928
  * environment descriptor down instead of reporting an honest "unknown".
298814
298929
  */
298815
298930
  function readBakedBuildCommit() {
298816
- return "60b0a6baf90436ed3291c93ac0273567a58cd02e";
298931
+ return "394b2a7cd449282f2845ec5fa3bd9093f20b8bb8";
298817
298932
  }
298818
298933
  async function resolveServerBuildCommit(input) {
298819
298934
  if (isFullCommitSha(input.baked)) return input.baked;
@@ -316167,6 +316282,7 @@ const PipelineRunCoordinatorLive = effect(PipelineRunCoordinator, gen(function*
316167
316282
  const policy = yield* PipelineStagePolicy;
316168
316283
  const secretStore = yield* ServerSecretStore;
316169
316284
  const orchestration = yield* OrchestrationEngineService;
316285
+ const spriteTaskHoldReactor = yield* serviceOption(SpriteTaskHoldReactor);
316170
316286
  const projectionSnapshotQuery = yield* ProjectionSnapshotQuery;
316171
316287
  const projectionTurns = yield* ProjectionTurnRepository;
316172
316288
  const changeInspector = yield* PipelineChangeInspector;
@@ -316894,6 +317010,23 @@ const PipelineRunCoordinatorLive = effect(PipelineRunCoordinator, gen(function*
316894
317010
  });
316895
317011
  yield* drainReports();
316896
317012
  });
317013
+ /**
317014
+ * Holds the sprite awake around a freshly dispatched thread.turn.start, the
317015
+ * same way bootstrapLaunch.ts's withLaunchHold does for a turn started from
317016
+ * the Forge web composer or a bootstrap launch (forge#3589). A turn kicked
317017
+ * from a CMMD card reaches the engine through dispatchStage /
317018
+ * recoverMissingProviderStart below, never through that HTTP dispatch
317019
+ * route, so nothing else covers the window between this dispatch and the
317020
+ * provider's own turn.started.
317021
+ *
317022
+ * Releases only on error: a successful dispatch hands the hold off to the
317023
+ * turn's own, in SpriteTaskHoldReactor's turn.started handler.
317024
+ */
317025
+ const withPipelineLaunchHold = (threadId, dispatch) => {
317026
+ if (isNone(spriteTaskHoldReactor)) return dispatch;
317027
+ const reactor = spriteTaskHoldReactor.value;
317028
+ return uninterruptible(reactor.holdLaunch(threadId)).pipe(andThen(yieldNow), andThen(dispatch), onError$1(() => reactor.releaseLaunch(threadId)));
317029
+ };
316897
317030
  const dispatchStage = (binding, snapshot, authority) => gen(function* () {
316898
317031
  const thread = (yield* orchestration.getReadModel()).threads.find((candidate) => candidate.id === ThreadId.make(binding.threadId) && candidate.deletedAt === null);
316899
317032
  if (thread === void 0) {
@@ -316969,7 +317102,7 @@ const PipelineRunCoordinatorLive = effect(PipelineRunCoordinator, gen(function*
316969
317102
  messageId: `${commandId}:message`,
316970
317103
  createdAt: startedAt
316971
317104
  });
316972
- yield* orchestration.dispatch(command).pipe(tapError(() => store.resetDispatch(binding.runId, commandId)));
317105
+ yield* withPipelineLaunchHold(binding.threadId, orchestration.dispatch(command)).pipe(tapError(() => store.resetDispatch(binding.runId, commandId)));
316973
317106
  yield* store.markDispatched(binding.runId, commandId);
316974
317107
  });
316975
317108
  const resumeRun = (runId) => gen(function* () {
@@ -317609,7 +317742,7 @@ const PipelineRunCoordinatorLive = effect(PipelineRunCoordinator, gen(function*
317609
317742
  });
317610
317743
  if (workerCoordination.kind !== "single" && workerCoordination.kind !== "ready") return;
317611
317744
  const commandId = `${originalCommandId}:provider-start-recovery`;
317612
- yield* orchestration.dispatch(buildStageTurnCommand({
317745
+ yield* withPipelineLaunchHold(input.binding.threadId, orchestration.dispatch(buildStageTurnCommand({
317613
317746
  binding: input.binding,
317614
317747
  attempt: input.binding.attempt,
317615
317748
  snapshot: input.snapshot,
@@ -317620,7 +317753,7 @@ const PipelineRunCoordinatorLive = effect(PipelineRunCoordinator, gen(function*
317620
317753
  commandId,
317621
317754
  messageId: `${commandId}:message`,
317622
317755
  createdAt: (/* @__PURE__ */ new Date()).toISOString()
317623
- }));
317756
+ })));
317624
317757
  });
317625
317758
  }
317626
317759
  function reconcileActiveThread(input) {
@@ -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{Fn as a,Gr as o,Hl as s,Jr as c,Or as l,Tn as u,Wr as d,al as f,c as p,d as m,fn as h,fr as g,gr as _,hr as v,ii as y,jn as b,js as x,m as S,ni as C,o as w,ol as T,qo as E,qt as D,rl as O,rs as k,s as A,t as j,tl as M,u as N}from"./WorkerPoolContext-BwqlIoS2.js";import{hn as P}from"./CompositeItem-DU4kdAw6.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-CRqhCU4I.js";import{Dn as q,at as J,it as ee}from"./src-CF8xm6xH.js";import"./cmmdAuthRedirect-CCwq2L-I.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-C2oTg0F3.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,m=(0,X.useContext)(j),h=A(),g=(0,X.useRef)(null),_=p(n=>{if(n!=null){if(g.current!=null)throw Error(`useFileDiffInstance: An instance should not already exist when a node is created`);d==null?g.current=new re(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),l?void 0:m,!0):g.current=new pe(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),d,o,l?void 0:m,!0),g.current.hydrate({fileDiff:e,fileContainer:n,lineAnnotations:r,prerenderedHTML:a})}else{if(g.current==null)throw Error(`useFileDiffInstance: A FileDiff instance should exist when unmounting`);g.current.cleanUp(),g.current=null}});return me(()=>{let{current:n}=g;if(n==null)return;let a=Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),o=a!==void 0&&!D(n.options,a);n.setOptions(a),n.render({forceRender:o,fileDiff:e,lineAnnotations:r}),i!==void 0&&n.setSelectedLines(i)}),me(()=>{if(u&&g.current!=null){if(h===void 0)throw Error(`FileDiff: EditContext is not attached`);let e=h(n??{});if(e==null)throw Error(`FileDiff: EditProvider.createEditor must return an editor instance`);try{return e.edit(g.current)}catch(t){throw e.cleanUp(),t}}},[u]),{ref:_,getHoveredLine:(0,X.useCallback)(()=>g.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:g=!1,edit:_=!1}){let{ref:v,getHoveredLine:y}=he({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,prerenderedHTML:c,hasGutterRenderUtility:m!=null,hasCustomHeader:u!=null,disableWorkerPool:g,edit:_});return(0,Q.jsx)(h,{ref:v,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 f({queryKey:x.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{Fn as a,Gr as o,Hl as s,Jr as c,Or as l,Tn as u,Wr as d,al as f,c as p,d as m,fn as h,fr as g,gr as _,hr as v,ii as y,jn as b,js as x,m as S,ni as C,o as w,ol as T,qo as E,qt as D,rl as O,rs as k,s as A,t as j,tl as M,u as N}from"./WorkerPoolContext-BxfSg7K_.js";import{hn as P}from"./CompositeItem-DU4kdAw6.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-D-5QCW79.js";import{Dn as q,at as J,it as ee}from"./src-CF8xm6xH.js";import"./cmmdAuthRedirect-CCwq2L-I.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-BiyBXIja.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,m=(0,X.useContext)(j),h=A(),g=(0,X.useRef)(null),_=p(n=>{if(n!=null){if(g.current!=null)throw Error(`useFileDiffInstance: An instance should not already exist when a node is created`);d==null?g.current=new re(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),l?void 0:m,!0):g.current=new pe(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),d,o,l?void 0:m,!0),g.current.hydrate({fileDiff:e,fileContainer:n,lineAnnotations:r,prerenderedHTML:a})}else{if(g.current==null)throw Error(`useFileDiffInstance: A FileDiff instance should exist when unmounting`);g.current.cleanUp(),g.current=null}});return me(()=>{let{current:n}=g;if(n==null)return;let a=Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),o=a!==void 0&&!D(n.options,a);n.setOptions(a),n.render({forceRender:o,fileDiff:e,lineAnnotations:r}),i!==void 0&&n.setSelectedLines(i)}),me(()=>{if(u&&g.current!=null){if(h===void 0)throw Error(`FileDiff: EditContext is not attached`);let e=h(n??{});if(e==null)throw Error(`FileDiff: EditProvider.createEditor must return an editor instance`);try{return e.edit(g.current)}catch(t){throw e.cleanUp(),t}}},[u]),{ref:_,getHoveredLine:(0,X.useCallback)(()=>g.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:g=!1,edit:_=!1}){let{ref:v,getHoveredLine:y}=he({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,prerenderedHTML:c,hasGutterRenderUtility:m!=null,hasCustomHeader:u!=null,disableWorkerPool:g,edit:_});return(0,Q.jsx)(h,{ref:v,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 f({queryKey:x.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}=v(),s=_(),[c,d]=(0,X.useState)(`stacked`),[f,p]=(0,X.useState)(s.diffWordWrap),h=(0,X.useRef)(null),g=(0,X.useRef)(!1),y=Te(),{activeCwd:b,activeThread:x,bodyState:S,diffOpen:C,inferredCheckpointTurnCountByTurnId:w,orderedTurnDiffSummaries:T,renderableFiles:E,renderablePatch:D,selectedFilePath:k,selectedTurn:A,selectedTurnId:j}=Le(i),N,P;t[0]!==C||t[1]!==s.diffWordWrap?(N=()=>{C&&!g.current&&p(s.diffWordWrap),g.current=C},P=[C,s.diffWordWrap],t[0]=C,t[1]=s.diffWordWrap,t[2]=N,t[3]=P):(N=t[2],P=t[3]),(0,X.useEffect)(N,P);let F;t[4]===k?F=t[5]:(F=()=>{!k||!h.current||Array.from(h.current.querySelectorAll(`[data-diff-file-path]`)).find(e=>e.dataset.diffFilePath===k)?.scrollIntoView({block:`nearest`})},t[4]=k,t[5]=F);let I;t[6]!==E||t[7]!==k?(I=[k,E],t[6]=E,t[7]=k,t[8]=I):I=t[8],(0,X.useEffect)(F,I);let L;t[9]===b?L=t[10]:(L=e=>{let t=l();if(!t)return;let n=b?u(e,b):e;o(t,n).catch(ke)},t[9]=b,t[10]=L);let R=L,z;t[11]===x?z=t[12]:(z=e=>{x&&a.getState().openDiff(O(M(x.environmentId,x.id)),e)},t[11]=x,t[12]=z);let B=z,V;t[13]===x?V=t[14]:(V=()=>{x&&a.getState().openDiff(O(M(x.environmentId,x.id)))},t[13]=x,t[14]=V);let H=V,U;t[15]===y.remeasure?U=t[16]:(U=()=>{let e=window.requestAnimationFrame(y.remeasure);return()=>window.cancelAnimationFrame(e)},t[15]=y.remeasure,t[16]=U);let W;t[17]!==T||t[18]!==j||t[19]!==y.remeasure?(W=[T,j,y.remeasure],t[17]=T,t[18]=j,t[19]=y.remeasure,t[20]=W):W=t[20],(0,X.useEffect)(U,W),Ee(y.ref,A?.turnId??j);let G;t[21]!==c||t[22]!==f||t[23]!==w||t[24]!==T||t[25]!==B||t[26]!==H||t[27]!==A||t[28]!==j||t[29]!==s||t[30]!==y?(G=(0,Q.jsx)(Ae,{diffRenderMode:c,diffWordWrap:f,inferredCheckpointTurnCountByTurnId:w,orderedTurnDiffSummaries:T,selectTurn:B,selectWholeConversation:H,selectedTurn:A,selectedTurnId:j,setDiffRenderMode:d,setDiffWordWrap:p,settings:s,turnStrip:y}),t[21]=c,t[22]=f,t[23]=w,t[24]=T,t[25]=B,t[26]=H,t[27]=A,t[28]=j,t[29]=s,t[30]=y,t[31]=G):G=t[31];let K=G,q;t[32]!==S||t[33]!==c||t[34]!==f||t[35]!==R||t[36]!==E||t[37]!==D||t[38]!==i?(q=(0,Q.jsx)(je,{bodyState:S,diffRenderMode:c,diffWordWrap:f,openDiffFileInEditor:R,patchViewportRef:h,renderableFiles:E,renderablePatch:D,resolvedTheme:i}),t[32]=S,t[33]=c,t[34]=f,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)(m,{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:S(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=s(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),a=i.rightPanel===`diff`,o=n?.threadId??null,c,l;e[2]===n?l=e[3]:(l=b(n),e[2]=n,e[3]=l),c=l;let u=k(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 x=d(y),S;e[10]===x.data?S=e[11]:(S=z(x.data),e[10]=x.data,e[11]=S);let C=S,w;return e[12]!==g||e[13]!==u||e[14]!==o||e[15]!==a||e[16]!==i||e[17]!==C?(w={activeThread:u,activeThreadId:o,activeCwd:g,isGitRepo:C,diffSearch:i,diffOpen:a},e[12]=g,e[13]=u,e[14]=o,e[15]=a,e[16]=i,e[17]=C,e[18]=w):w=e[18],w}function Fe(e){return G(e)}function Ie(e){return C(e)}function Le(e){let{activeThread:t,activeThreadId:n,activeCwd:r,isGitRepo:i,diffSearch:a,diffOpen:o}=Pe(),{turnDiffSummaries:s,inferredCheckpointTurnCountByTurnId:c}=H(t),l=a.diffTurnId??null,u=l===null?null:a.diffFilePath??null,{activeCheckpointRange:d,conversationCacheScope:f,orderedTurnDiffSummaries:p,selectedTurn:m}=(0,X.useMemo)(()=>te({summaries:s,inferredCheckpointTurnCountByTurnId:c,selectedTurnId:l}),[c,l,s]),h=T(xe(we({environmentId:t?.environmentId,threadId:n,range:d,selectedTurnId:m?.turnId,conversationCacheScope:f,enabled:i}))),g=h.isLoading,_=Ce(h.error),v=h.data?.diff,y=typeof v==`string`&&v.trim().length===0,{emptyDiffMessage:b}=(0,X.useMemo)(()=>ae(m),[m]),x=(0,X.useMemo)(()=>ce(v,`diff-panel:${e}`),[e,v]),S=(0,X.useMemo)(()=>Ue(x),[x]);return{activeCwd:r,activeThread:t,bodyState:ue({hasActiveThread:!!t,isGitRepo:i,turnSummaryCount:p.length,checkpointDiffError:_,hasRenderablePatch:!!x,isLoadingCheckpointDiff:g,hasNoNetChanges:y,emptyDiffMessage:b}),diffOpen:o,inferredCheckpointTurnCountByTurnId:c,orderedTurnDiffSummaries:p,renderableFiles:S,renderablePatch:x,selectedFilePath:u,selectedTurn:m,selectedTurnId:l}}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)(N,{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:y,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 u;t[3]!==i||t[4]!==r?(u=()=>r.scrollBy(i?-180:ze),t[3]=i,t[4]=r,t[5]=u):u=t[5];let d=!a,f=`Scroll turn list ${n}`,p;t[6]===o?p=t[7]:(p=(0,Q.jsx)(o,{className:`size-3.5`}),t[6]=o,t[7]=p);let m;return t[8]!==l||t[9]!==u||t[10]!==d||t[11]!==f||t[12]!==p?(m=(0,Q.jsx)(`button`,{type:`button`,className:l,onClick:u,disabled:d,"aria-label":f,children:p}),t[8]=l,t[9]=u,t[10]=d,t[11]=f,t[12]=p,t[13]=m):m=t[13],m}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=g(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 _;t[15]!==u||t[16]!==h?(_=(0,Q.jsx)(`div`,{className:u,children:h}),t[15]=u,t[16]=h,t[17]=_):_=t[17];let v;return t[18]!==r||t[19]!==n.turnId||t[20]!==s||t[21]!==_?(v=(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-md`,onClick:s,title:c,"data-turn-chip-selected":r,children:_}),t[18]=r,t[19]=n.turnId,t[20]=s,t[21]=_,t[22]=v):v=t[22],v}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?E(e,{environmentId:n,projectId:r}):void 0,t[0]=n,t[1]=r,t[2]=i):i=t[2],k(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-CYNKb6rV.js.map
64
+ //# sourceMappingURL=DiffPanel-Dx1AY0mg.js.map