@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.cjs +154 -21
- package/dist/bin.mjs +154 -21
- package/dist/client/assets/{DiffPanel-CYNKb6rV.js → DiffPanel-Dx1AY0mg.js} +2 -2
- package/dist/client/assets/{DiffPanel.logic-C2oTg0F3.js → DiffPanel.logic-BiyBXIja.js} +2 -2
- package/dist/client/assets/{DiffWorkerPoolProvider-D2jrFGJ8.js → DiffWorkerPoolProvider-jDqu6eJj.js} +2 -2
- package/dist/client/assets/{PullRequestCodePanel-V2Hpw_yq.js → PullRequestCodePanel-CqrN4lB_.js} +2 -2
- package/dist/client/assets/{Virtualizer-CRqhCU4I.js → Virtualizer-D-5QCW79.js} +2 -2
- package/dist/client/assets/{WorkerPoolContext-BwqlIoS2.js → WorkerPoolContext-BxfSg7K_.js} +3 -3
- package/dist/client/assets/{index-BdKqG5iV.js → index-BrOo-A0J.js} +6 -6
- package/dist/client/index.html +4 -4
- package/dist/forge-build.json +1 -1
- package/package.json +1 -1
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.
|
|
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.#
|
|
241401
|
-
if (existing !== void 0
|
|
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
|
-
|
|
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 (
|
|
241430
|
-
hold.refresher = this.#
|
|
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
|
|
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),
|
|
294652
|
-
launchCallers.delete(
|
|
294653
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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 "
|
|
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-
|
|
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-
|
|
64
|
+
//# sourceMappingURL=DiffPanel-Dx1AY0mg.js.map
|