@cmmd-center/forge 0.13.58 → 0.13.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.cjs CHANGED
@@ -66257,7 +66257,7 @@ function normalizeNumberish(value) {
66257
66257
  }
66258
66258
  //#endregion
66259
66259
  //#region package.json
66260
- var version$1 = "0.13.58";
66260
+ var version$1 = "0.13.60";
66261
66261
  //#endregion
66262
66262
  //#region src/sentry.ts
66263
66263
  const SERVER_APP_NAME = "forge-server";
@@ -102470,14 +102470,30 @@ function rehydrateCmmdTaskLinksFromThreads(input) {
102470
102470
  }
102471
102471
  }
102472
102472
  //#endregion
102473
+ //#region src/cmmd/forgeEnvelope.ts
102474
+ /**
102475
+ * Forge-context REST responses wrap their payload in `{ data, meta, pagination? }`
102476
+ * (see CMMD `sendForgeEnvelope`). Unwrap to the bare payload.
102477
+ *
102478
+ * Shared here so callers stop redefining this locally (apps/server/src has four
102479
+ * other private copies of the same check, in command/http.ts,
102480
+ * command/contextBuilder.ts, command/brainPreamble.ts and
102481
+ * agentTools/brainTools.ts), new call sites should import this one instead of
102482
+ * adding a sixth.
102483
+ */
102484
+ function unwrapForgeEnvelope$2(value) {
102485
+ if (value !== null && typeof value === "object" && "data" in value) return value.data;
102486
+ return value;
102487
+ }
102488
+ //#endregion
102473
102489
  //#region src/cmmd/updateCmmdTask.ts
102474
102490
  /**
102475
- * Update a CMMD task via the JWT REST gateway (the single trustworthy plane) —
102491
+ * Update a CMMD task via the JWT REST gateway (the single trustworthy plane),
102476
102492
  * the orchestration replacement for `callCmmdTool(pat, "update_task", ...)`.
102477
102493
  *
102478
102494
  * The session's cached CMMD JWT is used; when it is expired and no subject is
102479
102495
  * available to refresh it, the update reports `isError: true` so the caller can
102480
- * log/retry — 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 "6baa90f5d915d0b1f722594e7dd54ea231b5b819";
298209
+ return "a73d6f2a2de424a153f210a9aa30f454b41cacff";
298134
298210
  }
298135
298211
  async function resolveServerBuildCommit(input) {
298136
298212
  if (isFullCommitSha(input.baked)) return input.baked;
package/dist/bin.mjs CHANGED
@@ -65961,7 +65961,7 @@ function normalizeNumberish(value) {
65961
65961
  }
65962
65962
  //#endregion
65963
65963
  //#region package.json
65964
- var version$1 = "0.13.58";
65964
+ var version$1 = "0.13.60";
65965
65965
  //#endregion
65966
65966
  //#region src/sentry.ts
65967
65967
  const SERVER_APP_NAME = "forge-server";
@@ -102069,14 +102069,30 @@ function rehydrateCmmdTaskLinksFromThreads(input) {
102069
102069
  }
102070
102070
  }
102071
102071
  //#endregion
102072
+ //#region src/cmmd/forgeEnvelope.ts
102073
+ /**
102074
+ * Forge-context REST responses wrap their payload in `{ data, meta, pagination? }`
102075
+ * (see CMMD `sendForgeEnvelope`). Unwrap to the bare payload.
102076
+ *
102077
+ * Shared here so callers stop redefining this locally (apps/server/src has four
102078
+ * other private copies of the same check, in command/http.ts,
102079
+ * command/contextBuilder.ts, command/brainPreamble.ts and
102080
+ * agentTools/brainTools.ts), new call sites should import this one instead of
102081
+ * adding a sixth.
102082
+ */
102083
+ function unwrapForgeEnvelope$2(value) {
102084
+ if (value !== null && typeof value === "object" && "data" in value) return value.data;
102085
+ return value;
102086
+ }
102087
+ //#endregion
102072
102088
  //#region src/cmmd/updateCmmdTask.ts
102073
102089
  /**
102074
- * Update a CMMD task via the JWT REST gateway (the single trustworthy plane) —
102090
+ * Update a CMMD task via the JWT REST gateway (the single trustworthy plane),
102075
102091
  * the orchestration replacement for `callCmmdTool(pat, "update_task", ...)`.
102076
102092
  *
102077
102093
  * The session's cached CMMD JWT is used; when it is expired and no subject is
102078
102094
  * available to refresh it, the update reports `isError: true` so the caller can
102079
- * log/retry — 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
@@ -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 "6baa90f5d915d0b1f722594e7dd54ea231b5b819";
297654
+ return "a73d6f2a2de424a153f210a9aa30f454b41cacff";
297579
297655
  }
297580
297656
  async function resolveServerBuildCommit(input) {
297581
297657
  if (isFullCommitSha(input.baked)) return input.baked;
@@ -1,4 +1,4 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Ha as t,Mi as n,Ua as r,Wa as i}from"./Stream-mUTFnSY9.js";import{Al as a,Fn as o,Gc as s,Hr as c,Jc as l,Qr as u,Rr as d,Sr as f,Tn as p,Uc as m,Xr as h,_r as g,d as _,fn as v,fr as y,gr as b,i as x,is as S,jn as C,l as w,m as T,ms as E,n as D,qc as O,qt as k,r as A,u as j,za as M,zr as N}from"./DiffPanelShell-DwhtaL1t.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-CwEtgTLm.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-DVEZIsSc.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-C2-NaTXj.js";import{hn as P}from"./CompositeItem-BsSeqHOM.js";import{a as F,c as I,f as L,i as R,l as z,m as B,n as V,o as H,p as U,r as W,s as G,t as K}from"./Virtualizer-BscgnuJo.js";import{Dn as q,at as J,it as ee}from"./src-IM0FnQax.js";import{a as te,c as ne,d as re,h as ie,i as ae,l as oe,m as se,n as ce,o as Y,p as le,r as ue,s as de,t as fe,u as pe}from"./DiffPanel.logic-D61GzgVU.js";var X=e(i(),1),me=typeof window>`u`?X.useEffect:X.useLayoutEffect;function he({fileDiff:e,options:t,editorOptions:n,lineAnnotations:r,selectedLines:i,prerenderedHTML:a,metrics:o,hasGutterRenderUtility:s,hasCustomHeader:c,disableWorkerPool:l,edit:u}){let d=V(),f=i!==void 0,p=(0,X.useContext)(x),m=j(),h=(0,X.useRef)(null),g=_(n=>{if(n!=null){if(h.current!=null)throw Error(`useFileDiffInstance: An instance should not already exist when a node is created`);d==null?h.current=new re(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),l?void 0:p,!0):h.current=new pe(Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),d,o,l?void 0:p,!0),h.current.hydrate({fileDiff:e,fileContainer:n,lineAnnotations:r,prerenderedHTML:a})}else{if(h.current==null)throw Error(`useFileDiffInstance: A FileDiff instance should exist when unmounting`);h.current.cleanUp(),h.current=null}});return me(()=>{let{current:n}=h;if(n==null)return;let a=Z({controlledSelection:f,hasCustomHeader:c,hasGutterRenderUtility:s,options:t}),o=a!==void 0&&!k(n.options,a);n.setOptions(a),n.render({forceRender:o,fileDiff:e,lineAnnotations:r}),i!==void 0&&n.setSelectedLines(i)}),me(()=>{if(u&&h.current!=null){if(m===void 0)throw Error(`FileDiff: EditContext is not attached`);let e=m(n??{});if(e==null)throw Error(`FileDiff: EditProvider.createEditor must return an editor instance`);try{return e.edit(h.current)}catch(t){throw e.cleanUp(),t}}},[u]),{ref:g,getHoveredLine:(0,X.useCallback)(()=>h.current?.getHoveredLine(),[])}}function Z({options:e,controlledSelection:t,hasCustomHeader:n,hasGutterRenderUtility:r}){return t||r||n?{...e,controlledSelection:t,renderCustomHeader:n?w:e?.renderCustomHeader,renderGutterUtility:r?w:e?.renderGutterUtility}:e}var Q=r();function ge({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,className:o,style:s,prerenderedHTML:c,renderAnnotation:l,renderCustomHeader:u,renderHeaderPrefix:d,renderHeaderFilenameSuffix:f,renderHeaderMetadata:p,renderGutterUtility:m,disableWorkerPool:h=!1,edit:g=!1}){let{ref:_,getHoveredLine:y}=he({fileDiff:e,options:t,editorOptions:n,metrics:r,lineAnnotations:i,selectedLines:a,prerenderedHTML:c,hasGutterRenderUtility:m!=null,hasCustomHeader:u!=null,disableWorkerPool:h,edit:g});return(0,Q.jsx)(v,{ref:_,className:o,style:s,children:W(oe({fileDiff:e,renderCustomHeader:u,renderHeaderPrefix:d,renderHeaderFilenameSuffix:f,renderHeaderMetadata:p,renderAnnotation:l,renderGutterUtility:m,lineAnnotations:i,getHoveredLine:y}),c)})}var $=t();function _e(e){return e.fromTurnCount===0?q(ee)({threadId:e.threadId,toTurnCount:e.toTurnCount}).pipe(n(e=>({kind:`fullThreadDiff`,input:e}))):q(J)({threadId:e.threadId,fromTurnCount:e.fromTurnCount,toTurnCount:e.toTurnCount}).pipe(n(e=>({kind:`turnDiff`,input:e})))}function ve(e){return e instanceof Error?e.message:typeof e==`string`?e:``}function ye(e){let t=ve(e).trim();if(t.length===0)return`Failed to load checkpoint diff.`;let n=t.toLowerCase();if(n.includes(`not a git repository`))return`Turn diffs are unavailable because this project is not a git repository.`;if(n.includes(`checkpoint unavailable for thread`)||n.includes(`checkpoint invariant violation`)){let e=t.indexOf(`:`);if(e>=0){let n=t.slice(e+1).trim();if(n.length>0)return n}}return t}function be(e){let t=ve(e).toLowerCase();return t.includes(`exceeds current turn count`)||t.includes(`checkpoint is unavailable for turn`)||t.includes(`filesystem checkpoint is unavailable`)}function xe(e){let t=_e(e);return O({queryKey:M.checkpointDiff(e),queryFn:async({signal:n})=>{if(!e.environmentId||!e.threadId||t._tag===`None`)throw Error(`Checkpoint diff is unavailable.`);let r=c(e.environmentId);try{return t.value.kind===`fullThreadDiff`?await r.orchestration.getFullThreadDiff(t.value.input,{signal:n}):await r.orchestration.getTurnDiff(t.value.input,{signal:n})}catch(e){throw Error(ye(e),{cause:e})}},enabled:(e.enabled??!0)&&!!e.environmentId&&!!e.threadId&&t._tag===`Some`,staleTime:1/0,retry:(e,t)=>be(t)?e<12:e<3,retryDelay:(e,t)=>be(t)?Math.min(5e3,250*2**(e-1)):Math.min(1e3,100*2**(e-1))})}function Se(e){if(!(!e.canScrollLeft&&!e.canScrollRight))return{maskImage:`linear-gradient(to right, ${e.canScrollLeft?`transparent 24px, black 72px`:`black`}, ${e.canScrollRight?`black calc(100% - 72px), transparent calc(100% - 24px)`:`black`})`}}function Ce(e){return e instanceof Error?e.message:e?`Failed to load checkpoint diff.`:null}function we(e){return{environmentId:e.environmentId??null,threadId:e.threadId,fromTurnCount:e.range?.fromTurnCount??null,toTurnCount:e.range?.toTurnCount??null,cacheScope:e.selectedTurnId?`turn:${e.selectedTurnId}`:e.conversationCacheScope,enabled:e.enabled}}function Te(){let e=(0,$.c)(8),t=(0,X.useRef)(null),[n,r]=(0,X.useState)(!1),[i,a]=(0,X.useState)(!1),o;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(o=()=>{let e=t.current;if(!e){r(!1),a(!1);return}let n=de({scrollLeft:e.scrollLeft,scrollWidth:e.scrollWidth,clientWidth:e.clientWidth});r(n.canScrollLeft),a(n.canScrollRight)},e[0]=o):o=e[0];let s=o,c;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(c=e=>{t.current?.scrollBy({left:e,behavior:`smooth`})},e[1]=c):c=e[1];let l=c,u;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(u=e=>{let n=t.current;n&&ne({scrollWidth:n.scrollWidth,clientWidth:n.clientWidth,deltaX:e.deltaX,deltaY:e.deltaY})&&(e.preventDefault(),n.scrollBy({left:e.deltaY,behavior:`auto`}))},e[2]=u):u=e[2];let d=u,f,p;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(f=()=>{let e=t.current;if(!e)return;let n=window.requestAnimationFrame(s),r=()=>s();e.addEventListener(`scroll`,r,{passive:!0});let i=new ResizeObserver(()=>s());return i.observe(e),()=>{window.cancelAnimationFrame(n),e.removeEventListener(`scroll`,r),i.disconnect()}},p=[s],e[3]=f,e[4]=p):(f=e[3],p=e[4]),(0,X.useEffect)(f,p);let m;return e[5]!==n||e[6]!==i?(m={ref:t,canScrollLeft:n,canScrollRight:i,scrollBy:l,onWheel:d,remeasure:s},e[5]=n,e[6]=i,e[7]=m):m=e[7],m}function Ee(e,t){let n=(0,$.c)(5),r;n[0]===e.current?r=n[1]:(r=()=>{(e.current?.querySelector(`[data-turn-chip-selected='true']`))?.scrollIntoView({block:`nearest`,inline:`nearest`,behavior:`smooth`})},n[0]=e.current,n[1]=r);let i;n[2]!==e||n[3]!==t?(i=[e,t],n[2]=e,n[3]=t,n[4]=i):i=n[4],(0,X.useEffect)(r,i)}var De=`
2
2
  [data-diffs-header],
3
3
  [data-diff],
4
4
  [data-file],
@@ -61,4 +61,4 @@ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Ha as t,Mi as n,Ua as
61
61
  text-decoration-color: currentColor;
62
62
  }
63
63
  `;function Oe(e){let t=(0,$.c)(44),{mode:n}=e,r=n===void 0?`inline`:n,{resolvedTheme:i}=b(),a=g(),[c,l]=(0,X.useState)(`stacked`),[u,d]=(0,X.useState)(a.diffWordWrap),h=(0,X.useRef)(null),_=(0,X.useRef)(!1),v=Te(),{activeCwd:y,activeThread:x,bodyState:S,diffOpen:C,inferredCheckpointTurnCountByTurnId:w,orderedTurnDiffSummaries:T,renderableFiles:E,renderablePatch:D,selectedFilePath:O,selectedTurn:k,selectedTurnId:j}=Le(i),M,P;t[0]!==C||t[1]!==a.diffWordWrap?(M=()=>{C&&!_.current&&d(a.diffWordWrap),_.current=C},P=[C,a.diffWordWrap],t[0]=C,t[1]=a.diffWordWrap,t[2]=M,t[3]=P):(M=t[2],P=t[3]),(0,X.useEffect)(M,P);let F;t[4]===O?F=t[5]:(F=()=>{!O||!h.current||Array.from(h.current.querySelectorAll(`[data-diff-file-path]`)).find(e=>e.dataset.diffFilePath===O)?.scrollIntoView({block:`nearest`})},t[4]=O,t[5]=F);let I;t[6]!==E||t[7]!==O?(I=[O,E],t[6]=E,t[7]=O,t[8]=I):I=t[8],(0,X.useEffect)(F,I);let L;t[9]===y?L=t[10]:(L=e=>{let t=f();if(!t)return;let n=y?p(e,y):e;N(t,n).catch(ke)},t[9]=y,t[10]=L);let R=L,z;t[11]===x?z=t[12]:(z=e=>{x&&o.getState().openDiff(s(m(x.environmentId,x.id)),e)},t[11]=x,t[12]=z);let B=z,V;t[13]===x?V=t[14]:(V=()=>{x&&o.getState().openDiff(s(m(x.environmentId,x.id)))},t[13]=x,t[14]=V);let H=V,U;t[15]===v.remeasure?U=t[16]:(U=()=>{let e=window.requestAnimationFrame(v.remeasure);return()=>window.cancelAnimationFrame(e)},t[15]=v.remeasure,t[16]=U);let W;t[17]!==T||t[18]!==j||t[19]!==v.remeasure?(W=[T,j,v.remeasure],t[17]=T,t[18]=j,t[19]=v.remeasure,t[20]=W):W=t[20],(0,X.useEffect)(U,W),Ee(v.ref,k?.turnId??j);let G;t[21]!==c||t[22]!==u||t[23]!==w||t[24]!==T||t[25]!==B||t[26]!==H||t[27]!==k||t[28]!==j||t[29]!==a||t[30]!==v?(G=(0,Q.jsx)(Ae,{diffRenderMode:c,diffWordWrap:u,inferredCheckpointTurnCountByTurnId:w,orderedTurnDiffSummaries:T,selectTurn:B,selectWholeConversation:H,selectedTurn:k,selectedTurnId:j,setDiffRenderMode:l,setDiffWordWrap:d,settings:a,turnStrip:v}),t[21]=c,t[22]=u,t[23]=w,t[24]=T,t[25]=B,t[26]=H,t[27]=k,t[28]=j,t[29]=a,t[30]=v,t[31]=G):G=t[31];let K=G,q;t[32]!==S||t[33]!==c||t[34]!==u||t[35]!==R||t[36]!==E||t[37]!==D||t[38]!==i?(q=(0,Q.jsx)(je,{bodyState:S,diffRenderMode:c,diffWordWrap:u,openDiffFileInEditor:R,patchViewportRef:h,renderableFiles:E,renderablePatch:D,resolvedTheme:i}),t[32]=S,t[33]=c,t[34]=u,t[35]=R,t[36]=E,t[37]=D,t[38]=i,t[39]=q):q=t[39];let J;return t[40]!==K||t[41]!==r||t[42]!==q?(J=(0,Q.jsx)(A,{mode:r,header:K,children:q}),t[40]=K,t[41]=r,t[42]=q,t[43]=J):J=t[43],J}function ke(e){console.warn(`Failed to open diff file in editor.`,e)}function Ae(e){let t=(0,$.c)(59),{diffRenderMode:n,diffWordWrap:r,inferredCheckpointTurnCountByTurnId:i,orderedTurnDiffSummaries:a,selectTurn:o,selectWholeConversation:s,selectedTurn:c,selectedTurnId:l,setDiffRenderMode:u,setDiffWordWrap:d,settings:f,turnStrip:p}=e,m,h;t[0]===p?(m=t[1],h=t[2]):(m=(0,Q.jsx)(Be,{direction:`left`,strip:p}),h=(0,Q.jsx)(Be,{direction:`right`,strip:p}),t[0]=p,t[1]=m,t[2]=h);let g=p.ref,_;t[3]!==p.canScrollLeft||t[4]!==p.canScrollRight?(_=Se({canScrollLeft:p.canScrollLeft,canScrollRight:p.canScrollRight}),t[3]=p.canScrollLeft,t[4]=p.canScrollRight,t[5]=_):_=t[5];let v=p.onWheel,y=l===null,b=l===null?`border-border bg-accent text-accent-foreground`:`border-border/70 bg-background/70 text-muted-foreground/80 hover:border-border hover:text-foreground/80`,x;t[6]===b?x=t[7]:(x=P(`rounded-md border px-2 py-1 text-left transition-colors`,b),t[6]=b,t[7]=x);let S;t[8]===Symbol.for(`react.memo_cache_sentinel`)?(S=(0,Q.jsx)(`div`,{className:`text-[10px] leading-tight font-medium`,children:`All turns`}),t[8]=S):S=t[8];let C;t[9]===x?C=t[10]:(C=(0,Q.jsx)(`div`,{className:x,children:S}),t[9]=x,t[10]=C);let w;t[11]!==s||t[12]!==C||t[13]!==y?(w=(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-md`,onClick:s,"data-turn-chip-selected":y,children:C}),t[11]=s,t[12]=C,t[13]=y,t[14]=w):w=t[14];let T;if(t[15]!==i||t[16]!==a||t[17]!==o||t[18]!==c?.turnId||t[19]!==f){let e;t[21]!==i||t[22]!==o||t[23]!==c?.turnId||t[24]!==f?(e=e=>(0,Q.jsx)(Ve,{summary:e,selected:e.turnId===c?.turnId,turnCount:e.checkpointTurnCount??i[e.turnId],timestampFormat:f.timestampFormat,onSelect:o},e.turnId),t[21]=i,t[22]=o,t[23]=c?.turnId,t[24]=f,t[25]=e):e=t[25],T=a.map(e),t[15]=i,t[16]=a,t[17]=o,t[18]=c?.turnId,t[19]=f,t[20]=T}else T=t[20];let E;t[26]!==w||t[27]!==T||t[28]!==_||t[29]!==p.onWheel||t[30]!==p.ref?(E=(0,Q.jsxs)(`div`,{ref:g,className:`turn-chip-strip flex gap-1 overflow-x-auto px-8 py-0.5`,style:_,onWheel:v,children:[w,T]}),t[26]=w,t[27]=T,t[28]=_,t[29]=p.onWheel,t[30]=p.ref,t[31]=E):E=t[31];let D;t[32]!==m||t[33]!==E||t[34]!==h?(D=(0,Q.jsxs)(`div`,{className:`relative min-w-0 flex-1 [-webkit-app-region:no-drag]`,children:[m,h,E]}),t[32]=m,t[33]=E,t[34]=h,t[35]=D):D=t[35];let O;t[36]===n?O=t[37]:(O=[n],t[36]=n,t[37]=O);let k;t[38]===u?k=t[39]:(k=e=>{let t=e[0];(t===`stacked`||t===`split`)&&u(t)},t[38]=u,t[39]=k);let A;t[40]===Symbol.for(`react.memo_cache_sentinel`)?(A=(0,Q.jsx)(R,{"aria-label":`Stacked diff view`,value:`stacked`,children:(0,Q.jsx)(se,{className:`size-3`})}),t[40]=A):A=t[40];let j;t[41]===Symbol.for(`react.memo_cache_sentinel`)?(j=(0,Q.jsx)(R,{"aria-label":`Split diff view`,value:`split`,children:(0,Q.jsx)(ie,{className:`size-3`})}),t[41]=j):j=t[41];let M;t[42]!==O||t[43]!==k?(M=(0,Q.jsxs)(F,{className:`shrink-0`,variant:`outline`,size:`xs`,value:O,onValueChange:k,children:[A,j]}),t[42]=O,t[43]=k,t[44]=M):M=t[44];let N=r?`Disable diff line wrapping`:`Enable diff line wrapping`,I=r?`Disable line wrapping`:`Enable line wrapping`,L;t[45]===d?L=t[46]:(L=e=>{d(!!e)},t[45]=d,t[46]=L);let z;t[47]===Symbol.for(`react.memo_cache_sentinel`)?(z=(0,Q.jsx)(le,{className:`size-3`}),t[47]=z):z=t[47];let B;t[48]!==r||t[49]!==N||t[50]!==I||t[51]!==L?(B=(0,Q.jsx)(R,{"aria-label":N,title:I,variant:`outline`,size:`xs`,pressed:r,onPressedChange:L,children:z}),t[48]=r,t[49]=N,t[50]=I,t[51]=L,t[52]=B):B=t[52];let V;t[53]!==M||t[54]!==B?(V=(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 [-webkit-app-region:no-drag]`,children:[M,B]}),t[53]=M,t[54]=B,t[55]=V):V=t[55];let H;return t[56]!==D||t[57]!==V?(H=(0,Q.jsxs)(Q.Fragment,{children:[D,V]}),t[56]=D,t[57]=V,t[58]=H):H=t[58],H}function je(e){let t=(0,$.c)(18),{bodyState:n,diffRenderMode:r,diffWordWrap:i,openDiffFileInEditor:a,patchViewportRef:o,renderableFiles:s,renderablePatch:c,resolvedTheme:l}=e;if(n.kind===`no-thread`){let e;return t[0]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(Ne,{children:`Select a thread to inspect turn diffs.`}),t[0]=e):e=t[0],e}if(n.kind===`not-git-repo`){let e;return t[1]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(Ne,{children:`Turn diffs are unavailable because this project is not a git repository.`}),t[1]=e):e=t[1],e}if(n.kind===`no-completed-turns`){let e;return t[2]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(Ne,{children:`No completed turns yet.`}),t[2]=e):e=t[2],e}let u;t[3]!==n.error||t[4]!==c?(u=n.error&&!c&&(0,Q.jsx)(`div`,{className:`px-3`,children:(0,Q.jsx)(`p`,{className:`mb-2 text-[11px] text-destructive-foreground`,children:n.error})}),t[3]=n.error,t[4]=c,t[5]=u):u=t[5];let d;t[6]!==n||t[7]!==r||t[8]!==i||t[9]!==a||t[10]!==s||t[11]!==c||t[12]!==l?(d=c?c.kind===`files`?(0,Q.jsx)(K,{className:`diff-render-surface h-full min-h-0 overflow-auto px-2 pb-2`,config:{overscrollSize:600,intersectionObserverMargin:1200},children:s.map(e=>{let t=Y(e),n=`${fe(e)}:${l}`;return(0,Q.jsx)(`div`,{"data-diff-file-path":t,className:`diff-render-file mb-2 rounded-md first:mt-2 last:mb-0`,onClickCapture:e=>{(e.nativeEvent.composedPath?.()??[]).some(Me)&&a(t)},children:(0,Q.jsx)(ge,{fileDiff:e,options:{diffStyle:r===`split`?`split`:`unified`,lineDiffType:`none`,overflow:i?`wrap`:`scroll`,theme:T(l),themeType:l,unsafeCSS:De}})},n)})}):(0,Q.jsx)(`div`,{className:`h-full overflow-auto p-2`,children:(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(`p`,{className:`text-[11px] text-muted-foreground/75`,children:c.reason}),(0,Q.jsx)(`pre`,{className:P(`max-h-[72vh] rounded-md border border-border/70 bg-background/70 p-3 font-mono text-[11px] leading-relaxed text-muted-foreground/90`,i?`overflow-auto whitespace-pre-wrap wrap-break-word`:`overflow-auto`),children:c.text})]})}):(0,Q.jsx)(Re,{bodyState:n}),t[6]=n,t[7]=r,t[8]=i,t[9]=a,t[10]=s,t[11]=c,t[12]=l,t[13]=d):d=t[13];let f;return t[14]!==o||t[15]!==u||t[16]!==d?(f=(0,Q.jsx)(Q.Fragment,{children:(0,Q.jsxs)(`div`,{ref:o,className:`diff-panel-viewport min-h-0 min-w-0 flex-1 overflow-hidden`,children:[u,d]})}),t[14]=o,t[15]=u,t[16]=d,t[17]=f):f=t[17],f}function Me(e){return e instanceof Element&&e.hasAttribute(`data-title`)}function Ne(e){let t=(0,$.c)(2),{children:n}=e,r;return t[0]===n?r=t[1]:(r=(0,Q.jsx)(`div`,{className:`flex flex-1 items-center justify-center px-5 text-center text-xs text-muted-foreground/70`,children:n}),t[0]=n,t[1]=r),r}function Pe(){let e=(0,$.c)(19),t;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t={strict:!1,select:Ie},e[0]=t):t=e[0];let n=a(t),r;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(r={strict:!1,select:Fe},e[1]=r):r=e[1];let i=B(r),o=i.rightPanel===`diff`,s=n?.threadId??null,c,l;e[2]===n?l=e[3]:(l=C(n),e[2]=n,e[3]=l),c=l;let u=E(c),f=He(u),p=u?.worktreePath,m=f?.cwd,h;e[4]!==p||e[5]!==m?(h=I({threadWorktreePath:p,projectCwd:m}),e[4]=p,e[5]=m,e[6]=h):h=e[6];let g=h,_=u?.environmentId??null,v=g??null,y;e[7]!==_||e[8]!==v?(y={environmentId:_,cwd:v},e[7]=_,e[8]=v,e[9]=y):y=e[9];let b=d(y),x;e[10]===b.data?x=e[11]:(x=z(b.data),e[10]=b.data,e[11]=x);let S=x,w;return e[12]!==g||e[13]!==u||e[14]!==s||e[15]!==o||e[16]!==i||e[17]!==S?(w={activeThread:u,activeThreadId:s,activeCwd:g,isGitRepo:S,diffSearch:i,diffOpen:o},e[12]=g,e[13]=u,e[14]=s,e[15]=o,e[16]=i,e[17]=S,e[18]=w):w=e[18],w}function Fe(e){return G(e)}function Ie(e){return h(e)}function Le(e){let{activeThread:t,activeThreadId:n,activeCwd:r,isGitRepo:i,diffSearch:a,diffOpen:o}=Pe(),{turnDiffSummaries:s,inferredCheckpointTurnCountByTurnId:c}=H(t),u=a.diffTurnId??null,d=u===null?null:a.diffFilePath??null,{activeCheckpointRange:f,conversationCacheScope:p,orderedTurnDiffSummaries:m,selectedTurn:h}=(0,X.useMemo)(()=>te({summaries:s,inferredCheckpointTurnCountByTurnId:c,selectedTurnId:u}),[c,u,s]),g=l(xe(we({environmentId:t?.environmentId,threadId:n,range:f,selectedTurnId:h?.turnId,conversationCacheScope:p,enabled:i}))),_=g.isLoading,v=Ce(g.error),y=g.data?.diff,b=typeof y==`string`&&y.trim().length===0,{emptyDiffMessage:x}=(0,X.useMemo)(()=>ae(h),[h]),S=(0,X.useMemo)(()=>ce(y,`diff-panel:${e}`),[e,y]),C=(0,X.useMemo)(()=>Ue(S),[S]);return{activeCwd:r,activeThread:t,bodyState:ue({hasActiveThread:!!t,isGitRepo:i,turnSummaryCount:m.length,checkpointDiffError:v,hasRenderablePatch:!!S,isLoadingCheckpointDiff:_,hasNoNetChanges:b,emptyDiffMessage:x}),diffOpen:o,inferredCheckpointTurnCountByTurnId:c,orderedTurnDiffSummaries:m,renderableFiles:C,renderablePatch:S,selectedFilePath:d,selectedTurn:h,selectedTurnId:u}}function Re(e){let t=(0,$.c)(4),{bodyState:n}=e;if(n.kind===`loading`){let e;return t[0]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,Q.jsx)(D,{label:`Loading checkpoint diff...`}),t[0]=e):e=t[0],e}let r;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,Q.jsx)(L,{className:`size-7 text-muted-foreground/25`}),t[1]=r):r=t[1];let i=n.kind===`empty`?n.message:`No diff is available for this range.`,a;return t[2]===i?a=t[3]:(a=(0,Q.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-2 px-5 py-2 text-center`,children:[r,(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground/70`,children:i})]}),t[2]=i,t[3]=a),a}var ze=180;function Be(e){let t=(0,$.c)(14),{direction:n,strip:r}=e,i=n===`left`,a=i?r.canScrollLeft:r.canScrollRight,o=i?U:u,s=i?`left-0`:`right-0`,c=a?`border-border/70 hover:border-border hover:text-foreground`:`cursor-not-allowed border-border/40 text-muted-foreground/40`,l;t[0]!==s||t[1]!==c?(l=P(`absolute top-1/2 z-20 inline-flex size-6 -translate-y-1/2 items-center justify-center rounded-md border bg-background/90 text-muted-foreground transition-colors`,s,c),t[0]=s,t[1]=c,t[2]=l):l=t[2];let d;t[3]!==i||t[4]!==r?(d=()=>r.scrollBy(i?-180:ze),t[3]=i,t[4]=r,t[5]=d):d=t[5];let f=!a,p=`Scroll turn list ${n}`,m;t[6]===o?m=t[7]:(m=(0,Q.jsx)(o,{className:`size-3.5`}),t[6]=o,t[7]=m);let h;return t[8]!==l||t[9]!==d||t[10]!==f||t[11]!==p||t[12]!==m?(h=(0,Q.jsx)(`button`,{type:`button`,className:l,onClick:d,disabled:f,"aria-label":p,children:m}),t[8]=l,t[9]=d,t[10]=f,t[11]=p,t[12]=m,t[13]=h):h=t[13],h}function Ve(e){let t=(0,$.c)(23),{summary:n,selected:r,turnCount:i,timestampFormat:a,onSelect:o}=e,s;t[0]!==o||t[1]!==n.turnId?(s=()=>o(n.turnId),t[0]=o,t[1]=n.turnId,t[2]=s):s=t[2];let c=n.turnId,l=r?`border-border bg-accent text-accent-foreground`:`border-border/70 bg-background/70 text-muted-foreground/80 hover:border-border hover:text-foreground/80`,u;t[3]===l?u=t[4]:(u=P(`rounded-md border px-2 py-1 text-left transition-colors`,l),t[3]=l,t[4]=u);let d=i??`?`,f;t[5]===d?f=t[6]:(f=(0,Q.jsxs)(`span`,{className:`text-[10px] leading-tight font-medium`,children:[`Turn `,d]}),t[5]=d,t[6]=f);let p;t[7]!==n.completedAt||t[8]!==a?(p=y(n.completedAt,a),t[7]=n.completedAt,t[8]=a,t[9]=p):p=t[9];let m;t[10]===p?m=t[11]:(m=(0,Q.jsx)(`span`,{className:`text-[9px] leading-tight opacity-70`,children:p}),t[10]=p,t[11]=m);let h;t[12]!==f||t[13]!==m?(h=(0,Q.jsxs)(`div`,{className:`flex items-center gap-1`,children:[f,m]}),t[12]=f,t[13]=m,t[14]=h):h=t[14];let g;t[15]!==u||t[16]!==h?(g=(0,Q.jsx)(`div`,{className:u,children:h}),t[15]=u,t[16]=h,t[17]=g):g=t[17];let _;return t[18]!==r||t[19]!==n.turnId||t[20]!==s||t[21]!==g?(_=(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-md`,onClick:s,title:c,"data-turn-chip-selected":r,children:g}),t[18]=r,t[19]=n.turnId,t[20]=s,t[21]=g,t[22]=_):_=t[22],_}function He(e){let t=(0,$.c)(3),n=e?.environmentId,r=e?.projectId,i;return t[0]!==n||t[1]!==r?(i=e=>n&&r?S(e,{environmentId:n,projectId:r}):void 0,t[0]=n,t[1]=r,t[2]=i):i=t[2],E(i)}function Ue(e){return!e||e.kind!==`files`?[]:e.files.toSorted((e,t)=>Y(e).localeCompare(Y(t),void 0,{numeric:!0,sensitivity:`base`}))}export{Oe as default};
64
- //# sourceMappingURL=DiffPanel-BiFFFyIe.js.map
64
+ //# sourceMappingURL=DiffPanel-C1yePuJx.js.map