@cmmd-center/forge 0.13.57 → 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 CHANGED
@@ -66257,7 +66257,7 @@ function normalizeNumberish(value) {
66257
66257
  }
66258
66258
  //#endregion
66259
66259
  //#region package.json
66260
- var version$1 = "0.13.57";
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 — the same failure semantics the MCP path produced on auth loss.
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 — move only the lead task into the post-merge human QA
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: swallow CMMD failures with no log leak — caller cannot recover. */
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 "75803e7294a9c5ce3815a2980466621052a9ac99";
298209
+ return "b9f81be3009c6dbfacd508a2708f000a06040c9b";
298134
298210
  }
298135
298211
  async function resolveServerBuildCommit(input) {
298136
298212
  if (isFullCommitSha(input.baked)) return input.baked;
@@ -309685,13 +309761,6 @@ registerProxyRoute({
309685
309761
  orgIdSource: "none",
309686
309762
  responseShape: "unwrapData"
309687
309763
  });
309688
- registerProxyRoute({
309689
- forgePath: "/api/cmmd/projects/:id/board/:taskId/spawn-forge-thread",
309690
- method: "POST",
309691
- cmmdPath: "/api/forge/context/projects/:id/board/:taskId/spawn-forge-thread",
309692
- orgIdSource: "none",
309693
- responseShape: "unwrapData"
309694
- });
309695
309764
  registerProxyRoute({
309696
309765
  forgePath: "/api/cmmd/work-items/board",
309697
309766
  method: "GET",
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 $U, { homedir, networkInterfaces, tmpdir } from "node:os";
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 = $U.release().split(".");
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$3 = __require("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$3.userInfo();
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.57";
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$2 = __require("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$2.arch();
75856
- var platform = process.env.npm_config_platform || os$2.platform();
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-2-reBrpv.mjs"),
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 — the same failure semantics the MCP path produced on auth loss.
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 — move only the lead task into the post-merge human QA
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: swallow CMMD failures with no log leak — caller cannot recover. */
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 = $U.homedir(), lk = $U.tmpdir(), { env: Vc } = process$1, Yce = (e) => {
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$1 = "https://code.claude.com/docs/en", kKe = [
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$1}/iam#permission-modes`
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$1}/settings#environment-variables`
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$1}/hooks`
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$1}/hooks#exec-form-and-shell-form`
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$1}/settings`
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$1}/iam#working-directories`
201471
+ docLink: `${os$2}/iam#working-directories`
201396
201472
  }
201397
201473
  }
201398
201474
  ], AKe = {
201399
- permissions: `${os$1}/iam#configuring-permissions`,
201400
- env: `${os$1}/settings#environment-variables`,
201401
- hooks: `${os$1}/hooks`
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 "75803e7294a9c5ce3815a2980466621052a9ac99";
297654
+ return "b9f81be3009c6dbfacd508a2708f000a06040c9b";
297579
297655
  }
297580
297656
  async function resolveServerBuildCommit(input) {
297581
297657
  if (isFullCommitSha(input.baked)) return input.baked;
@@ -309059,13 +309135,6 @@ registerProxyRoute({
309059
309135
  orgIdSource: "none",
309060
309136
  responseShape: "unwrapData"
309061
309137
  });
309062
- registerProxyRoute({
309063
- forgePath: "/api/cmmd/projects/:id/board/:taskId/spawn-forge-thread",
309064
- method: "POST",
309065
- cmmdPath: "/api/forge/context/projects/:id/board/:taskId/spawn-forge-thread",
309066
- orgIdSource: "none",
309067
- responseShape: "unwrapData"
309068
- });
309069
309138
  registerProxyRoute({
309070
309139
  forgePath: "/api/cmmd/work-items/board",
309071
309140
  method: "GET",
@@ -322178,7 +322247,7 @@ const connectLoginCommand = make$34("login", {
322178
322247
  })).json();
322179
322248
  },
322180
322249
  openBrowser: async (url) => {
322181
- const open = (await import("./open-2-reBrpv.mjs")).default;
322250
+ const open = (await import("./open-yHTUkd2Y.mjs")).default;
322182
322251
  await open(url);
322183
322252
  return true;
322184
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-Cdiv0PkY.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-CrhK_x2o.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-COH1pOHw.js";var X=e(i(),1),me=typeof window>`u`?X.useEffect:X.useLayoutEffect;function he({fileDiff:e,options:t,editorOptions:n,lineAnnotations:r,selectedLines:i,prerenderedHTML:a,metrics:o,hasGutterRenderUtility:s,hasCustomHeader:c,disableWorkerPool:l,edit:u}){let d=V(),f=i!==void 0,p=(0,X.useContext)(x),m=j(),h=(0,X.useRef)(null),g=_(n=>{if(n!=null){if(h.current!=null)throw Error(`useFileDiffInstance: An instance should not already exist when a node is created`);d==null?h.current=new re(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),l?void 0:p,!0):h.current=new pe(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),d,o,l?void 0:p,!0),h.current.hydrate({fileDiff:e,fileContainer:n,lineAnnotations:r,prerenderedHTML:a})}else{if(h.current==null)throw Error(`useFileDiffInstance: A FileDiff instance should exist when unmounting`);h.current.cleanUp(),h.current=null}});return me(()=>{let{current:n}=h;if(n==null)return;let a=Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),o=a!==void 0&&!k(n.options,a);n.setOptions(a),n.render({forceRender:o,fileDiff:e,lineAnnotations:r}),i!==void 0&&n.setSelectedLines(i)}),me(()=>{if(u&&h.current!=null){if(m===void 0)throw Error(`FileDiff: EditContext is not attached`);let e=m(n??{});if(e==null)throw Error(`FileDiff: EditProvider.createEditor must return an editor instance`);try{return e.edit(h.current)}catch(t){throw e.cleanUp(),t}}},[u]),{ref:g,getHoveredLine:(0,X.useCallback)(()=>h.current?.getHoveredLine(),[])}}function Z({options:e,controlledSelection:t,hasCustomHeader:n,hasGutterRenderUtility:r}){return t||r||n?{...e,controlledSelection:t,renderCustomHeader:n?w:e?.renderCustomHeader,renderGutterUtility:r?w:e?.renderGutterUtility}:e}var Q=r();function ge({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,className:o,style:s,prerenderedHTML:c,renderAnnotation:l,renderCustomHeader:u,renderHeaderPrefix:d,renderHeaderFilenameSuffix:f,renderHeaderMetadata:p,renderGutterUtility:m,disableWorkerPool:h=!1,edit:g=!1}){let{ref:_,getHoveredLine:y}=he({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,prerenderedHTML:c,hasGutterRenderUtility:m!=null,hasCustomHeader:u!=null,disableWorkerPool:h,edit:g});return(0,Q.jsx)(v,{ref:_,className:o,style:s,children:W(oe({fileDiff:e,renderCustomHeader:u,renderHeaderPrefix:d,renderHeaderFilenameSuffix:f,renderHeaderMetadata:p,renderAnnotation:l,renderGutterUtility:m,lineAnnotations:i,getHoveredLine:y}),c)})}var $=t();function _e(e){return e.fromTurnCount===0?q(ee)({threadId:e.threadId,toTurnCount:e.toTurnCount}).pipe(n(e=>({kind:`fullThreadDiff`,input:e}))):q(J)({threadId:e.threadId,fromTurnCount:e.fromTurnCount,toTurnCount:e.toTurnCount}).pipe(n(e=>({kind:`turnDiff`,input:e})))}function ve(e){return e instanceof Error?e.message:typeof e==`string`?e:``}function ye(e){let t=ve(e).trim();if(t.length===0)return`Failed to load checkpoint diff.`;let n=t.toLowerCase();if(n.includes(`not a git repository`))return`Turn diffs are unavailable because this project is not a git repository.`;if(n.includes(`checkpoint unavailable for thread`)||n.includes(`checkpoint invariant violation`)){let e=t.indexOf(`:`);if(e>=0){let n=t.slice(e+1).trim();if(n.length>0)return n}}return t}function be(e){let t=ve(e).toLowerCase();return t.includes(`exceeds current turn count`)||t.includes(`checkpoint is unavailable for turn`)||t.includes(`filesystem checkpoint is unavailable`)}function xe(e){let t=_e(e);return O({queryKey:M.checkpointDiff(e),queryFn:async({signal:n})=>{if(!e.environmentId||!e.threadId||t._tag===`None`)throw Error(`Checkpoint diff is unavailable.`);let r=c(e.environmentId);try{return t.value.kind===`fullThreadDiff`?await r.orchestration.getFullThreadDiff(t.value.input,{signal:n}):await r.orchestration.getTurnDiff(t.value.input,{signal:n})}catch(e){throw Error(ye(e),{cause:e})}},enabled:(e.enabled??!0)&&!!e.environmentId&&!!e.threadId&&t._tag===`Some`,staleTime:1/0,retry:(e,t)=>be(t)?e<12:e<3,retryDelay:(e,t)=>be(t)?Math.min(5e3,250*2**(e-1)):Math.min(1e3,100*2**(e-1))})}function Se(e){if(!(!e.canScrollLeft&&!e.canScrollRight))return{maskImage:`linear-gradient(to right, ${e.canScrollLeft?`transparent 24px, black 72px`:`black`}, ${e.canScrollRight?`black calc(100% - 72px), transparent calc(100% - 24px)`:`black`})`}}function Ce(e){return e instanceof Error?e.message:e?`Failed to load checkpoint diff.`:null}function we(e){return{environmentId:e.environmentId??null,threadId:e.threadId,fromTurnCount:e.range?.fromTurnCount??null,toTurnCount:e.range?.toTurnCount??null,cacheScope:e.selectedTurnId?`turn:${e.selectedTurnId}`:e.conversationCacheScope,enabled:e.enabled}}function Te(){let e=(0,$.c)(8),t=(0,X.useRef)(null),[n,r]=(0,X.useState)(!1),[i,a]=(0,X.useState)(!1),o;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(o=()=>{let e=t.current;if(!e){r(!1),a(!1);return}let n=de({scrollLeft:e.scrollLeft,scrollWidth:e.scrollWidth,clientWidth:e.clientWidth});r(n.canScrollLeft),a(n.canScrollRight)},e[0]=o):o=e[0];let s=o,c;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(c=e=>{t.current?.scrollBy({left:e,behavior:`smooth`})},e[1]=c):c=e[1];let l=c,u;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(u=e=>{let n=t.current;n&&ne({scrollWidth:n.scrollWidth,clientWidth:n.clientWidth,deltaX:e.deltaX,deltaY:e.deltaY})&&(e.preventDefault(),n.scrollBy({left:e.deltaY,behavior:`auto`}))},e[2]=u):u=e[2];let d=u,f,p;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(f=()=>{let e=t.current;if(!e)return;let n=window.requestAnimationFrame(s),r=()=>s();e.addEventListener(`scroll`,r,{passive:!0});let i=new ResizeObserver(()=>s());return i.observe(e),()=>{window.cancelAnimationFrame(n),e.removeEventListener(`scroll`,r),i.disconnect()}},p=[s],e[3]=f,e[4]=p):(f=e[3],p=e[4]),(0,X.useEffect)(f,p);let m;return e[5]!==n||e[6]!==i?(m={ref:t,canScrollLeft:n,canScrollRight:i,scrollBy:l,onWheel:d,remeasure:s},e[5]=n,e[6]=i,e[7]=m):m=e[7],m}function Ee(e,t){let n=(0,$.c)(5),r;n[0]===e.current?r=n[1]:(r=()=>{(e.current?.querySelector(`[data-turn-chip-selected='true']`))?.scrollIntoView({block:`nearest`,inline:`nearest`,behavior:`smooth`})},n[0]=e.current,n[1]=r);let i;n[2]!==e||n[3]!==t?(i=[e,t],n[2]=e,n[3]=t,n[4]=i):i=n[4],(0,X.useEffect)(r,i)}var De=`
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Ha as t,Mi as n,Ua as r,Wa as i}from"./Stream-mUTFnSY9.js";import{Al as a,Fn as o,Gc as s,Hr as c,Jc as l,Qr as u,Rr as d,Sr as f,Tn as p,Uc as m,Xr as h,_r as g,d as _,fn as v,fr as y,gr as b,i as x,is as S,jn as C,l as w,m as T,ms as E,n as D,qc as O,qt as k,r as A,u as j,za as M,zr as N}from"./DiffPanelShell-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-BQClgIo8.js.map
64
+ //# sourceMappingURL=DiffPanel-JpbLlXfS.js.map