@cmmd-center/forge 0.13.58 → 0.13.59
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 +107 -31
- package/dist/client/assets/{DiffPanel-BiFFFyIe.js → DiffPanel-JpbLlXfS.js} +2 -2
- package/dist/client/assets/{DiffPanel.logic-DVEZIsSc.js → DiffPanel.logic-gFl9qk1Z.js} +2 -2
- package/dist/client/assets/{DiffPanelShell-DwhtaL1t.js → DiffPanelShell-BNxBvFOc.js} +3 -3
- package/dist/client/assets/{DiffWorkerPoolProvider-CxpBlXbz.js → DiffWorkerPoolProvider-D_Z5pShe.js} +2 -2
- package/dist/client/assets/{PullRequestCodePanel-V2a2Ml6x.js → PullRequestCodePanel-CHbECZJu.js} +2 -2
- package/dist/client/assets/{Virtualizer-CwEtgTLm.js → Virtualizer-BaIQMDnd.js} +2 -2
- package/dist/client/assets/{index-YH4zDbqw.js → index-Bfeu00Ds.js} +6 -6
- package/dist/client/index.html +4 -4
- package/dist/forge-build.json +1 -1
- package/dist/{open-2-reBrpv.mjs → open-yHTUkd2Y.mjs} +3 -3
- 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.59";
|
|
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 "b9f81be3009c6dbfacd508a2708f000a06040c9b";
|
|
298134
298210
|
}
|
|
298135
298211
|
async function resolveServerBuildCommit(input) {
|
|
298136
298212
|
if (isFullCommitSha(input.baked)) return input.baked;
|
package/dist/bin.mjs
CHANGED
|
@@ -23,7 +23,7 @@ import { createCipheriv, createDecipheriv, createHash, createHmac, createPublicK
|
|
|
23
23
|
import * as FS$1 from "node:fs";
|
|
24
24
|
import fs, { accessSync, chmodSync, constants, createReadStream, existsSync, mkdirSync, mkdtempSync, promises, readFile, readFileSync, readdir, readdirSync, realpathSync, rmSync, statSync, unlinkSync, writeFileSync } from "node:fs";
|
|
25
25
|
import * as NodeOS from "node:os";
|
|
26
|
-
import
|
|
26
|
+
import os, { homedir, networkInterfaces, tmpdir } from "node:os";
|
|
27
27
|
import * as Path$1 from "node:path";
|
|
28
28
|
import path, { basename, delimiter, dirname, extname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
|
|
29
29
|
import { pathToFileURL } from "node:url";
|
|
@@ -50573,7 +50573,7 @@ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
|
|
|
50573
50573
|
const min = forceColor || 0;
|
|
50574
50574
|
if (env.TERM === "dumb") return min;
|
|
50575
50575
|
if (process$1.platform === "win32") {
|
|
50576
|
-
const osRelease =
|
|
50576
|
+
const osRelease = os.release().split(".");
|
|
50577
50577
|
if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) return Number(osRelease[2]) >= 14931 ? 3 : 2;
|
|
50578
50578
|
return 1;
|
|
50579
50579
|
}
|
|
@@ -53016,7 +53016,7 @@ var require_ProcessDetector = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
53016
53016
|
exports.processDetector = void 0;
|
|
53017
53017
|
const api_1 = (init_esm$1(), __toCommonJS(esm_exports$1));
|
|
53018
53018
|
const semconv_1 = require_semconv$1();
|
|
53019
|
-
const os$
|
|
53019
|
+
const os$4 = __require("os");
|
|
53020
53020
|
/**
|
|
53021
53021
|
* ProcessDetector will be used to detect the resources related current process running
|
|
53022
53022
|
* and being instrumented from the NodeJS Process module.
|
|
@@ -53038,7 +53038,7 @@ var require_ProcessDetector = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
53038
53038
|
};
|
|
53039
53039
|
if (process.argv.length > 1) attributes[semconv_1.ATTR_PROCESS_COMMAND] = process.argv[1];
|
|
53040
53040
|
try {
|
|
53041
|
-
const userInfo = os$
|
|
53041
|
+
const userInfo = os$4.userInfo();
|
|
53042
53042
|
attributes[semconv_1.ATTR_PROCESS_OWNER] = userInfo.username;
|
|
53043
53043
|
} catch (e) {
|
|
53044
53044
|
api_1.diag.debug(`error obtaining process owner: ${e}`);
|
|
@@ -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.59";
|
|
65965
65965
|
//#endregion
|
|
65966
65966
|
//#region src/sentry.ts
|
|
65967
65967
|
const SERVER_APP_NAME = "forge-server";
|
|
@@ -75844,7 +75844,7 @@ var require_node_gyp_build = /* @__PURE__ */ __commonJSMin(((exports, module) =>
|
|
|
75844
75844
|
var fs$6 = __require("fs");
|
|
75845
75845
|
var path$5 = __require("path");
|
|
75846
75846
|
var url$1 = __require("url");
|
|
75847
|
-
var os$
|
|
75847
|
+
var os$3 = __require("os");
|
|
75848
75848
|
var runtimeRequire = typeof __webpack_require__ === "function" ? __non_webpack_require__ : __require;
|
|
75849
75849
|
var vars = process.config && process.config.variables || {};
|
|
75850
75850
|
var prebuildsOnly = !!process.env.PREBUILDS_ONLY;
|
|
@@ -75852,8 +75852,8 @@ var require_node_gyp_build = /* @__PURE__ */ __commonJSMin(((exports, module) =>
|
|
|
75852
75852
|
var abi = versions.modules;
|
|
75853
75853
|
if (versions.deno || process.isBun) abi = "unsupported";
|
|
75854
75854
|
var runtime = isElectron() ? "electron" : isNwjs() ? "node-webkit" : "node";
|
|
75855
|
-
var arch = process.env.npm_config_arch || os$
|
|
75856
|
-
var platform = process.env.npm_config_platform || os$
|
|
75855
|
+
var arch = process.env.npm_config_arch || os$3.arch();
|
|
75856
|
+
var platform = process.env.npm_config_platform || os$3.platform();
|
|
75857
75857
|
var libc = process.env.LIBC || (isMusl(platform) ? "musl" : "glibc");
|
|
75858
75858
|
var armv = process.env.ARM_VERSION || (arch === "arm64" ? "8" : vars.arm_version) || "";
|
|
75859
75859
|
var uv = (versions.uv || "").split(".")[0];
|
|
@@ -93606,7 +93606,7 @@ const launchDetached = (launch) => gen(function* () {
|
|
|
93606
93606
|
});
|
|
93607
93607
|
const OpenLive = effect(Open, gen(function* () {
|
|
93608
93608
|
const open = yield* tryPromise({
|
|
93609
|
-
try: () => import("./open-
|
|
93609
|
+
try: () => import("./open-yHTUkd2Y.mjs"),
|
|
93610
93610
|
catch: (cause) => new OpenError$1({
|
|
93611
93611
|
message: "failed to load browser opener",
|
|
93612
93612
|
cause
|
|
@@ -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
|
|
@@ -191124,7 +191200,7 @@ var Vce = {
|
|
|
191124
191200
|
function Ve() {
|
|
191125
191201
|
return Vce;
|
|
191126
191202
|
}
|
|
191127
|
-
var Us =
|
|
191203
|
+
var Us = os.homedir(), lk = os.tmpdir(), { env: Vc } = process$1, Yce = (e) => {
|
|
191128
191204
|
let t = path.join(Us, "Library");
|
|
191129
191205
|
return {
|
|
191130
191206
|
data: path.join(t, "Application Support", e),
|
|
@@ -201324,12 +201400,12 @@ function qZ(e, t) {
|
|
|
201324
201400
|
}
|
|
201325
201401
|
return n;
|
|
201326
201402
|
}
|
|
201327
|
-
var os$
|
|
201403
|
+
var os$2 = "https://code.claude.com/docs/en", kKe = [
|
|
201328
201404
|
{
|
|
201329
201405
|
matches: (e) => e.path === "permissions.defaultMode" && e.code === "invalid_value",
|
|
201330
201406
|
tip: {
|
|
201331
201407
|
suggestion: "Valid modes: \"acceptEdits\" (ask before file changes), \"plan\" (analysis only), \"bypassPermissions\" (auto-accept all), or \"default\" (standard behavior)",
|
|
201332
|
-
docLink: `${os$
|
|
201408
|
+
docLink: `${os$2}/iam#permission-modes`
|
|
201333
201409
|
}
|
|
201334
201410
|
},
|
|
201335
201411
|
{
|
|
@@ -201344,7 +201420,7 @@ var os$1 = "https://code.claude.com/docs/en", kKe = [
|
|
|
201344
201420
|
matches: (e) => e.path.startsWith("env.") && e.code === "invalid_type",
|
|
201345
201421
|
tip: {
|
|
201346
201422
|
suggestion: "Environment variables must be strings. Wrap numbers and booleans in quotes. Example: \"DEBUG\": \"true\", \"PORT\": \"3000\"",
|
|
201347
|
-
docLink: `${os$
|
|
201423
|
+
docLink: `${os$2}/settings#environment-variables`
|
|
201348
201424
|
}
|
|
201349
201425
|
},
|
|
201350
201426
|
{
|
|
@@ -201355,14 +201431,14 @@ var os$1 = "https://code.claude.com/docs/en", kKe = [
|
|
|
201355
201431
|
matches: (e) => e.path.startsWith("hooks.") && e.code === "invalid_key",
|
|
201356
201432
|
tip: {
|
|
201357
201433
|
suggestion: "Not a recognized hook event. Common events: PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, SessionEnd, Stop. Check spelling and capitalization.",
|
|
201358
|
-
docLink: `${os$
|
|
201434
|
+
docLink: `${os$2}/hooks`
|
|
201359
201435
|
}
|
|
201360
201436
|
},
|
|
201361
201437
|
{
|
|
201362
201438
|
matches: (e) => /\.hooks\.\d+\.command$/.test(e.path) && e.code === "invalid_type" && e.received === "undefined",
|
|
201363
201439
|
tip: {
|
|
201364
201440
|
suggestion: "Command hooks require `command`. For exec form (no shell), set `command` to the executable and `args` to its arguments: {\"type\": \"command\", \"command\": \"echo\", \"args\": [\"hi\"]}. For shell form, set `command` to the full shell string: {\"type\": \"command\", \"command\": \"echo hi\"}.",
|
|
201365
|
-
docLink: `${os$
|
|
201441
|
+
docLink: `${os$2}/hooks#exec-form-and-shell-form`
|
|
201366
201442
|
}
|
|
201367
201443
|
},
|
|
201368
201444
|
{
|
|
@@ -201377,7 +201453,7 @@ var os$1 = "https://code.claude.com/docs/en", kKe = [
|
|
|
201377
201453
|
matches: (e) => e.code === "unrecognized_keys",
|
|
201378
201454
|
tip: {
|
|
201379
201455
|
suggestion: "Check for typos or refer to the documentation for valid fields",
|
|
201380
|
-
docLink: `${os$
|
|
201456
|
+
docLink: `${os$2}/settings`
|
|
201381
201457
|
}
|
|
201382
201458
|
},
|
|
201383
201459
|
{
|
|
@@ -201392,13 +201468,13 @@ var os$1 = "https://code.claude.com/docs/en", kKe = [
|
|
|
201392
201468
|
matches: (e) => e.path === "permissions.additionalDirectories" && e.code === "invalid_type",
|
|
201393
201469
|
tip: {
|
|
201394
201470
|
suggestion: "Must be an array of directory paths. Example: [\"~/projects\", \"/tmp/workspace\"]. You can also use --add-dir flag or /add-dir command",
|
|
201395
|
-
docLink: `${os$
|
|
201471
|
+
docLink: `${os$2}/iam#working-directories`
|
|
201396
201472
|
}
|
|
201397
201473
|
}
|
|
201398
201474
|
], AKe = {
|
|
201399
|
-
permissions: `${os$
|
|
201400
|
-
env: `${os$
|
|
201401
|
-
hooks: `${os$
|
|
201475
|
+
permissions: `${os$2}/iam#configuring-permissions`,
|
|
201476
|
+
env: `${os$2}/settings#environment-variables`,
|
|
201477
|
+
hooks: `${os$2}/hooks`
|
|
201402
201478
|
};
|
|
201403
201479
|
function GZ(e) {
|
|
201404
201480
|
let t = kKe.find((r) => r.matches(e));
|
|
@@ -269525,7 +269601,7 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
|
|
|
269525
269601
|
var dgram = __require("dgram");
|
|
269526
269602
|
var thunky = require_thunky();
|
|
269527
269603
|
var events = __require("events");
|
|
269528
|
-
var os = __require("os");
|
|
269604
|
+
var os$1 = __require("os");
|
|
269529
269605
|
var noop = function() {};
|
|
269530
269606
|
module.exports = function(opts) {
|
|
269531
269607
|
if (!opts) opts = {};
|
|
@@ -269656,14 +269732,14 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
|
|
|
269656
269732
|
return that;
|
|
269657
269733
|
};
|
|
269658
269734
|
function defaultInterface() {
|
|
269659
|
-
var networks = os.networkInterfaces();
|
|
269735
|
+
var networks = os$1.networkInterfaces();
|
|
269660
269736
|
var names = Object.keys(networks);
|
|
269661
269737
|
for (var i = 0; i < names.length; i++) {
|
|
269662
269738
|
var net = networks[names[i]];
|
|
269663
269739
|
for (var j = 0; j < net.length; j++) {
|
|
269664
269740
|
var iface = net[j];
|
|
269665
269741
|
if (isIPv4(iface.family) && !iface.internal) {
|
|
269666
|
-
if (os.platform() === "darwin" && names[i] === "en0") return iface.address;
|
|
269742
|
+
if (os$1.platform() === "darwin" && names[i] === "en0") return iface.address;
|
|
269667
269743
|
return "0.0.0.0";
|
|
269668
269744
|
}
|
|
269669
269745
|
}
|
|
@@ -269671,7 +269747,7 @@ var import_multicast_dns = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMi
|
|
|
269671
269747
|
return "127.0.0.1";
|
|
269672
269748
|
}
|
|
269673
269749
|
function allInterfaces() {
|
|
269674
|
-
var networks = os.networkInterfaces();
|
|
269750
|
+
var networks = os$1.networkInterfaces();
|
|
269675
269751
|
var names = Object.keys(networks);
|
|
269676
269752
|
var res = [];
|
|
269677
269753
|
for (var i = 0; i < names.length; i++) {
|
|
@@ -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 "b9f81be3009c6dbfacd508a2708f000a06040c9b";
|
|
297579
297655
|
}
|
|
297580
297656
|
async function resolveServerBuildCommit(input) {
|
|
297581
297657
|
if (isFullCommitSha(input.baked)) return input.baked;
|
|
@@ -322171,7 +322247,7 @@ const connectLoginCommand = make$34("login", {
|
|
|
322171
322247
|
})).json();
|
|
322172
322248
|
},
|
|
322173
322249
|
openBrowser: async (url) => {
|
|
322174
|
-
const open = (await import("./open-
|
|
322250
|
+
const open = (await import("./open-yHTUkd2Y.mjs")).default;
|
|
322175
322251
|
await open(url);
|
|
322176
322252
|
return true;
|
|
322177
322253
|
},
|
|
@@ -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-BNxBvFOc.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-BaIQMDnd.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-gFl9qk1Z.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-JpbLlXfS.js.map
|