@cmmd-center/forge 0.13.58 → 0.13.60
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 +83 -7
- package/dist/bin.mjs +83 -7
- package/dist/client/assets/{DiffPanel-BiFFFyIe.js → DiffPanel-C1yePuJx.js} +2 -2
- package/dist/client/assets/{DiffPanel.logic-DVEZIsSc.js → DiffPanel.logic-D61GzgVU.js} +2 -2
- package/dist/client/assets/{DiffPanelShell-DwhtaL1t.js → DiffPanelShell-C2-NaTXj.js} +3 -3
- package/dist/client/assets/{DiffWorkerPoolProvider-CxpBlXbz.js → DiffWorkerPoolProvider-CuRtVu45.js} +2 -2
- package/dist/client/assets/{PullRequestCodePanel-V2a2Ml6x.js → PullRequestCodePanel-zA7w32sR.js} +2 -2
- package/dist/client/assets/{Virtualizer-CwEtgTLm.js → Virtualizer-BscgnuJo.js} +2 -2
- package/dist/client/assets/{index-YH4zDbqw.js → index-DfmXsBEF.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.cjs
CHANGED
|
@@ -66257,7 +66257,7 @@ function normalizeNumberish(value) {
|
|
|
66257
66257
|
}
|
|
66258
66258
|
//#endregion
|
|
66259
66259
|
//#region package.json
|
|
66260
|
-
var version$1 = "0.13.
|
|
66260
|
+
var version$1 = "0.13.60";
|
|
66261
66261
|
//#endregion
|
|
66262
66262
|
//#region src/sentry.ts
|
|
66263
66263
|
const SERVER_APP_NAME = "forge-server";
|
|
@@ -102470,14 +102470,30 @@ function rehydrateCmmdTaskLinksFromThreads(input) {
|
|
|
102470
102470
|
}
|
|
102471
102471
|
}
|
|
102472
102472
|
//#endregion
|
|
102473
|
+
//#region src/cmmd/forgeEnvelope.ts
|
|
102474
|
+
/**
|
|
102475
|
+
* Forge-context REST responses wrap their payload in `{ data, meta, pagination? }`
|
|
102476
|
+
* (see CMMD `sendForgeEnvelope`). Unwrap to the bare payload.
|
|
102477
|
+
*
|
|
102478
|
+
* Shared here so callers stop redefining this locally (apps/server/src has four
|
|
102479
|
+
* other private copies of the same check, in command/http.ts,
|
|
102480
|
+
* command/contextBuilder.ts, command/brainPreamble.ts and
|
|
102481
|
+
* agentTools/brainTools.ts), new call sites should import this one instead of
|
|
102482
|
+
* adding a sixth.
|
|
102483
|
+
*/
|
|
102484
|
+
function unwrapForgeEnvelope$2(value) {
|
|
102485
|
+
if (value !== null && typeof value === "object" && "data" in value) return value.data;
|
|
102486
|
+
return value;
|
|
102487
|
+
}
|
|
102488
|
+
//#endregion
|
|
102473
102489
|
//#region src/cmmd/updateCmmdTask.ts
|
|
102474
102490
|
/**
|
|
102475
|
-
* Update a CMMD task via the JWT REST gateway (the single trustworthy plane)
|
|
102491
|
+
* Update a CMMD task via the JWT REST gateway (the single trustworthy plane),
|
|
102476
102492
|
* the orchestration replacement for `callCmmdTool(pat, "update_task", ...)`.
|
|
102477
102493
|
*
|
|
102478
102494
|
* The session's cached CMMD JWT is used; when it is expired and no subject is
|
|
102479
102495
|
* available to refresh it, the update reports `isError: true` so the caller can
|
|
102480
|
-
* log/retry
|
|
102496
|
+
* log/retry, the same failure semantics the MCP path produced on auth loss.
|
|
102481
102497
|
*/
|
|
102482
102498
|
function updateCmmdTaskForSession(input) {
|
|
102483
102499
|
return require_Schema$1.gen(function* () {
|
|
@@ -102494,6 +102510,34 @@ function updateCmmdTaskForSession(input) {
|
|
|
102494
102510
|
return { isError: false };
|
|
102495
102511
|
});
|
|
102496
102512
|
}
|
|
102513
|
+
/**
|
|
102514
|
+
* Read a CMMD task's current status via the JWT REST gateway, so a caller can
|
|
102515
|
+
* decide whether a write is still needed instead of patching blind.
|
|
102516
|
+
*
|
|
102517
|
+
* A missing JWT (no cached credential, nothing to refresh with) logs a warning
|
|
102518
|
+
* and reports `status: null`. The caller falls back to writing, same as
|
|
102519
|
+
* before this check existed. A gateway rejection (401, 5xx, timeout) is NOT
|
|
102520
|
+
* swallowed here: it propagates as a failure so the caller's own error
|
|
102521
|
+
* handling (which logs it) still runs, and the write still goes ahead.
|
|
102522
|
+
*/
|
|
102523
|
+
function getCmmdTaskForSession(input) {
|
|
102524
|
+
return require_Schema$1.gen(function* () {
|
|
102525
|
+
const jwt = yield* resolveCmmdJwtForSession({
|
|
102526
|
+
sessionId: input.sessionId,
|
|
102527
|
+
logPrefix: "cmmd-task-sync"
|
|
102528
|
+
}).pipe(require_Schema$1.orElseSucceed(() => null));
|
|
102529
|
+
if (!jwt) {
|
|
102530
|
+
yield* require_Schema$1.logWarning("cmmd-task-sync: no CMMD JWT available for status read", { taskId: input.taskId });
|
|
102531
|
+
return { status: null };
|
|
102532
|
+
}
|
|
102533
|
+
const task = unwrapForgeEnvelope$2(yield* require_Schema$1.tryPromise(() => cmmdGateway.getTask({
|
|
102534
|
+
jwt,
|
|
102535
|
+
taskId: input.taskId
|
|
102536
|
+
})));
|
|
102537
|
+
const status = task !== null && typeof task === "object" && "status" in task ? task.status ?? null : null;
|
|
102538
|
+
return { status: typeof status === "string" ? status : null };
|
|
102539
|
+
});
|
|
102540
|
+
}
|
|
102497
102541
|
//#endregion
|
|
102498
102542
|
//#region src/auth/codexWriteToken.ts
|
|
102499
102543
|
const accessor$1 = require_runtimeControlAuthority.createReadOnceFileTokenAccessor({
|
|
@@ -105303,10 +105347,17 @@ var CmmdTaskStatusSync = class {
|
|
|
105303
105347
|
* A task becomes In Progress only after Forge has accepted its first
|
|
105304
105348
|
* task-anchored turn. Merely opening setup or creating a CMMD card is not
|
|
105305
105349
|
* liveness and must not claim the task.
|
|
105350
|
+
*
|
|
105351
|
+
* Reads the Task's current stage first: a Work Session can already have
|
|
105352
|
+
* moved it to `in_progress` before this thread's first turn lands, and
|
|
105353
|
+
* re-patching an already-current status is a no-op write worth skipping.
|
|
105354
|
+
* A failed read (missing JWT, request error) falls back to writing, same
|
|
105355
|
+
* as before this check existed.
|
|
105306
105356
|
*/
|
|
105307
105357
|
async onTaskThreadStarted(threadId) {
|
|
105308
105358
|
const link = this.deps.getLinkByThreadId(threadId);
|
|
105309
105359
|
if (!link || link.kind !== "master") return;
|
|
105360
|
+
if ((await this.safeGetTask(link.sessionId, link.taskId)).status === "in_progress") return;
|
|
105310
105361
|
await this.safeUpdate(link.sessionId, link.taskId, { status: "in_progress" });
|
|
105311
105362
|
}
|
|
105312
105363
|
/** Master opened a PR. Updates master task → in_review with PR Ready context. */
|
|
@@ -105328,7 +105379,7 @@ var CmmdTaskStatusSync = class {
|
|
|
105328
105379
|
await this.safeUpdate(link.sessionId, link.taskId, { status: "in_progress" });
|
|
105329
105380
|
}
|
|
105330
105381
|
/**
|
|
105331
|
-
* Master's PR merged
|
|
105382
|
+
* Master's PR merged, move only the lead task into the post-merge human QA
|
|
105332
105383
|
* gate. Worker task statuses are not auto-closed here.
|
|
105333
105384
|
*
|
|
105334
105385
|
* Returns a breakdown so the caller can log + retry failures.
|
|
@@ -105365,7 +105416,20 @@ var CmmdTaskStatusSync = class {
|
|
|
105365
105416
|
failed
|
|
105366
105417
|
};
|
|
105367
105418
|
}
|
|
105368
|
-
/** Internal:
|
|
105419
|
+
/** Internal: a failed read falls back to `{ status: null }` (proceed with write). */
|
|
105420
|
+
async safeGetTask(sessionId, taskId) {
|
|
105421
|
+
if (!this.deps.getTask) return { status: null };
|
|
105422
|
+
try {
|
|
105423
|
+
return await this.deps.getTask(sessionId, taskId);
|
|
105424
|
+
} catch (error) {
|
|
105425
|
+
captureServerError(error, {
|
|
105426
|
+
route: "cmmd-task-sync",
|
|
105427
|
+
taskId
|
|
105428
|
+
});
|
|
105429
|
+
return { status: null };
|
|
105430
|
+
}
|
|
105431
|
+
}
|
|
105432
|
+
/** Internal: swallow CMMD failures with no log leak, caller cannot recover. */
|
|
105369
105433
|
async safeUpdate(sessionId, taskId, patch) {
|
|
105370
105434
|
try {
|
|
105371
105435
|
await this.deps.updateTask(sessionId, taskId, patch);
|
|
@@ -105379,10 +105443,12 @@ var CmmdTaskStatusSync = class {
|
|
|
105379
105443
|
};
|
|
105380
105444
|
//#endregion
|
|
105381
105445
|
//#region src/orchestration/wiring.ts
|
|
105446
|
+
/** Build the CMMD task-sync adapter from injected deps, ready for ws.ts to call into. */
|
|
105382
105447
|
function createCmmdTaskSyncWiring(deps) {
|
|
105383
105448
|
const cmmdTaskStatusSync = new CmmdTaskStatusSync({
|
|
105384
105449
|
getLinkByThreadId: deps.getLinkByThreadId,
|
|
105385
|
-
updateTask: deps.updateCmmdTask
|
|
105450
|
+
updateTask: deps.updateCmmdTask,
|
|
105451
|
+
getTask: deps.getCmmdTask
|
|
105386
105452
|
});
|
|
105387
105453
|
const maybeSyncCmmdTaskAfterGitAction = (cwd, threadId, prUrl) => {
|
|
105388
105454
|
const link = (threadId ? deps.getLinkByThreadId(threadId) : null) ?? deps.getLinkByCwd(cwd);
|
|
@@ -106930,10 +106996,20 @@ const makeWsRpcLayer = (currentSessionId, currentUserId) => WsRpcGroup.toLayer(r
|
|
|
106930
106996
|
taskId,
|
|
106931
106997
|
patch
|
|
106932
106998
|
}));
|
|
106999
|
+
/**
|
|
107000
|
+
* Read a CMMD task's current status via the JWT REST gateway, same
|
|
107001
|
+
* trust plane as updateCmmdTask above. Used to skip a redundant
|
|
107002
|
+
* in_progress write on a thread's first accepted turn.
|
|
107003
|
+
*/
|
|
107004
|
+
const getCmmdTask = (sessionId, taskId) => runPromise(getCmmdTaskForSession({
|
|
107005
|
+
sessionId,
|
|
107006
|
+
taskId
|
|
107007
|
+
}));
|
|
106933
107008
|
const cmmdTaskSyncWiring = createCmmdTaskSyncWiring({
|
|
106934
107009
|
getLinkByThreadId: getCmmdTaskLinkByThreadId,
|
|
106935
107010
|
getLinkByCwd: getCmmdTaskLinkByCwd,
|
|
106936
107011
|
updateCmmdTask,
|
|
107012
|
+
getCmmdTask,
|
|
106937
107013
|
recordCmmdWorkRunPrLink: ({ link, prUrl }) => recordCmmdWorkRunPrLink({ upsert: (input) => runPromise(cmmdWorkRunGithubLinks.upsert(input)) }, {
|
|
106938
107014
|
link,
|
|
106939
107015
|
prUrl
|
|
@@ -298130,7 +298206,7 @@ function resolveBuildCommitFromEnv(env) {
|
|
|
298130
298206
|
* environment descriptor down instead of reporting an honest "unknown".
|
|
298131
298207
|
*/
|
|
298132
298208
|
function readBakedBuildCommit() {
|
|
298133
|
-
return "
|
|
298209
|
+
return "a73d6f2a2de424a153f210a9aa30f454b41cacff";
|
|
298134
298210
|
}
|
|
298135
298211
|
async function resolveServerBuildCommit(input) {
|
|
298136
298212
|
if (isFullCommitSha(input.baked)) return input.baked;
|
package/dist/bin.mjs
CHANGED
|
@@ -65961,7 +65961,7 @@ function normalizeNumberish(value) {
|
|
|
65961
65961
|
}
|
|
65962
65962
|
//#endregion
|
|
65963
65963
|
//#region package.json
|
|
65964
|
-
var version$1 = "0.13.
|
|
65964
|
+
var version$1 = "0.13.60";
|
|
65965
65965
|
//#endregion
|
|
65966
65966
|
//#region src/sentry.ts
|
|
65967
65967
|
const SERVER_APP_NAME = "forge-server";
|
|
@@ -102069,14 +102069,30 @@ function rehydrateCmmdTaskLinksFromThreads(input) {
|
|
|
102069
102069
|
}
|
|
102070
102070
|
}
|
|
102071
102071
|
//#endregion
|
|
102072
|
+
//#region src/cmmd/forgeEnvelope.ts
|
|
102073
|
+
/**
|
|
102074
|
+
* Forge-context REST responses wrap their payload in `{ data, meta, pagination? }`
|
|
102075
|
+
* (see CMMD `sendForgeEnvelope`). Unwrap to the bare payload.
|
|
102076
|
+
*
|
|
102077
|
+
* Shared here so callers stop redefining this locally (apps/server/src has four
|
|
102078
|
+
* other private copies of the same check, in command/http.ts,
|
|
102079
|
+
* command/contextBuilder.ts, command/brainPreamble.ts and
|
|
102080
|
+
* agentTools/brainTools.ts), new call sites should import this one instead of
|
|
102081
|
+
* adding a sixth.
|
|
102082
|
+
*/
|
|
102083
|
+
function unwrapForgeEnvelope$2(value) {
|
|
102084
|
+
if (value !== null && typeof value === "object" && "data" in value) return value.data;
|
|
102085
|
+
return value;
|
|
102086
|
+
}
|
|
102087
|
+
//#endregion
|
|
102072
102088
|
//#region src/cmmd/updateCmmdTask.ts
|
|
102073
102089
|
/**
|
|
102074
|
-
* Update a CMMD task via the JWT REST gateway (the single trustworthy plane)
|
|
102090
|
+
* Update a CMMD task via the JWT REST gateway (the single trustworthy plane),
|
|
102075
102091
|
* the orchestration replacement for `callCmmdTool(pat, "update_task", ...)`.
|
|
102076
102092
|
*
|
|
102077
102093
|
* The session's cached CMMD JWT is used; when it is expired and no subject is
|
|
102078
102094
|
* available to refresh it, the update reports `isError: true` so the caller can
|
|
102079
|
-
* log/retry
|
|
102095
|
+
* log/retry, the same failure semantics the MCP path produced on auth loss.
|
|
102080
102096
|
*/
|
|
102081
102097
|
function updateCmmdTaskForSession(input) {
|
|
102082
102098
|
return gen(function* () {
|
|
@@ -102093,6 +102109,34 @@ function updateCmmdTaskForSession(input) {
|
|
|
102093
102109
|
return { isError: false };
|
|
102094
102110
|
});
|
|
102095
102111
|
}
|
|
102112
|
+
/**
|
|
102113
|
+
* Read a CMMD task's current status via the JWT REST gateway, so a caller can
|
|
102114
|
+
* decide whether a write is still needed instead of patching blind.
|
|
102115
|
+
*
|
|
102116
|
+
* A missing JWT (no cached credential, nothing to refresh with) logs a warning
|
|
102117
|
+
* and reports `status: null`. The caller falls back to writing, same as
|
|
102118
|
+
* before this check existed. A gateway rejection (401, 5xx, timeout) is NOT
|
|
102119
|
+
* swallowed here: it propagates as a failure so the caller's own error
|
|
102120
|
+
* handling (which logs it) still runs, and the write still goes ahead.
|
|
102121
|
+
*/
|
|
102122
|
+
function getCmmdTaskForSession(input) {
|
|
102123
|
+
return gen(function* () {
|
|
102124
|
+
const jwt = yield* resolveCmmdJwtForSession({
|
|
102125
|
+
sessionId: input.sessionId,
|
|
102126
|
+
logPrefix: "cmmd-task-sync"
|
|
102127
|
+
}).pipe(orElseSucceed(() => null));
|
|
102128
|
+
if (!jwt) {
|
|
102129
|
+
yield* logWarning$1("cmmd-task-sync: no CMMD JWT available for status read", { taskId: input.taskId });
|
|
102130
|
+
return { status: null };
|
|
102131
|
+
}
|
|
102132
|
+
const task = unwrapForgeEnvelope$2(yield* tryPromise(() => cmmdGateway.getTask({
|
|
102133
|
+
jwt,
|
|
102134
|
+
taskId: input.taskId
|
|
102135
|
+
})));
|
|
102136
|
+
const status = task !== null && typeof task === "object" && "status" in task ? task.status ?? null : null;
|
|
102137
|
+
return { status: typeof status === "string" ? status : null };
|
|
102138
|
+
});
|
|
102139
|
+
}
|
|
102096
102140
|
//#endregion
|
|
102097
102141
|
//#region src/auth/codexWriteToken.ts
|
|
102098
102142
|
const accessor$1 = createReadOnceFileTokenAccessor({
|
|
@@ -104898,10 +104942,17 @@ var CmmdTaskStatusSync = class {
|
|
|
104898
104942
|
* A task becomes In Progress only after Forge has accepted its first
|
|
104899
104943
|
* task-anchored turn. Merely opening setup or creating a CMMD card is not
|
|
104900
104944
|
* liveness and must not claim the task.
|
|
104945
|
+
*
|
|
104946
|
+
* Reads the Task's current stage first: a Work Session can already have
|
|
104947
|
+
* moved it to `in_progress` before this thread's first turn lands, and
|
|
104948
|
+
* re-patching an already-current status is a no-op write worth skipping.
|
|
104949
|
+
* A failed read (missing JWT, request error) falls back to writing, same
|
|
104950
|
+
* as before this check existed.
|
|
104901
104951
|
*/
|
|
104902
104952
|
async onTaskThreadStarted(threadId) {
|
|
104903
104953
|
const link = this.deps.getLinkByThreadId(threadId);
|
|
104904
104954
|
if (!link || link.kind !== "master") return;
|
|
104955
|
+
if ((await this.safeGetTask(link.sessionId, link.taskId)).status === "in_progress") return;
|
|
104905
104956
|
await this.safeUpdate(link.sessionId, link.taskId, { status: "in_progress" });
|
|
104906
104957
|
}
|
|
104907
104958
|
/** Master opened a PR. Updates master task → in_review with PR Ready context. */
|
|
@@ -104923,7 +104974,7 @@ var CmmdTaskStatusSync = class {
|
|
|
104923
104974
|
await this.safeUpdate(link.sessionId, link.taskId, { status: "in_progress" });
|
|
104924
104975
|
}
|
|
104925
104976
|
/**
|
|
104926
|
-
* Master's PR merged
|
|
104977
|
+
* Master's PR merged, move only the lead task into the post-merge human QA
|
|
104927
104978
|
* gate. Worker task statuses are not auto-closed here.
|
|
104928
104979
|
*
|
|
104929
104980
|
* Returns a breakdown so the caller can log + retry failures.
|
|
@@ -104960,7 +105011,20 @@ var CmmdTaskStatusSync = class {
|
|
|
104960
105011
|
failed
|
|
104961
105012
|
};
|
|
104962
105013
|
}
|
|
104963
|
-
/** Internal:
|
|
105014
|
+
/** Internal: a failed read falls back to `{ status: null }` (proceed with write). */
|
|
105015
|
+
async safeGetTask(sessionId, taskId) {
|
|
105016
|
+
if (!this.deps.getTask) return { status: null };
|
|
105017
|
+
try {
|
|
105018
|
+
return await this.deps.getTask(sessionId, taskId);
|
|
105019
|
+
} catch (error) {
|
|
105020
|
+
captureServerError(error, {
|
|
105021
|
+
route: "cmmd-task-sync",
|
|
105022
|
+
taskId
|
|
105023
|
+
});
|
|
105024
|
+
return { status: null };
|
|
105025
|
+
}
|
|
105026
|
+
}
|
|
105027
|
+
/** Internal: swallow CMMD failures with no log leak, caller cannot recover. */
|
|
104964
105028
|
async safeUpdate(sessionId, taskId, patch) {
|
|
104965
105029
|
try {
|
|
104966
105030
|
await this.deps.updateTask(sessionId, taskId, patch);
|
|
@@ -104974,10 +105038,12 @@ var CmmdTaskStatusSync = class {
|
|
|
104974
105038
|
};
|
|
104975
105039
|
//#endregion
|
|
104976
105040
|
//#region src/orchestration/wiring.ts
|
|
105041
|
+
/** Build the CMMD task-sync adapter from injected deps, ready for ws.ts to call into. */
|
|
104977
105042
|
function createCmmdTaskSyncWiring(deps) {
|
|
104978
105043
|
const cmmdTaskStatusSync = new CmmdTaskStatusSync({
|
|
104979
105044
|
getLinkByThreadId: deps.getLinkByThreadId,
|
|
104980
|
-
updateTask: deps.updateCmmdTask
|
|
105045
|
+
updateTask: deps.updateCmmdTask,
|
|
105046
|
+
getTask: deps.getCmmdTask
|
|
104981
105047
|
});
|
|
104982
105048
|
const maybeSyncCmmdTaskAfterGitAction = (cwd, threadId, prUrl) => {
|
|
104983
105049
|
const link = (threadId ? deps.getLinkByThreadId(threadId) : null) ?? deps.getLinkByCwd(cwd);
|
|
@@ -106524,10 +106590,20 @@ const makeWsRpcLayer = (currentSessionId, currentUserId) => WsRpcGroup.toLayer(g
|
|
|
106524
106590
|
taskId,
|
|
106525
106591
|
patch
|
|
106526
106592
|
}));
|
|
106593
|
+
/**
|
|
106594
|
+
* Read a CMMD task's current status via the JWT REST gateway, same
|
|
106595
|
+
* trust plane as updateCmmdTask above. Used to skip a redundant
|
|
106596
|
+
* in_progress write on a thread's first accepted turn.
|
|
106597
|
+
*/
|
|
106598
|
+
const getCmmdTask = (sessionId, taskId) => runPromise(getCmmdTaskForSession({
|
|
106599
|
+
sessionId,
|
|
106600
|
+
taskId
|
|
106601
|
+
}));
|
|
106527
106602
|
const cmmdTaskSyncWiring = createCmmdTaskSyncWiring({
|
|
106528
106603
|
getLinkByThreadId: getCmmdTaskLinkByThreadId,
|
|
106529
106604
|
getLinkByCwd: getCmmdTaskLinkByCwd,
|
|
106530
106605
|
updateCmmdTask,
|
|
106606
|
+
getCmmdTask,
|
|
106531
106607
|
recordCmmdWorkRunPrLink: ({ link, prUrl }) => recordCmmdWorkRunPrLink({ upsert: (input) => runPromise(cmmdWorkRunGithubLinks.upsert(input)) }, {
|
|
106532
106608
|
link,
|
|
106533
106609
|
prUrl
|
|
@@ -297575,7 +297651,7 @@ function resolveBuildCommitFromEnv(env) {
|
|
|
297575
297651
|
* environment descriptor down instead of reporting an honest "unknown".
|
|
297576
297652
|
*/
|
|
297577
297653
|
function readBakedBuildCommit() {
|
|
297578
|
-
return "
|
|
297654
|
+
return "a73d6f2a2de424a153f210a9aa30f454b41cacff";
|
|
297579
297655
|
}
|
|
297580
297656
|
async function resolveServerBuildCommit(input) {
|
|
297581
297657
|
if (isFullCommitSha(input.baked)) return input.baked;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Ha as t,Mi as n,Ua as r,Wa as i}from"./Stream-mUTFnSY9.js";import{Al as a,Fn as o,Gc as s,Hr as c,Jc as l,Qr as u,Rr as d,Sr as f,Tn as p,Uc as m,Xr as h,_r as g,d as _,fn as v,fr as y,gr as b,i as x,is as S,jn as C,l as w,m as T,ms as E,n as D,qc as O,qt as k,r as A,u as j,za as M,zr as N}from"./DiffPanelShell-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Ha as t,Mi as n,Ua as r,Wa as i}from"./Stream-mUTFnSY9.js";import{Al as a,Fn as o,Gc as s,Hr as c,Jc as l,Qr as u,Rr as d,Sr as f,Tn as p,Uc as m,Xr as h,_r as g,d as _,fn as v,fr as y,gr as b,i as x,is as S,jn as C,l as w,m as T,ms as E,n as D,qc as O,qt as k,r as A,u as j,za as M,zr as N}from"./DiffPanelShell-C2-NaTXj.js";import{hn as P}from"./CompositeItem-BsSeqHOM.js";import{a as F,c as I,f as L,i as R,l as z,m as B,n as V,o as H,p as U,r as W,s as G,t as K}from"./Virtualizer-BscgnuJo.js";import{Dn as q,at as J,it as ee}from"./src-IM0FnQax.js";import{a as te,c as ne,d as re,h as ie,i as ae,l as oe,m as se,n as ce,o as Y,p as le,r as ue,s as de,t as fe,u as pe}from"./DiffPanel.logic-D61GzgVU.js";var X=e(i(),1),me=typeof window>`u`?X.useEffect:X.useLayoutEffect;function he({fileDiff:e,options:t,editorOptions:n,lineAnnotations:r,selectedLines:i,prerenderedHTML:a,metrics:o,hasGutterRenderUtility:s,hasCustomHeader:c,disableWorkerPool:l,edit:u}){let d=V(),f=i!==void 0,p=(0,X.useContext)(x),m=j(),h=(0,X.useRef)(null),g=_(n=>{if(n!=null){if(h.current!=null)throw Error(`useFileDiffInstance: An instance should not already exist when a node is created`);d==null?h.current=new re(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),l?void 0:p,!0):h.current=new pe(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),d,o,l?void 0:p,!0),h.current.hydrate({fileDiff:e,fileContainer:n,lineAnnotations:r,prerenderedHTML:a})}else{if(h.current==null)throw Error(`useFileDiffInstance: A FileDiff instance should exist when unmounting`);h.current.cleanUp(),h.current=null}});return me(()=>{let{current:n}=h;if(n==null)return;let a=Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),o=a!==void 0&&!k(n.options,a);n.setOptions(a),n.render({forceRender:o,fileDiff:e,lineAnnotations:r}),i!==void 0&&n.setSelectedLines(i)}),me(()=>{if(u&&h.current!=null){if(m===void 0)throw Error(`FileDiff: EditContext is not attached`);let e=m(n??{});if(e==null)throw Error(`FileDiff: EditProvider.createEditor must return an editor instance`);try{return e.edit(h.current)}catch(t){throw e.cleanUp(),t}}},[u]),{ref:g,getHoveredLine:(0,X.useCallback)(()=>h.current?.getHoveredLine(),[])}}function Z({options:e,controlledSelection:t,hasCustomHeader:n,hasGutterRenderUtility:r}){return t||r||n?{...e,controlledSelection:t,renderCustomHeader:n?w:e?.renderCustomHeader,renderGutterUtility:r?w:e?.renderGutterUtility}:e}var Q=r();function ge({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,className:o,style:s,prerenderedHTML:c,renderAnnotation:l,renderCustomHeader:u,renderHeaderPrefix:d,renderHeaderFilenameSuffix:f,renderHeaderMetadata:p,renderGutterUtility:m,disableWorkerPool:h=!1,edit:g=!1}){let{ref:_,getHoveredLine:y}=he({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,prerenderedHTML:c,hasGutterRenderUtility:m!=null,hasCustomHeader:u!=null,disableWorkerPool:h,edit:g});return(0,Q.jsx)(v,{ref:_,className:o,style:s,children:W(oe({fileDiff:e,renderCustomHeader:u,renderHeaderPrefix:d,renderHeaderFilenameSuffix:f,renderHeaderMetadata:p,renderAnnotation:l,renderGutterUtility:m,lineAnnotations:i,getHoveredLine:y}),c)})}var $=t();function _e(e){return e.fromTurnCount===0?q(ee)({threadId:e.threadId,toTurnCount:e.toTurnCount}).pipe(n(e=>({kind:`fullThreadDiff`,input:e}))):q(J)({threadId:e.threadId,fromTurnCount:e.fromTurnCount,toTurnCount:e.toTurnCount}).pipe(n(e=>({kind:`turnDiff`,input:e})))}function ve(e){return e instanceof Error?e.message:typeof e==`string`?e:``}function ye(e){let t=ve(e).trim();if(t.length===0)return`Failed to load checkpoint diff.`;let n=t.toLowerCase();if(n.includes(`not a git repository`))return`Turn diffs are unavailable because this project is not a git repository.`;if(n.includes(`checkpoint unavailable for thread`)||n.includes(`checkpoint invariant violation`)){let e=t.indexOf(`:`);if(e>=0){let n=t.slice(e+1).trim();if(n.length>0)return n}}return t}function be(e){let t=ve(e).toLowerCase();return t.includes(`exceeds current turn count`)||t.includes(`checkpoint is unavailable for turn`)||t.includes(`filesystem checkpoint is unavailable`)}function xe(e){let t=_e(e);return O({queryKey:M.checkpointDiff(e),queryFn:async({signal:n})=>{if(!e.environmentId||!e.threadId||t._tag===`None`)throw Error(`Checkpoint diff is unavailable.`);let r=c(e.environmentId);try{return t.value.kind===`fullThreadDiff`?await r.orchestration.getFullThreadDiff(t.value.input,{signal:n}):await r.orchestration.getTurnDiff(t.value.input,{signal:n})}catch(e){throw Error(ye(e),{cause:e})}},enabled:(e.enabled??!0)&&!!e.environmentId&&!!e.threadId&&t._tag===`Some`,staleTime:1/0,retry:(e,t)=>be(t)?e<12:e<3,retryDelay:(e,t)=>be(t)?Math.min(5e3,250*2**(e-1)):Math.min(1e3,100*2**(e-1))})}function Se(e){if(!(!e.canScrollLeft&&!e.canScrollRight))return{maskImage:`linear-gradient(to right, ${e.canScrollLeft?`transparent 24px, black 72px`:`black`}, ${e.canScrollRight?`black calc(100% - 72px), transparent calc(100% - 24px)`:`black`})`}}function Ce(e){return e instanceof Error?e.message:e?`Failed to load checkpoint diff.`:null}function we(e){return{environmentId:e.environmentId??null,threadId:e.threadId,fromTurnCount:e.range?.fromTurnCount??null,toTurnCount:e.range?.toTurnCount??null,cacheScope:e.selectedTurnId?`turn:${e.selectedTurnId}`:e.conversationCacheScope,enabled:e.enabled}}function Te(){let e=(0,$.c)(8),t=(0,X.useRef)(null),[n,r]=(0,X.useState)(!1),[i,a]=(0,X.useState)(!1),o;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(o=()=>{let e=t.current;if(!e){r(!1),a(!1);return}let n=de({scrollLeft:e.scrollLeft,scrollWidth:e.scrollWidth,clientWidth:e.clientWidth});r(n.canScrollLeft),a(n.canScrollRight)},e[0]=o):o=e[0];let s=o,c;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(c=e=>{t.current?.scrollBy({left:e,behavior:`smooth`})},e[1]=c):c=e[1];let l=c,u;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(u=e=>{let n=t.current;n&&ne({scrollWidth:n.scrollWidth,clientWidth:n.clientWidth,deltaX:e.deltaX,deltaY:e.deltaY})&&(e.preventDefault(),n.scrollBy({left:e.deltaY,behavior:`auto`}))},e[2]=u):u=e[2];let d=u,f,p;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(f=()=>{let e=t.current;if(!e)return;let n=window.requestAnimationFrame(s),r=()=>s();e.addEventListener(`scroll`,r,{passive:!0});let i=new ResizeObserver(()=>s());return i.observe(e),()=>{window.cancelAnimationFrame(n),e.removeEventListener(`scroll`,r),i.disconnect()}},p=[s],e[3]=f,e[4]=p):(f=e[3],p=e[4]),(0,X.useEffect)(f,p);let m;return e[5]!==n||e[6]!==i?(m={ref:t,canScrollLeft:n,canScrollRight:i,scrollBy:l,onWheel:d,remeasure:s},e[5]=n,e[6]=i,e[7]=m):m=e[7],m}function Ee(e,t){let n=(0,$.c)(5),r;n[0]===e.current?r=n[1]:(r=()=>{(e.current?.querySelector(`[data-turn-chip-selected='true']`))?.scrollIntoView({block:`nearest`,inline:`nearest`,behavior:`smooth`})},n[0]=e.current,n[1]=r);let i;n[2]!==e||n[3]!==t?(i=[e,t],n[2]=e,n[3]=t,n[4]=i):i=n[4],(0,X.useEffect)(r,i)}var De=`
|
|
2
2
|
[data-diffs-header],
|
|
3
3
|
[data-diff],
|
|
4
4
|
[data-file],
|
|
@@ -61,4 +61,4 @@ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Ha as t,Mi as n,Ua as
|
|
|
61
61
|
text-decoration-color: currentColor;
|
|
62
62
|
}
|
|
63
63
|
`;function Oe(e){let t=(0,$.c)(44),{mode:n}=e,r=n===void 0?`inline`:n,{resolvedTheme:i}=b(),a=g(),[c,l]=(0,X.useState)(`stacked`),[u,d]=(0,X.useState)(a.diffWordWrap),h=(0,X.useRef)(null),_=(0,X.useRef)(!1),v=Te(),{activeCwd:y,activeThread:x,bodyState:S,diffOpen:C,inferredCheckpointTurnCountByTurnId:w,orderedTurnDiffSummaries:T,renderableFiles:E,renderablePatch:D,selectedFilePath:O,selectedTurn:k,selectedTurnId:j}=Le(i),M,P;t[0]!==C||t[1]!==a.diffWordWrap?(M=()=>{C&&!_.current&&d(a.diffWordWrap),_.current=C},P=[C,a.diffWordWrap],t[0]=C,t[1]=a.diffWordWrap,t[2]=M,t[3]=P):(M=t[2],P=t[3]),(0,X.useEffect)(M,P);let F;t[4]===O?F=t[5]:(F=()=>{!O||!h.current||Array.from(h.current.querySelectorAll(`[data-diff-file-path]`)).find(e=>e.dataset.diffFilePath===O)?.scrollIntoView({block:`nearest`})},t[4]=O,t[5]=F);let I;t[6]!==E||t[7]!==O?(I=[O,E],t[6]=E,t[7]=O,t[8]=I):I=t[8],(0,X.useEffect)(F,I);let L;t[9]===y?L=t[10]:(L=e=>{let t=f();if(!t)return;let n=y?p(e,y):e;N(t,n).catch(ke)},t[9]=y,t[10]=L);let R=L,z;t[11]===x?z=t[12]:(z=e=>{x&&o.getState().openDiff(s(m(x.environmentId,x.id)),e)},t[11]=x,t[12]=z);let B=z,V;t[13]===x?V=t[14]:(V=()=>{x&&o.getState().openDiff(s(m(x.environmentId,x.id)))},t[13]=x,t[14]=V);let H=V,U;t[15]===v.remeasure?U=t[16]:(U=()=>{let e=window.requestAnimationFrame(v.remeasure);return()=>window.cancelAnimationFrame(e)},t[15]=v.remeasure,t[16]=U);let W;t[17]!==T||t[18]!==j||t[19]!==v.remeasure?(W=[T,j,v.remeasure],t[17]=T,t[18]=j,t[19]=v.remeasure,t[20]=W):W=t[20],(0,X.useEffect)(U,W),Ee(v.ref,k?.turnId??j);let G;t[21]!==c||t[22]!==u||t[23]!==w||t[24]!==T||t[25]!==B||t[26]!==H||t[27]!==k||t[28]!==j||t[29]!==a||t[30]!==v?(G=(0,Q.jsx)(Ae,{diffRenderMode:c,diffWordWrap:u,inferredCheckpointTurnCountByTurnId:w,orderedTurnDiffSummaries:T,selectTurn:B,selectWholeConversation:H,selectedTurn:k,selectedTurnId:j,setDiffRenderMode:l,setDiffWordWrap:d,settings:a,turnStrip:v}),t[21]=c,t[22]=u,t[23]=w,t[24]=T,t[25]=B,t[26]=H,t[27]=k,t[28]=j,t[29]=a,t[30]=v,t[31]=G):G=t[31];let K=G,q;t[32]!==S||t[33]!==c||t[34]!==u||t[35]!==R||t[36]!==E||t[37]!==D||t[38]!==i?(q=(0,Q.jsx)(je,{bodyState:S,diffRenderMode:c,diffWordWrap:u,openDiffFileInEditor:R,patchViewportRef:h,renderableFiles:E,renderablePatch:D,resolvedTheme:i}),t[32]=S,t[33]=c,t[34]=u,t[35]=R,t[36]=E,t[37]=D,t[38]=i,t[39]=q):q=t[39];let J;return t[40]!==K||t[41]!==r||t[42]!==q?(J=(0,Q.jsx)(A,{mode:r,header:K,children:q}),t[40]=K,t[41]=r,t[42]=q,t[43]=J):J=t[43],J}function ke(e){console.warn(`Failed to open diff file in editor.`,e)}function Ae(e){let t=(0,$.c)(59),{diffRenderMode:n,diffWordWrap:r,inferredCheckpointTurnCountByTurnId:i,orderedTurnDiffSummaries:a,selectTurn:o,selectWholeConversation:s,selectedTurn:c,selectedTurnId:l,setDiffRenderMode:u,setDiffWordWrap:d,settings:f,turnStrip:p}=e,m,h;t[0]===p?(m=t[1],h=t[2]):(m=(0,Q.jsx)(Be,{direction:`left`,strip:p}),h=(0,Q.jsx)(Be,{direction:`right`,strip:p}),t[0]=p,t[1]=m,t[2]=h);let g=p.ref,_;t[3]!==p.canScrollLeft||t[4]!==p.canScrollRight?(_=Se({canScrollLeft:p.canScrollLeft,canScrollRight:p.canScrollRight}),t[3]=p.canScrollLeft,t[4]=p.canScrollRight,t[5]=_):_=t[5];let v=p.onWheel,y=l===null,b=l===null?`border-border bg-accent text-accent-foreground`:`border-border/70 bg-background/70 text-muted-foreground/80 hover:border-border hover:text-foreground/80`,x;t[6]===b?x=t[7]:(x=P(`rounded-md border px-2 py-1 text-left transition-colors`,b),t[6]=b,t[7]=x);let S;t[8]===Symbol.for(`react.memo_cache_sentinel`)?(S=(0,Q.jsx)(`div`,{className:`text-[10px] leading-tight font-medium`,children:`All turns`}),t[8]=S):S=t[8];let C;t[9]===x?C=t[10]:(C=(0,Q.jsx)(`div`,{className:x,children:S}),t[9]=x,t[10]=C);let w;t[11]!==s||t[12]!==C||t[13]!==y?(w=(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-md`,onClick:s,"data-turn-chip-selected":y,children:C}),t[11]=s,t[12]=C,t[13]=y,t[14]=w):w=t[14];let T;if(t[15]!==i||t[16]!==a||t[17]!==o||t[18]!==c?.turnId||t[19]!==f){let e;t[21]!==i||t[22]!==o||t[23]!==c?.turnId||t[24]!==f?(e=e=>(0,Q.jsx)(Ve,{summary:e,selected:e.turnId===c?.turnId,turnCount:e.checkpointTurnCount??i[e.turnId],timestampFormat:f.timestampFormat,onSelect:o},e.turnId),t[21]=i,t[22]=o,t[23]=c?.turnId,t[24]=f,t[25]=e):e=t[25],T=a.map(e),t[15]=i,t[16]=a,t[17]=o,t[18]=c?.turnId,t[19]=f,t[20]=T}else T=t[20];let E;t[26]!==w||t[27]!==T||t[28]!==_||t[29]!==p.onWheel||t[30]!==p.ref?(E=(0,Q.jsxs)(`div`,{ref:g,className:`turn-chip-strip flex gap-1 overflow-x-auto px-8 py-0.5`,style:_,onWheel:v,children:[w,T]}),t[26]=w,t[27]=T,t[28]=_,t[29]=p.onWheel,t[30]=p.ref,t[31]=E):E=t[31];let D;t[32]!==m||t[33]!==E||t[34]!==h?(D=(0,Q.jsxs)(`div`,{className:`relative min-w-0 flex-1 [-webkit-app-region:no-drag]`,children:[m,h,E]}),t[32]=m,t[33]=E,t[34]=h,t[35]=D):D=t[35];let O;t[36]===n?O=t[37]:(O=[n],t[36]=n,t[37]=O);let k;t[38]===u?k=t[39]:(k=e=>{let t=e[0];(t===`stacked`||t===`split`)&&u(t)},t[38]=u,t[39]=k);let A;t[40]===Symbol.for(`react.memo_cache_sentinel`)?(A=(0,Q.jsx)(R,{"aria-label":`Stacked diff view`,value:`stacked`,children:(0,Q.jsx)(se,{className:`size-3`})}),t[40]=A):A=t[40];let j;t[41]===Symbol.for(`react.memo_cache_sentinel`)?(j=(0,Q.jsx)(R,{"aria-label":`Split diff view`,value:`split`,children:(0,Q.jsx)(ie,{className:`size-3`})}),t[41]=j):j=t[41];let M;t[42]!==O||t[43]!==k?(M=(0,Q.jsxs)(F,{className:`shrink-0`,variant:`outline`,size:`xs`,value:O,onValueChange:k,children:[A,j]}),t[42]=O,t[43]=k,t[44]=M):M=t[44];let N=r?`Disable diff line wrapping`:`Enable diff line wrapping`,I=r?`Disable line wrapping`:`Enable line wrapping`,L;t[45]===d?L=t[46]:(L=e=>{d(!!e)},t[45]=d,t[46]=L);let z;t[47]===Symbol.for(`react.memo_cache_sentinel`)?(z=(0,Q.jsx)(le,{className:`size-3`}),t[47]=z):z=t[47];let B;t[48]!==r||t[49]!==N||t[50]!==I||t[51]!==L?(B=(0,Q.jsx)(R,{"aria-label":N,title:I,variant:`outline`,size:`xs`,pressed:r,onPressedChange:L,children:z}),t[48]=r,t[49]=N,t[50]=I,t[51]=L,t[52]=B):B=t[52];let V;t[53]!==M||t[54]!==B?(V=(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 [-webkit-app-region:no-drag]`,children:[M,B]}),t[53]=M,t[54]=B,t[55]=V):V=t[55];let H;return t[56]!==D||t[57]!==V?(H=(0,Q.jsxs)(Q.Fragment,{children:[D,V]}),t[56]=D,t[57]=V,t[58]=H):H=t[58],H}function je(e){let t=(0,$.c)(18),{bodyState:n,diffRenderMode:r,diffWordWrap:i,openDiffFileInEditor:a,patchViewportRef:o,renderableFiles:s,renderablePatch:c,resolvedTheme:l}=e;if(n.kind===`no-thread`){let e;return t[0]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(Ne,{children:`Select a thread to inspect turn diffs.`}),t[0]=e):e=t[0],e}if(n.kind===`not-git-repo`){let e;return t[1]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(Ne,{children:`Turn diffs are unavailable because this project is not a git repository.`}),t[1]=e):e=t[1],e}if(n.kind===`no-completed-turns`){let e;return t[2]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(Ne,{children:`No completed turns yet.`}),t[2]=e):e=t[2],e}let u;t[3]!==n.error||t[4]!==c?(u=n.error&&!c&&(0,Q.jsx)(`div`,{className:`px-3`,children:(0,Q.jsx)(`p`,{className:`mb-2 text-[11px] text-destructive-foreground`,children:n.error})}),t[3]=n.error,t[4]=c,t[5]=u):u=t[5];let d;t[6]!==n||t[7]!==r||t[8]!==i||t[9]!==a||t[10]!==s||t[11]!==c||t[12]!==l?(d=c?c.kind===`files`?(0,Q.jsx)(K,{className:`diff-render-surface h-full min-h-0 overflow-auto px-2 pb-2`,config:{overscrollSize:600,intersectionObserverMargin:1200},children:s.map(e=>{let t=Y(e),n=`${fe(e)}:${l}`;return(0,Q.jsx)(`div`,{"data-diff-file-path":t,className:`diff-render-file mb-2 rounded-md first:mt-2 last:mb-0`,onClickCapture:e=>{(e.nativeEvent.composedPath?.()??[]).some(Me)&&a(t)},children:(0,Q.jsx)(ge,{fileDiff:e,options:{diffStyle:r===`split`?`split`:`unified`,lineDiffType:`none`,overflow:i?`wrap`:`scroll`,theme:T(l),themeType:l,unsafeCSS:De}})},n)})}):(0,Q.jsx)(`div`,{className:`h-full overflow-auto p-2`,children:(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(`p`,{className:`text-[11px] text-muted-foreground/75`,children:c.reason}),(0,Q.jsx)(`pre`,{className:P(`max-h-[72vh] rounded-md border border-border/70 bg-background/70 p-3 font-mono text-[11px] leading-relaxed text-muted-foreground/90`,i?`overflow-auto whitespace-pre-wrap wrap-break-word`:`overflow-auto`),children:c.text})]})}):(0,Q.jsx)(Re,{bodyState:n}),t[6]=n,t[7]=r,t[8]=i,t[9]=a,t[10]=s,t[11]=c,t[12]=l,t[13]=d):d=t[13];let f;return t[14]!==o||t[15]!==u||t[16]!==d?(f=(0,Q.jsx)(Q.Fragment,{children:(0,Q.jsxs)(`div`,{ref:o,className:`diff-panel-viewport min-h-0 min-w-0 flex-1 overflow-hidden`,children:[u,d]})}),t[14]=o,t[15]=u,t[16]=d,t[17]=f):f=t[17],f}function Me(e){return e instanceof Element&&e.hasAttribute(`data-title`)}function Ne(e){let t=(0,$.c)(2),{children:n}=e,r;return t[0]===n?r=t[1]:(r=(0,Q.jsx)(`div`,{className:`flex flex-1 items-center justify-center px-5 text-center text-xs text-muted-foreground/70`,children:n}),t[0]=n,t[1]=r),r}function Pe(){let e=(0,$.c)(19),t;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t={strict:!1,select:Ie},e[0]=t):t=e[0];let n=a(t),r;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(r={strict:!1,select:Fe},e[1]=r):r=e[1];let i=B(r),o=i.rightPanel===`diff`,s=n?.threadId??null,c,l;e[2]===n?l=e[3]:(l=C(n),e[2]=n,e[3]=l),c=l;let u=E(c),f=He(u),p=u?.worktreePath,m=f?.cwd,h;e[4]!==p||e[5]!==m?(h=I({threadWorktreePath:p,projectCwd:m}),e[4]=p,e[5]=m,e[6]=h):h=e[6];let g=h,_=u?.environmentId??null,v=g??null,y;e[7]!==_||e[8]!==v?(y={environmentId:_,cwd:v},e[7]=_,e[8]=v,e[9]=y):y=e[9];let b=d(y),x;e[10]===b.data?x=e[11]:(x=z(b.data),e[10]=b.data,e[11]=x);let S=x,w;return e[12]!==g||e[13]!==u||e[14]!==s||e[15]!==o||e[16]!==i||e[17]!==S?(w={activeThread:u,activeThreadId:s,activeCwd:g,isGitRepo:S,diffSearch:i,diffOpen:o},e[12]=g,e[13]=u,e[14]=s,e[15]=o,e[16]=i,e[17]=S,e[18]=w):w=e[18],w}function Fe(e){return G(e)}function Ie(e){return h(e)}function Le(e){let{activeThread:t,activeThreadId:n,activeCwd:r,isGitRepo:i,diffSearch:a,diffOpen:o}=Pe(),{turnDiffSummaries:s,inferredCheckpointTurnCountByTurnId:c}=H(t),u=a.diffTurnId??null,d=u===null?null:a.diffFilePath??null,{activeCheckpointRange:f,conversationCacheScope:p,orderedTurnDiffSummaries:m,selectedTurn:h}=(0,X.useMemo)(()=>te({summaries:s,inferredCheckpointTurnCountByTurnId:c,selectedTurnId:u}),[c,u,s]),g=l(xe(we({environmentId:t?.environmentId,threadId:n,range:f,selectedTurnId:h?.turnId,conversationCacheScope:p,enabled:i}))),_=g.isLoading,v=Ce(g.error),y=g.data?.diff,b=typeof y==`string`&&y.trim().length===0,{emptyDiffMessage:x}=(0,X.useMemo)(()=>ae(h),[h]),S=(0,X.useMemo)(()=>ce(y,`diff-panel:${e}`),[e,y]),C=(0,X.useMemo)(()=>Ue(S),[S]);return{activeCwd:r,activeThread:t,bodyState:ue({hasActiveThread:!!t,isGitRepo:i,turnSummaryCount:m.length,checkpointDiffError:v,hasRenderablePatch:!!S,isLoadingCheckpointDiff:_,hasNoNetChanges:b,emptyDiffMessage:x}),diffOpen:o,inferredCheckpointTurnCountByTurnId:c,orderedTurnDiffSummaries:m,renderableFiles:C,renderablePatch:S,selectedFilePath:d,selectedTurn:h,selectedTurnId:u}}function Re(e){let t=(0,$.c)(4),{bodyState:n}=e;if(n.kind===`loading`){let e;return t[0]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(D,{label:`Loading checkpoint diff...`}),t[0]=e):e=t[0],e}let r;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,Q.jsx)(L,{className:`size-7 text-muted-foreground/25`}),t[1]=r):r=t[1];let i=n.kind===`empty`?n.message:`No diff is available for this range.`,a;return t[2]===i?a=t[3]:(a=(0,Q.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-2 px-5 py-2 text-center`,children:[r,(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground/70`,children:i})]}),t[2]=i,t[3]=a),a}var ze=180;function Be(e){let t=(0,$.c)(14),{direction:n,strip:r}=e,i=n===`left`,a=i?r.canScrollLeft:r.canScrollRight,o=i?U:u,s=i?`left-0`:`right-0`,c=a?`border-border/70 hover:border-border hover:text-foreground`:`cursor-not-allowed border-border/40 text-muted-foreground/40`,l;t[0]!==s||t[1]!==c?(l=P(`absolute top-1/2 z-20 inline-flex size-6 -translate-y-1/2 items-center justify-center rounded-md border bg-background/90 text-muted-foreground transition-colors`,s,c),t[0]=s,t[1]=c,t[2]=l):l=t[2];let d;t[3]!==i||t[4]!==r?(d=()=>r.scrollBy(i?-180:ze),t[3]=i,t[4]=r,t[5]=d):d=t[5];let f=!a,p=`Scroll turn list ${n}`,m;t[6]===o?m=t[7]:(m=(0,Q.jsx)(o,{className:`size-3.5`}),t[6]=o,t[7]=m);let h;return t[8]!==l||t[9]!==d||t[10]!==f||t[11]!==p||t[12]!==m?(h=(0,Q.jsx)(`button`,{type:`button`,className:l,onClick:d,disabled:f,"aria-label":p,children:m}),t[8]=l,t[9]=d,t[10]=f,t[11]=p,t[12]=m,t[13]=h):h=t[13],h}function Ve(e){let t=(0,$.c)(23),{summary:n,selected:r,turnCount:i,timestampFormat:a,onSelect:o}=e,s;t[0]!==o||t[1]!==n.turnId?(s=()=>o(n.turnId),t[0]=o,t[1]=n.turnId,t[2]=s):s=t[2];let c=n.turnId,l=r?`border-border bg-accent text-accent-foreground`:`border-border/70 bg-background/70 text-muted-foreground/80 hover:border-border hover:text-foreground/80`,u;t[3]===l?u=t[4]:(u=P(`rounded-md border px-2 py-1 text-left transition-colors`,l),t[3]=l,t[4]=u);let d=i??`?`,f;t[5]===d?f=t[6]:(f=(0,Q.jsxs)(`span`,{className:`text-[10px] leading-tight font-medium`,children:[`Turn `,d]}),t[5]=d,t[6]=f);let p;t[7]!==n.completedAt||t[8]!==a?(p=y(n.completedAt,a),t[7]=n.completedAt,t[8]=a,t[9]=p):p=t[9];let m;t[10]===p?m=t[11]:(m=(0,Q.jsx)(`span`,{className:`text-[9px] leading-tight opacity-70`,children:p}),t[10]=p,t[11]=m);let h;t[12]!==f||t[13]!==m?(h=(0,Q.jsxs)(`div`,{className:`flex items-center gap-1`,children:[f,m]}),t[12]=f,t[13]=m,t[14]=h):h=t[14];let g;t[15]!==u||t[16]!==h?(g=(0,Q.jsx)(`div`,{className:u,children:h}),t[15]=u,t[16]=h,t[17]=g):g=t[17];let _;return t[18]!==r||t[19]!==n.turnId||t[20]!==s||t[21]!==g?(_=(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-md`,onClick:s,title:c,"data-turn-chip-selected":r,children:g}),t[18]=r,t[19]=n.turnId,t[20]=s,t[21]=g,t[22]=_):_=t[22],_}function He(e){let t=(0,$.c)(3),n=e?.environmentId,r=e?.projectId,i;return t[0]!==n||t[1]!==r?(i=e=>n&&r?S(e,{environmentId:n,projectId:r}):void 0,t[0]=n,t[1]=r,t[2]=i):i=t[2],E(i)}function Ue(e){return!e||e.kind!==`files`?[]:e.files.toSorted((e,t)=>Y(e).localeCompare(Y(t),void 0,{numeric:!0,sensitivity:`base`}))}export{Oe as default};
|
|
64
|
-
//# sourceMappingURL=DiffPanel-
|
|
64
|
+
//# sourceMappingURL=DiffPanel-C1yePuJx.js.map
|