@p4code/cli 0.4.4 → 0.4.6
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.mjs +110 -15
- package/dist/client/assets/{DiffPanel-D7vPSBdh.js → DiffPanel--7DOgfjC.js} +2 -2
- package/dist/client/assets/{FilePreviewPanel-DXEenM2l.js → FilePreviewPanel-1IvYCdVl.js} +2 -2
- package/dist/client/assets/{PreviewPanel-Ds6pJi7J.js → PreviewPanel-w8GlsMVk.js} +2 -2
- package/dist/client/assets/{PullRequestCodeTab-rspGi6dc.js → PullRequestCodeTab-B-WYeurk.js} +2 -2
- package/dist/client/assets/{fileCommentAnnotations-BzjN6Fwi.js → fileCommentAnnotations-DbVfMa3r.js} +2 -2
- package/dist/client/assets/{index-uMqzU6Kp.js → index-7yY8pEPI.js} +246 -235
- package/dist/client/assets/{index-C0-WT5qu.css → index-BpPlD26g.css} +1 -1
- package/dist/client/assets/{previewAssetResource-B9Q5MNIS.js → previewAssetResource-BSwDMX3X.js} +4 -4
- package/dist/client/assets/{renderFileChildren-DRIvuNWr.js → renderFileChildren-BEUIDfLn.js} +2 -2
- package/dist/client/assets/{toggle-group-CnZQoeHJ.js → toggle-group-CrIKfzd1.js} +2 -2
- package/dist/client/index.html +3 -3
- package/package.json +1 -1
package/dist/bin.mjs
CHANGED
|
@@ -239,7 +239,7 @@ const make$92 = () => {
|
|
|
239
239
|
const layer$82 = Layer.sync(NetService, make$92);
|
|
240
240
|
//#endregion
|
|
241
241
|
//#region package.json
|
|
242
|
-
var version = "0.4.
|
|
242
|
+
var version = "0.4.6";
|
|
243
243
|
//#endregion
|
|
244
244
|
//#region src/config.ts
|
|
245
245
|
/**
|
|
@@ -8288,7 +8288,9 @@ const ClientSettingsSchema = Schema$1.Struct({
|
|
|
8288
8288
|
hiddenModels: Schema$1.Array(Schema$1.String).pipe(Schema$1.withDecodingDefault(Effect.succeed([]))),
|
|
8289
8289
|
modelOrder: Schema$1.Array(Schema$1.String).pipe(Schema$1.withDecodingDefault(Effect.succeed([]))),
|
|
8290
8290
|
/** Option values a model starts with in this instance until the user picks others. */
|
|
8291
|
-
modelOptionDefaults: Schema$1.Record(TrimmedNonEmptyString, ProviderOptionSelections).pipe(Schema$1.withDecodingDefault(Effect.succeed({})))
|
|
8291
|
+
modelOptionDefaults: Schema$1.Record(TrimmedNonEmptyString, ProviderOptionSelections).pipe(Schema$1.withDecodingDefault(Effect.succeed({}))),
|
|
8292
|
+
/** User-authored picker labels keyed by model slug. */
|
|
8293
|
+
modelDisplayNames: Schema$1.optionalKey(Schema$1.Record(TrimmedNonEmptyString, TrimmedNonEmptyString))
|
|
8292
8294
|
})).pipe(Schema$1.withDecodingDefault(Effect.succeed({}))),
|
|
8293
8295
|
showBuildModeToggle: Schema$1.Boolean.pipe(Schema$1.withDecodingDefault(Effect.succeed(false))),
|
|
8294
8296
|
sidebarAutoSettleAfterDays: Schema$1.NullOr(SidebarAutoSettleAfterDays).pipe(Schema$1.withDecodingDefault(Effect.succeed(3))),
|
|
@@ -8756,7 +8758,8 @@ Schema$1.Struct({
|
|
|
8756
8758
|
providerModelPreferences: Schema$1.optionalKey(Schema$1.Record(ProviderInstanceId, Schema$1.Struct({
|
|
8757
8759
|
hiddenModels: Schema$1.Array(Schema$1.String).pipe(Schema$1.withDecodingDefault(Effect.succeed([]))),
|
|
8758
8760
|
modelOrder: Schema$1.Array(Schema$1.String).pipe(Schema$1.withDecodingDefault(Effect.succeed([]))),
|
|
8759
|
-
modelOptionDefaults: Schema$1.Record(TrimmedNonEmptyString, ProviderOptionSelections).pipe(Schema$1.withDecodingDefault(Effect.succeed({})))
|
|
8761
|
+
modelOptionDefaults: Schema$1.Record(TrimmedNonEmptyString, ProviderOptionSelections).pipe(Schema$1.withDecodingDefault(Effect.succeed({}))),
|
|
8762
|
+
modelDisplayNames: Schema$1.optionalKey(Schema$1.Record(TrimmedNonEmptyString, TrimmedNonEmptyString))
|
|
8760
8763
|
}))),
|
|
8761
8764
|
showBuildModeToggle: Schema$1.optionalKey(Schema$1.Boolean),
|
|
8762
8765
|
sidebarAutoSettleAfterDays: Schema$1.optionalKey(Schema$1.NullOr(SidebarAutoSettleAfterDays)),
|
|
@@ -69764,7 +69767,7 @@ function formatAskUserQuestionAnswers(answers) {
|
|
|
69764
69767
|
* only a one-line reference and the mutable `[fusion-pair]` metadata.
|
|
69765
69768
|
*/
|
|
69766
69769
|
const FUSION_BUILDER_INSTRUCTIONS = `You are Fusion Builder in an already-created native server pair. Server owns pairing and coordination. Do not inspect or invoke the Fusion skill, create/pair/rename threads, or announce/setup Fusion. Start the user's task directly. Before editing, create and maintain the phase list with your provider's step-tracking tool (Claude Code: TaskCreate for each phase, then TaskUpdate for status, or TodoWrite when that is the tool offered; Codex: update_plan), never the MCP task board tools - one entry per phase in order, exactly one in progress at a time, marked completed at each phase end - so phases render in the task banner. That list holds phase entries only for the whole task; keep step-level or per-file todos out of it. Name each phase in 3-6 words by its outcome, never by a command, file path, or flag, because the banner shows the title verbatim. Prose alone leaves the banner empty. Split it into the fewest substantial phases the task genuinely needs plus a final integration/whole-task phase; most tasks need one to three work phases. Each phase is a complete reviewable slice of behavior. Never split per file, per function, or per trivial step: over-splitting spends review turns instead of finishing the job. Add a phase only when a real review boundary, risky decision, or independent behavior separates the work. Complete exactly one phase per turn, and finish the whole phase in that turn rather than stopping early. Do not run tests, typecheck, lint, or builds per phase; write the tests the change needs, then run verification once in the final phase over the whole task. Exception: a phase whose own correctness is unclear may run the single narrowest check that resolves it. End every phase turn with phase completed, todo status, changed behavior/files, and remaining phases; do not start the next phase in the same turn. Server then wakes the paired Supervisor, which resumes you through ${FUSION_ADVICE_PROMPT_PREFIX}; a user message may also revise or resume the work. Final phase verifies the entire task against the original request and labels it ready for whole-task review. Supervisor is unreachable during your turn. Never spawn/use another Supervisor thread/subagent or attribute Supervisor decisions without ${FUSION_ADVICE_PROMPT_PREFIX}. Within the current phase, continue when straightforward or evidence is clear. For a concrete unresolved tradeoff, correctness risk, or design decision materially needing judgment, stop safely before the risky choice; final response states the exact question and why review is needed. Evaluate/follow Supervisor advice unless conflicting with user request or verified repo state.`;
|
|
69767
|
-
const FUSION_WATCHER_INSTRUCTIONS = `You are Fusion Supervisor (watcher) in an already-created native server pair. Server owns pairing and coordination and wakes you with ${FUSION_REVIEW_PROMPT_PREFIX} or ${FUSION_GATE_PROMPT_PREFIX} prompts at builder turn boundaries. A plain message outside such a wake may arrive after your conversational memory of the pair is gone; its [fusion-pair] metadata block is authoritative: the builder thread exists and is the counterpart thread id. Never report that no builder thread exists. To resume supervision, read builder events with thread_watch_events from lastReviewedImplementerSequence with limit 50, paging forward with the last returned sequence rather than requesting a whole range at once, derive phase from artifacts (git log/status, PR, builder events, including its turn.plan.updated phase list), steer with thread_advise, and answer an open gate with thread_gate_respond. When a review or gate wake prompt specifies an explicit event range, that range wins over this metadata. Never poll or wait for the builder; deliver review or advice, then end the turn.`;
|
|
69770
|
+
const FUSION_WATCHER_INSTRUCTIONS = `You are Fusion Supervisor (watcher) in an already-created native server pair. Server owns pairing and coordination and wakes you with ${FUSION_REVIEW_PROMPT_PREFIX} or ${FUSION_GATE_PROMPT_PREFIX} prompts at builder turn boundaries. A plain message outside such a wake may arrive after your conversational memory of the pair is gone; its [fusion-pair] metadata block is authoritative: the builder thread exists and is the counterpart thread id. Never report that no builder thread exists. To resume supervision, read builder events with thread_watch_events from lastReviewedImplementerSequence with limit 50, paging forward with the last returned sequence rather than requesting a whole range at once, derive phase from artifacts (git log/status, PR, builder events, including its turn.plan.updated phase list), steer with thread_advise, and answer an open gate with thread_gate_respond. When a review or gate wake prompt specifies an explicit event range, that range wins over this metadata. Never poll or wait for the builder; deliver review or advice, then end the turn. Every thread_advise starts a builder turn whose completion wakes you again, so never advise a builder that is idle on an external wait or has nothing actionable; report the state in your own thread and end without advising.`;
|
|
69768
69771
|
/**
|
|
69769
69772
|
* The one-line stand-in for the full block on a message whose session already
|
|
69770
69773
|
* carries the role instructions.
|
|
@@ -110932,6 +110935,8 @@ const gateMessageId = (gateId, round) => MessageId.make(`${FUSION_GATE_MESSAGE_I
|
|
|
110932
110935
|
const gateActivityId = (gateId, threadId, suffix) => EventId.make(`fusion-gate:${gateId}:${suffix}:${threadId}`);
|
|
110933
110936
|
const pairFailureCommandId = (pairId, sequence, suffix) => CommandId.make(`server:fusion:${pairId}:provider-failure:${sequence}:${suffix}`);
|
|
110934
110937
|
const pairFailureActivityId = (pairId, sequence, threadId) => EventId.make(`fusion-provider-failure:${pairId}:${sequence}:${threadId}`);
|
|
110938
|
+
const idlePauseCommandId = (pairId, sequence, threadId) => CommandId.make(`server:fusion:${pairId}:idle-pause:${sequence}:${threadId}`);
|
|
110939
|
+
const idlePauseActivityId = (pairId, sequence, threadId) => EventId.make(`fusion-idle-pause:${pairId}:${sequence}:${threadId}`);
|
|
110935
110940
|
/**
|
|
110936
110941
|
* What the watcher can do, spelled out in every wake. The instructions repeat
|
|
110937
110942
|
* per prompt because the watcher has no separate system prompt: these messages
|
|
@@ -110948,7 +110953,9 @@ const watcherPowers = (implementerThreadId) => `Steer builder:
|
|
|
110948
110953
|
|
|
110949
110954
|
Decide from evidence. Ask user only for human-authority choices. Design uncertainty: spawn provider-native Designer with exact scope/paths, evaluate advice, decide, then send decision via thread_advise. Designer never replaces judgment or contacts builder.
|
|
110950
110955
|
|
|
110951
|
-
Never poll thread_watch_events or wait for builder. Deliver review/advice, end turn; server wakes next boundary
|
|
110956
|
+
Never poll thread_watch_events or wait for builder. Deliver review/advice, end turn; server wakes next boundary.
|
|
110957
|
+
|
|
110958
|
+
Every thread_advise starts a builder turn, and every builder completion wakes you: advice that only acknowledges an unchanged state is a loop. Builder idle on an external wait (remote build, CI, deploy, scheduled job) or reporting nothing new and nothing actionable: do not advise. Report the state here and end; the user resumes the pair when the external work lands. After 3 consecutive advice rounds whose builder turn ran no tools, the server pauses the pair.`;
|
|
110952
110959
|
/**
|
|
110953
110960
|
* The delivery loop, restated in every review wake for the same reason the
|
|
110954
110961
|
* powers are: the watcher has no system prompt and no reliable conversational
|
|
@@ -110984,7 +110991,8 @@ Always report concise:
|
|
|
110984
110991
|
|
|
110985
110992
|
Determine review boundary from builder's todo status:
|
|
110986
110993
|
|
|
110987
|
-
- Remaining phases, or final status unclear: intermediate phase review.
|
|
110994
|
+
- Remaining phases, or final status unclear, and the builder has actionable work: intermediate phase review. Call thread_advise for ${input.implementerThreadId}. With objections, send required corrections and next phase. With none, explicitly approve phase and tell builder to continue next todo phase. Never require tests, typecheck, lint, or builds before the final phase.
|
|
110995
|
+
- Builder waiting on an external process or with nothing actionable: no thread_advise. Report the state here and end.
|
|
110988
110996
|
- Final whole-task phase ready: call thread_watch_events again from afterSequence 0 through ${input.throughSequence}, same limit 50 paging, then inspect full task diff/state. Review original requirements, integration across all phases, verification, and delivery. Advise only for concrete objections or unfinished work; otherwise report no objections and end.
|
|
110989
110997
|
|
|
110990
110998
|
${watcherPowers(input.implementerThreadId)}
|
|
@@ -111023,6 +111031,13 @@ const make$2 = Effect.gen(function* () {
|
|
|
111023
111031
|
*/
|
|
111024
111032
|
const repeatedFailures = /* @__PURE__ */ new Map();
|
|
111025
111033
|
/**
|
|
111034
|
+
* Consecutive review cycles per pair in which the builder turn was started
|
|
111035
|
+
* by supervisor advice and ran no tools. In-memory for the same reason as
|
|
111036
|
+
* `repeatedFailures`: losing it to a restart costs a few extra idle cycles,
|
|
111037
|
+
* not correctness.
|
|
111038
|
+
*/
|
|
111039
|
+
const idleAdviceCycles = /* @__PURE__ */ new Map();
|
|
111040
|
+
/**
|
|
111026
111041
|
* Gate detection and human-override resolution act on the CURRENT persisted
|
|
111027
111042
|
* gate state, so replaying them against historical events is wrong twice
|
|
111028
111043
|
* over: an old plan event would open a fresh gate, and an old user message
|
|
@@ -111382,7 +111397,64 @@ const make$2 = Effect.gen(function* () {
|
|
|
111382
111397
|
resolvedAt: event.payload.createdAt
|
|
111383
111398
|
});
|
|
111384
111399
|
});
|
|
111385
|
-
|
|
111400
|
+
/**
|
|
111401
|
+
* What the builder did between two review boundaries, read from the event
|
|
111402
|
+
* window rather than remembered: whether supervisor advice started the turn,
|
|
111403
|
+
* whether a human spoke into it, and whether any tool ran. A text-only
|
|
111404
|
+
* builder question counts as idle on purpose: one or two such rounds pass
|
|
111405
|
+
* unhindered, and a longer tool-free exchange is a debate the user should
|
|
111406
|
+
* see rather than fund.
|
|
111407
|
+
*/
|
|
111408
|
+
const describeBuilderTurn = (input) => {
|
|
111409
|
+
let startedByAdvice = false;
|
|
111410
|
+
let humanMessage = false;
|
|
111411
|
+
let ranTools = false;
|
|
111412
|
+
for (const event of input.events) {
|
|
111413
|
+
if (event.sequence <= input.afterSequence || event.sequence > input.throughSequence) continue;
|
|
111414
|
+
if (event.type === "thread.message-sent" && event.payload.threadId === input.implementerThreadId && event.payload.role === "user") {
|
|
111415
|
+
if (event.payload.text.startsWith("[fusion-advice]")) startedByAdvice = true;
|
|
111416
|
+
else if (!isFusionProtocolText(event.payload.text)) humanMessage = true;
|
|
111417
|
+
}
|
|
111418
|
+
if (event.type === "thread.activity-appended" && event.payload.threadId === input.implementerThreadId && event.payload.activity.kind.startsWith("tool.")) ranTools = true;
|
|
111419
|
+
}
|
|
111420
|
+
return {
|
|
111421
|
+
startedByAdvice,
|
|
111422
|
+
humanMessage,
|
|
111423
|
+
ranTools
|
|
111424
|
+
};
|
|
111425
|
+
};
|
|
111426
|
+
/**
|
|
111427
|
+
* Advice into a builder with nothing to do is a loop: the advice starts a
|
|
111428
|
+
* turn, the completion wakes the supervisor, the supervisor advises again.
|
|
111429
|
+
* After the limit, record the pause on both timelines and consume the
|
|
111430
|
+
* completion without a wake; the next human message resumes reviews.
|
|
111431
|
+
*/
|
|
111432
|
+
const pausePairAfterIdleAdvice = Effect.fn("FusionWatcherReactor.pausePairAfterIdleAdvice")(function* (input) {
|
|
111433
|
+
const summary = `Fusion paused: 3 supervisor advice rounds ran no builder tools. Waiting for user instruction.`;
|
|
111434
|
+
yield* Effect.forEach([input.pair.implementerThreadId, input.pair.watcherThreadId], (threadId) => orchestrationEngine.dispatch({
|
|
111435
|
+
type: "thread.activity.append",
|
|
111436
|
+
commandId: idlePauseCommandId(input.pair.id, input.sequence, threadId),
|
|
111437
|
+
threadId,
|
|
111438
|
+
activity: {
|
|
111439
|
+
id: idlePauseActivityId(input.pair.id, input.sequence, threadId),
|
|
111440
|
+
tone: "info",
|
|
111441
|
+
kind: "fusion.pair.paused",
|
|
111442
|
+
summary,
|
|
111443
|
+
payload: {
|
|
111444
|
+
pairId: input.pair.id,
|
|
111445
|
+
reason: "idle-advice-cycles",
|
|
111446
|
+
cycles: 3
|
|
111447
|
+
},
|
|
111448
|
+
turnId: null,
|
|
111449
|
+
createdAt: input.occurredAt
|
|
111450
|
+
},
|
|
111451
|
+
createdAt: input.occurredAt
|
|
111452
|
+
}), {
|
|
111453
|
+
concurrency: 1,
|
|
111454
|
+
discard: true
|
|
111455
|
+
});
|
|
111456
|
+
});
|
|
111457
|
+
const processReview = Effect.fn("FusionWatcherReactor.processReview")(function* (pair, completion, turn) {
|
|
111386
111458
|
const readModel = yield* projectionSnapshotQuery.getCommandReadModel();
|
|
111387
111459
|
const currentPair = (readModel.threadPairs ?? []).find((candidate) => candidate.id === pair.id);
|
|
111388
111460
|
if (currentPair === void 0 || currentPair.detachedAt !== null || completion.sequence <= currentPair.lastReviewedImplementerSequence) return;
|
|
@@ -111400,6 +111472,25 @@ const make$2 = Effect.gen(function* () {
|
|
|
111400
111472
|
}
|
|
111401
111473
|
const watcher = readModel.threads.find((thread) => thread.id === currentPair.watcherThreadId && thread.deletedAt === null);
|
|
111402
111474
|
if (watcher === void 0) return;
|
|
111475
|
+
const advanceCursor = orchestrationEngine.dispatch({
|
|
111476
|
+
type: "thread-pair.cursor.advance",
|
|
111477
|
+
commandId: cursorCommandId(currentPair.id, completion.sequence),
|
|
111478
|
+
pairId: currentPair.id,
|
|
111479
|
+
implementerSequence: completion.sequence,
|
|
111480
|
+
advancedAt: completion.occurredAt
|
|
111481
|
+
});
|
|
111482
|
+
const idleCycles = turn.startedByAdvice && !turn.humanMessage && !turn.ranTools ? (idleAdviceCycles.get(currentPair.id) ?? 0) + 1 : 0;
|
|
111483
|
+
idleAdviceCycles.set(currentPair.id, idleCycles);
|
|
111484
|
+
if (idleCycles >= 3) {
|
|
111485
|
+
idleAdviceCycles.delete(currentPair.id);
|
|
111486
|
+
yield* advanceCursor;
|
|
111487
|
+
yield* pausePairAfterIdleAdvice({
|
|
111488
|
+
pair: currentPair,
|
|
111489
|
+
sequence: completion.sequence,
|
|
111490
|
+
occurredAt: completion.occurredAt
|
|
111491
|
+
});
|
|
111492
|
+
return;
|
|
111493
|
+
}
|
|
111403
111494
|
yield* orchestrationEngine.dispatch({
|
|
111404
111495
|
type: "thread.turn.start",
|
|
111405
111496
|
commandId: reviewCommandId(currentPair.id, completion.sequence),
|
|
@@ -111420,13 +111511,7 @@ const make$2 = Effect.gen(function* () {
|
|
|
111420
111511
|
unpromptedSubagents: watcher.unpromptedSubagents,
|
|
111421
111512
|
createdAt: completion.occurredAt
|
|
111422
111513
|
});
|
|
111423
|
-
yield*
|
|
111424
|
-
type: "thread-pair.cursor.advance",
|
|
111425
|
-
commandId: cursorCommandId(currentPair.id, completion.sequence),
|
|
111426
|
-
pairId: currentPair.id,
|
|
111427
|
-
implementerSequence: completion.sequence,
|
|
111428
|
-
advancedAt: completion.occurredAt
|
|
111429
|
-
});
|
|
111514
|
+
yield* advanceCursor;
|
|
111430
111515
|
});
|
|
111431
111516
|
const startApprovedContinuation = Effect.fn("FusionWatcherReactor.startApprovedContinuation")(function* (input) {
|
|
111432
111517
|
const { readModel } = yield* readPairs;
|
|
@@ -111471,7 +111556,17 @@ const make$2 = Effect.gen(function* () {
|
|
|
111471
111556
|
});
|
|
111472
111557
|
completions = completions.filter((completion) => completion !== activationCompletion);
|
|
111473
111558
|
}
|
|
111474
|
-
|
|
111559
|
+
let boundary = activationCompletion?.sequence ?? pair.lastReviewedImplementerSequence;
|
|
111560
|
+
for (const completion of completions.filter((candidate) => candidate.payload.state === "completed")) {
|
|
111561
|
+
const turn = describeBuilderTurn({
|
|
111562
|
+
events,
|
|
111563
|
+
implementerThreadId: pair.implementerThreadId,
|
|
111564
|
+
afterSequence: boundary,
|
|
111565
|
+
throughSequence: completion.sequence
|
|
111566
|
+
});
|
|
111567
|
+
boundary = completion.sequence;
|
|
111568
|
+
yield* processReview(pair, completion, turn);
|
|
111569
|
+
}
|
|
111475
111570
|
});
|
|
111476
111571
|
const processCompletion = Effect.fn("FusionWatcherReactor.processCompletion")(function* (event) {
|
|
111477
111572
|
const activePairs = ((yield* projectionSnapshotQuery.getCommandReadModel()).threadPairs ?? []).filter((pair) => pair.detachedAt === null);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{n as t,r as n,t as r}from"./compiler-runtime-CLAvuQ-D.js";import{$c as i,Al as a,Bl as o,Ca as s,Da as c,Et as l,Fa as ee,Fl as te,Fr as u,Ia as d,La as f,Na as ne,Oa as re,Pa as p,_n as m,b as h,ba as g,el as _,gt as v,h as y,ht as b,kr as ie,lu as x,nl as S,st as C,tl as w,vt as T,wl as E,wr as D,xn as O,yl as ae}from"./previewAssetResource-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{n as t,r as n,t as r}from"./compiler-runtime-CLAvuQ-D.js";import{$c as i,Al as a,Bl as o,Ca as s,Da as c,Et as l,Fa as ee,Fl as te,Fr as u,Ia as d,La as f,Na as ne,Oa as re,Pa as p,_n as m,b as h,ba as g,el as _,gt as v,h as y,ht as b,kr as ie,lu as x,nl as S,st as C,tl as w,vt as T,wl as E,wr as D,xn as O,yl as ae}from"./previewAssetResource-BSwDMX3X.js";import{a as k,i as oe,n as A,o as j,r as M,s as N,t as se}from"./toggle-group-CrIKfzd1.js";import{F as ce,Fr as le,I as ue,J as de,L as fe,Lr as pe,Mr as me,Nr as he,R as P,Y as ge,_ as _e,_r as ve,at as ye,ci as be,cr as xe,ct as Se,dr as Ce,fr as we,h as Te,hr as Ee,it as De,jr as Oe,lr as ke,lt as Ae,oi as je,or as Me,ot as Ne,pr as Pe,rt as Fe,si as Ie,sr as Le,st as Re,ur as ze,yr as Be,zr as Ve}from"./index-7yY8pEPI.js";import{a as He,n as Ue}from"./fileCommentAnnotations-DbVfMa3r.js";var We=S(`pilcrow`,[[`path`,{d:`M13 4v16`,key:`8vvj80`}],[`path`,{d:`M17 4v16`,key:`7dpous`}],[`path`,{d:`M19 4H9.5a4.5 4.5 0 0 0 0 9H13`,key:`sh4n9v`}]]),F=e(n(),1);function Ge({threadRef:e,filePath:t,activeCwd:n,openInEditor:r,openFileSurface:i}){if(e){if(i){i(t);return}C.getState().openFile(e,t);return}r(n?y(t,n):t)}var I=r();function Ke(e,t){let n=(0,I.c)(4),r=Ee(e,t),i;return n[0]!==r.data||n[1]!==r.error||n[2]!==r.isPending?(i={data:r.data,error:r.error,isPending:r.isPending},n[0]=r.data,n[1]=r.error,n[2]=r.isPending,n[3]=i):i=n[3],i}var L=t(),qe=[];function Je(e){return(e.endSide??e.side)===`deletions`?`deletions`:`additions`}function R(e,t,n){let r=Je(t),i=e.findIndex(e=>e.side===r&&e.lineNumber===t.end);return i<0?[...e,{side:r,lineNumber:t.end,metadata:{entries:[n]}}]:e.map((e,t)=>t===i?{...e,metadata:{entries:[...e.metadata.entries,n]}}:e)}function Ye(e){let t=(0,I.c)(50),{files:n,sectionId:r,sectionTitle:i,composerDraftTarget:a,options:o,viewerRef:s,className:c,renderHeaderPrefix:l}=e,ee=D(Qe),te=D(B),d;t[0]===a?d=t[1]:(d=e=>e.getComposerDraft(a)?.reviewComments??qe,t[0]=a,t[1]=d);let f=D(d),[ne,re]=(0,F.useState)(null),[p,m]=(0,F.useState)(null),h;t[2]===n?h=t[3]:(h=new Map(n.map(Ze)),t[2]=n,t[3]=h);let g=h,_;if(t[4]!==p||t[5]!==n||t[6]!==f||t[7]!==r){let e;t[9]!==p||t[10]!==f||t[11]!==r?(e=e=>{let{fileDiff:t,filePath:n,fileKey:i,collapsed:a}=e,o=f.filter(e=>e.sectionId===r&&e.filePath===n&&(e.fenceLanguage??`diff`)===`diff`).reduce((e,n)=>{let r=u(t,n);return r?R(e,r,{id:n.id,kind:`comment`,range:r,rangeLabel:n.rangeLabel,text:n.text}):e},[]),s=p?.fileKey===i?[...o,p.annotation]:o;return{id:i,type:`diff`,fileDiff:t,annotations:s,collapsed:a,version:De(`${a?`1`:`0`}:${s.flatMap(z).join(`:`)}`)}},t[9]=p,t[10]=f,t[11]=r,t[12]=e):e=t[12],_=n.map(e),t[4]=p,t[5]=n,t[6]=f,t[7]=r,t[8]=_}else _=t[8];let v=_,y;t[13]!==a||t[14]!==p?.annotation||t[15]!==te?(y=e=>{re(null),p?.annotation.metadata.entries.some(t=>t.id===e)?m(null):te(a,e)},t[13]=a,t[14]=p?.annotation,t[15]=te,t[16]=y):y=t[16];let b=y,x;t[17]!==ee||t[18]!==a||t[19]!==p||t[20]!==g||t[21]!==r||t[22]!==i?(x=(e,t)=>{let n=p?.annotation.metadata.entries.find(t=>t.id===e),o=p?g.get(p.fileKey):void 0;if(!n||!o)return;let s=ie({id:n.id,sectionId:r,sectionTitle:i,filePath:o.filePath,fileDiff:o.fileDiff,range:n.range,text:t});s&&ee(a,s),re(null),m(null)},t[17]=ee,t[18]=a,t[19]=p,t[20]=g,t[21]=r,t[22]=i,t[23]=x):x=t[23];let S=x,C;t[24]!==g||t[25]!==r||t[26]!==i?(C=(e,t)=>{if(!e)return;let n=t.item;if(n.type!==`diff`)return;let a=g.get(n.id);if(!a)return;let o=Ue(),s=ie({id:o,sectionId:r,sectionTitle:i,filePath:a.filePath,fileDiff:a.fileDiff,range:e,text:``});s&&m({fileKey:n.id,annotation:{side:Je(e),lineNumber:e.end,metadata:{entries:[{id:o,kind:`draft`,range:e,rangeLabel:s.rangeLabel,text:``}]}}})},t[24]=g,t[25]=r,t[26]=i,t[27]=C):C=t[27];let w=C,T=p!==null,E;t[28]===s?E=t[29]:(E=s?{ref:s}:{},t[28]=s,t[29]=E);let O;t[30]===c?O=t[31]:(O=c?{className:c}:{},t[30]=c,t[31]=O);let ae=!T,oe=!T,A;t[32]!==w||t[33]!==o||t[34]!==oe||t[35]!==ae?(A={...o,enableGutterUtility:ae,enableLineSelection:oe,onLineSelectionEnd:w},t[32]=w,t[33]=o,t[34]=oe,t[35]=ae,t[36]=A):A=t[36];let j;t[37]===l?j=t[38]:(j=e=>e.type===`diff`?l(e.fileDiff,e.id,e.collapsed===!0):null,t[37]=l,t[38]=j);let M;t[39]!==b||t[40]!==S?(M=e=>(0,L.jsx)(`div`,{className:`py-1`,children:e.metadata.entries.map(e=>(0,L.jsx)(He,{kind:e.kind,rangeLabel:e.rangeLabel,text:e.text,onCancel:()=>b(e.id),onComment:t=>S(e.id,t),onDelete:()=>b(e.id)},e.id))}),t[39]=b,t[40]=S,t[41]=M):M=t[41];let N;return t[42]!==v||t[43]!==ne||t[44]!==A||t[45]!==j||t[46]!==M||t[47]!==E||t[48]!==O?(N=(0,L.jsx)(k,{...E,...O,items:v,selectedLines:ne,onSelectedLinesChange:re,options:A,renderHeaderPrefix:j,renderAnnotation:M}),t[42]=v,t[43]=ne,t[44]=A,t[45]=j,t[46]=M,t[47]=E,t[48]=O,t[49]=N):N=t[49],N}function z(e){return e.metadata.entries.map(Xe)}function Xe(e){return`${e.id}:${e.rangeLabel}:${e.text}`}function Ze(e){return[e.fileKey,e]}function B(e){return e.removeReviewComment}function Qe(e){return e.addReviewComment}function $e(e){return{diffPreview:E(e,{label:`environment-data:review:diff-preview`,tag:x.reviewGetDiffPreview,staleTimeMs:5e3})}}var et=$e(O);function V(e){return e.remoteName&&e.name.startsWith(`${e.remoteName}/`)?e.name.slice(e.remoteName.length+1):e.name}function tt(e,t){let n=new Set(t),r=e.map(e=>{let r=t.filter(t=>n.has(t)&&V(t)===e.name),i=r.find(e=>e.remoteName===`origin`)??r[0]??null;return i&&n.delete(i),{id:`local:${e.name}`,label:e.name,local:e,remote:i}}),i=t.filter(e=>n.has(e)).map(e=>({id:`remote:${e.name}`,label:e.name,local:null,remote:e}));return[...r,...i]}function nt(e,t){let n=t.trim().toLocaleLowerCase();return n.length===0?e:e.filter(e=>e.label.toLocaleLowerCase().includes(n)||e.local?.name.toLocaleLowerCase().includes(n)===!0||e.remote?.name.toLocaleLowerCase().includes(n)===!0)}var H=`__automatic_base_ref__`,rt=new Set,it=`
|
|
2
2
|
[data-diffs-header],
|
|
3
3
|
[data-diff],
|
|
4
4
|
[data-file],
|
|
@@ -95,4 +95,4 @@ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{n as t,r as n,t as r}f
|
|
|
95
95
|
text-decoration-color: currentColor;
|
|
96
96
|
}
|
|
97
97
|
`;function U({mode:e=`inline`,composerDraftTarget:t,initialGitScope:n,threadRef:r}){let{resolvedTheme:u}=h(),y=le(),[ie]=(0,F.useState)(n),[x,S]=(0,F.useState)(`stacked`),[C,E]=(0,F.useState)(y.wordWrap),[D,O]=(0,F.useState)(y.diffIgnoreWhitespace),[k,_e]=(0,F.useState)(``),[Ee,De]=(0,F.useState)(()=>({scopeKey:null,fileKeys:rt})),He=(0,F.useRef)(null),Ue=r.threadId,I=he(r),qe=I?.projectId??null,Je=me(I&&qe?{environmentId:I.environmentId,projectId:qe}:null),R=I?.worktreePath??Je?.workspaceRoot,z=ae(m.configValueAtom(I?.environmentId??null)),Xe=ve(I?.environmentId??null,z?.availableEditors??[]),Ze=l(I!=null&&R!=null?Oe.status({environmentId:I.environmentId,input:{cwd:R}}):null),B=P(e=>fe(e.byThreadKey,r,ie===`unstaged`)),Qe=Ze.data?.isRepo??!0,{turnDiffSummaries:$e,inferredCheckpointTurnCountByTurnId:V}=ue(I),U=(0,F.useMemo)(()=>[...$e].toSorted((e,t)=>{let n=e.checkpointTurnCount??V[e.turnId]??0,r=t.checkpointTurnCount??V[t.turnId]??0;return n===r?t.completedAt.localeCompare(e.completedAt):r-n}),[V,$e]);(0,F.useEffect)(()=>{B.kind===`turn`&&P.getState().reconcileTurnSelection(r,U.map(e=>e.turnId))},[B,U,r]);let W=B.kind===`turn`?B.turnId:null,G=B.kind===`unstaged`?`unstaged`:`branch`,K=B.kind===`branch`?B.baseRef:null,at=B.kind===`turn`?B.filePath:null,ot=B.kind===`turn`?B.revealRequestId:0,q=W===null?void 0:U.find(e=>e.turnId===W)??U[0],J=q&&(q.checkpointTurnCount??V[q.turnId]),st=U[0],ct=W===null?G===`unstaged`?`Working tree`:`Branch changes`:q?.turnId===st?.turnId?`Latest turn`:`Turn ${J??`?`}`,lt=q?`turn:${q.turnId}`:G,Y=`${r.environmentId}:${r.threadId}:${lt}`,ut=Ee.scopeKey===Y?Ee.fileKeys:rt,dt=q?`Turn ${J??`?`}`:G===`unstaged`?`Working tree`:`Branch changes`,ft=(0,F.useMemo)(()=>typeof J==`number`?{fromTurnCount:Math.max(0,J-1),toTurnCount:J}:null,[J]),pt=Ke({environmentId:I?.environmentId??null,threadId:Ue,fromTurnCount:ft?.fromTurnCount??null,toTurnCount:ft?.toTurnCount??null,ignoreWhitespace:D,cacheScope:q?`turn:${q.turnId}`:null},{enabled:Qe&&q!==void 0}),mt=l(W===null&&I&&R?et.diffPreview({environmentId:I.environmentId,input:{cwd:R,...K?{baseRef:K}:{},ignoreWhitespace:D}}):null),ht=W===null&&mt.error?.includes(`configured workspace root`)===!0&&z?.cwd!==void 0&&z.cwd!==R,gt=l(ht&&I&&z?et.diffPreview({environmentId:I.environmentId,input:{cwd:z.cwd,...K?{baseRef:K}:{},ignoreWhitespace:D}}):null),X=ht?gt:mt,Z=X.data?.sources.find(e=>e.kind===(G===`unstaged`?`working-tree`:`branch-range`)),_t=l(W===null&&G===`branch`&&I&&X.data?.cwd?Oe.listRefs({environmentId:I.environmentId,input:{cwd:X.data.cwd,includeMatchingRemoteRefs:!0,refKind:`local`,...k.trim().length>0?{query:k.trim()}:{},limit:100}}):null),vt=l(W===null&&G===`branch`&&I&&X.data?.cwd?Oe.listRefs({environmentId:I.environmentId,input:{cwd:X.data.cwd,includeMatchingRemoteRefs:!0,refKind:`remote`,...k.trim().length>0?{query:k.trim()}:{},limit:100}}):null),yt=tt(_t.data?.refs.filter(e=>e.name!==Z?.headRef)??[],vt.data?.refs??[]),bt=nt(yt,k),xt=e=>K&&K===e.remote?.name?K:e.local?.name??e.remote?.name??e.id,St=[H,...yt.map(xt)],Ct=[...k.trim().length===0?[H]:[],...bt.map(xt)],wt=Z?.diff,Tt=q?pt.data?.diff:wt,Et=!q&&Z?.truncated===!0,Dt=q?pt.isPending:X.isPending,Ot=q?pt.error:X.error,kt=typeof Tt==`string`&&Tt.trim().length===0,Q=(0,F.useMemo)(()=>Re(Tt,`diff-panel:${u}`,{compactPartialHunkOffsets:W===null}),[u,Tt,W]),At=(0,F.useMemo)(()=>!Q||Q.kind!==`files`?[]:Q.files.toSorted((e,t)=>Ae(e).localeCompare(Ae(t),void 0,{numeric:!0,sensitivity:`base`})),[Q]),$=(0,F.useMemo)(()=>At.map(e=>{let t=Fe(e);return{fileDiff:e,filePath:Ae(e),fileKey:t,collapsed:ut.has(t)}}),[ut,At]),jt=(0,F.useMemo)(()=>$.map(e=>e.fileKey),[$]),Mt=M(jt,ut),Nt=(0,F.useMemo)(()=>Ne(At),[At]);(0,F.useEffect)(()=>{if(!at)return;let e=$.find(e=>e.filePath===at);e&&He.current?.scrollTo({type:`item`,id:e.fileKey,align:`start`})},[$,at,ot]);let Pt=ce({threadRef:r,workspaceRoot:R??null}),Ft=(0,F.useCallback)(e=>{Ge({threadRef:r,filePath:e,activeCwd:R,openFileSurface:Pt,openInEditor:e=>{(async()=>{let t=await Xe(e);t._tag===`Failure`&&!a(t)&&console.warn(`Failed to open diff file in editor.`,{operation:`open-diff-file`,environmentId:r.environmentId,threadId:r.threadId,...o(te(t))})})()}})},[R,Pt,Xe,r]),It=(0,F.useCallback)(e=>{De(t=>{let n=new Set(t.scopeKey===Y?t.fileKeys:[]);return n.has(e)?n.delete(e):n.add(e),{scopeKey:Y,fileKeys:n}})},[Y]),Lt=(0,F.useCallback)(()=>{De(e=>{let t=e.scopeKey===Y?e.fileKeys:rt;return{scopeKey:Y,fileKeys:oe(jt,t)}})},[Y,jt]),Rt=e=>{P.getState().selectTurn(r,e)},zt=e=>{P.getState().selectGitScope(r,e)},Bt=e=>{P.getState().selectBranchBaseRef(r,e)};return(0,L.jsx)(ge,{mode:e,header:(0,L.jsxs)(L.Fragment,{children:[(0,L.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-3 [-webkit-app-region:no-drag]`,children:[(0,L.jsxs)(s,{children:[(0,L.jsxs)(d,{className:`inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted/70 px-2 text-xs font-medium text-foreground outline-none transition-colors hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring`,"aria-label":`Diff scope: ${ct}`,children:[(0,L.jsx)(`span`,{className:`truncate`,children:ct}),(0,L.jsx)(_,{className:`size-3.5 shrink-0 text-muted-foreground`})]}),(0,L.jsxs)(re,{align:`start`,className:`w-60`,children:[(0,L.jsx)(c,{className:W===null&&G===`unstaged`?`bg-foreground/[0.08]`:void 0,onClick:()=>zt(`unstaged`),children:(0,L.jsx)(`span`,{children:`Working tree`})}),(0,L.jsx)(c,{className:W===null&&G===`branch`?`bg-foreground/[0.08]`:void 0,onClick:()=>zt(`branch`),children:(0,L.jsx)(`span`,{children:`Branch changes`})}),(0,L.jsx)(c,{className:W!==null&&q?.turnId===st?.turnId?`bg-foreground/[0.08]`:void 0,onClick:()=>{st&&Rt(st.turnId)},children:(0,L.jsx)(`span`,{children:`Latest turn`})}),(0,L.jsxs)(ne,{children:[(0,L.jsx)(ee,{children:`Turn`}),(0,L.jsx)(p,{className:`w-64`,children:U.map(e=>{let t=e.checkpointTurnCount??V[e.turnId]??`?`;return(0,L.jsxs)(c,{className:e.turnId===q?.turnId?`bg-foreground/[0.08]`:void 0,onClick:()=>Rt(e.turnId),children:[(0,L.jsxs)(`span`,{children:[`Turn `,t]}),(0,L.jsx)(`span`,{className:`ml-auto text-xs tabular-nums text-muted-foreground`,children:Be(e.completedAt,y.timestampFormat)})]},e.turnId)})})]})]})]}),W===null&&G===`branch`&&Z?.baseRef&&(0,L.jsxs)(`div`,{className:`flex min-w-0 max-w-full items-center gap-2 overflow-hidden text-xs text-muted-foreground`,title:`${Z.headRef??`HEAD`} → ${Z.baseRef}`,"aria-label":`Comparing ${Z.headRef??`HEAD`} against ${Z.baseRef}`,children:[(0,L.jsx)(`span`,{className:`min-w-0 max-w-48 truncate`,children:Z.headRef??`HEAD`}),(0,L.jsx)(be,{className:`size-3.5 shrink-0 opacity-70`}),(0,L.jsxs)(Le,{items:St,filteredItems:Ct,value:K??H,onOpenChange:e=>{e||_e(``)},onValueChange:e=>{e&&Bt(e===H?null:e)},children:[(0,L.jsxs)(Pe,{className:`inline-flex min-w-0 max-w-48 items-center gap-1 overflow-hidden rounded-md px-1.5 py-1 outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring`,"aria-label":`Change comparison target. Currently ${Z.baseRef}`,children:[(0,L.jsx)(`span`,{className:`min-w-0 truncate`,children:Z.baseRef}),(0,L.jsx)(_,{className:`size-3.5 shrink-0 opacity-70`})]}),(0,L.jsxs)(we,{align:`start`,className:`w-72 min-w-0 max-w-[calc(100vw-1rem)] overflow-hidden [&>[data-slot=combobox-popup]]:min-w-0 [&>[data-slot=combobox-popup]]:overflow-hidden`,children:[(0,L.jsx)(`div`,{className:`min-w-0 shrink-0 px-3 pt-2.5`,children:(0,L.jsxs)(`div`,{className:`relative -translate-y-px border-b border-border/70 pb-1.5 transition-colors focus-within:border-ring`,children:[(0,L.jsx)(Ve,{"aria-hidden":`true`,className:`pointer-events-none absolute top-1.5 left-0 size-4 shrink-0 text-muted-foreground/55`}),(0,L.jsx)(ke,{className:`[&_input]:h-6.5 [&_input]:ps-5 [&_input]:font-sans [&_input]:leading-6.5`,inputClassName:`rounded-none bg-transparent text-sm`,placeholder:`Search refs...`,showTrigger:!1,size:`sm`,unstyled:!0,value:k,onChange:e=>_e(e.target.value)})]})}),(0,L.jsxs)(`div`,{className:`grid shrink-0 grid-cols-[1rem_minmax(0,1fr)] items-center gap-2 border-b border-border/70 ps-3 pe-6.5 pt-2 pb-1.5 font-medium text-[10px] text-muted-foreground uppercase tracking-wide`,children:[(0,L.jsx)(`span`,{"aria-hidden":`true`}),(0,L.jsxs)(`div`,{className:`grid min-w-0 grid-cols-[minmax(0,1fr)_2rem] items-center`,children:[(0,L.jsx)(`span`,{children:`Branch`}),(0,L.jsx)(`span`,{className:`text-right`,children:`Remote`})]})]}),(0,L.jsx)(xe,{children:`No matching refs.`}),(0,L.jsxs)(Ce,{className:`max-h-64 min-w-0 overflow-x-hidden`,children:[(0,L.jsx)(ze,{className:`h-8 w-full min-w-0 grid-cols-[1rem_minmax(0,1fr)] py-0`,contentClassName:`w-full min-w-0 overflow-hidden`,value:H,children:(0,L.jsx)(`span`,{className:`block min-w-0 truncate`,children:`Automatic`})}),yt.map(e=>{let t=xt(e),n=e.local!==null&&e.remote!==null,r=e.remote?.name===t;return(0,L.jsx)(ze,{className:`h-8 w-full min-w-0 grid-cols-[1rem_minmax(0,1fr)] py-0`,contentClassName:`w-full min-w-0 overflow-hidden`,value:t,children:(0,L.jsxs)(`div`,{className:`grid w-full min-w-0 grid-cols-[minmax(0,1fr)_2rem] items-center overflow-hidden`,children:[(0,L.jsx)(`span`,{className:`block min-w-0 truncate pe-2`,children:e.label}),n?(0,L.jsx)(`div`,{className:`flex justify-end`,onClick:e=>e.stopPropagation(),onPointerDown:e=>e.stopPropagation(),children:(0,L.jsx)(Me,{"aria-label":`Use remote version of ${e.label}`,checked:r,className:`[--thumb-size:--spacing(3)]`,onCheckedChange:t=>{let n=t?e.remote?.name:e.local?.name;n&&Bt(n)}})}):e.remote?(0,L.jsx)(`span`,{className:`flex justify-end text-muted-foreground`,title:`Remote only`,children:(0,L.jsx)(w,{"aria-hidden":`true`,className:`size-3`})}):null]})},e.id)})]})]})]})]})]}),(0,L.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 [-webkit-app-region:no-drag]`,children:[$.length>0&&(0,L.jsx)(Te,{additions:Nt.additions,deletions:Nt.deletions,className:`mr-1 text-[11px]`,layout:`inline`}),$.length>0&&(0,L.jsxs)(b,{children:[(0,L.jsx)(T,{render:(0,L.jsx)(g,{type:`button`,size:`icon-xs`,variant:`outline`,"aria-label":Mt?`Expand all files`:`Collapse all files`,onClick:Lt}),children:Mt?(0,L.jsx)(je,{className:`size-3`}):(0,L.jsx)(Ie,{className:`size-3`})}),(0,L.jsx)(v,{side:`top`,children:Mt?`Expand all files`:`Collapse all files`})]}),(0,L.jsxs)(A,{className:`shrink-0`,variant:`outline`,size:`xs`,value:[x],onValueChange:e=>{let t=e[0];(t===`stacked`||t===`split`)&&S(t)},children:[(0,L.jsx)(se,{"aria-label":`Stacked diff view`,value:`stacked`,children:(0,L.jsx)(j,{className:`size-3`})}),(0,L.jsx)(se,{"aria-label":`Split diff view`,value:`split`,children:(0,L.jsx)(N,{className:`size-3`})})]}),(0,L.jsxs)(b,{children:[(0,L.jsx)(T,{render:(0,L.jsx)(se,{"aria-label":C?`Disable diff line wrapping`:`Enable diff line wrapping`,variant:`outline`,size:`xs`,pressed:C,onPressedChange:e=>{E(!!e)}}),children:(0,L.jsx)(pe,{className:`size-3`})}),(0,L.jsx)(v,{side:`top`,children:C?`Disable line wrapping`:`Enable line wrapping`})]}),(0,L.jsxs)(b,{children:[(0,L.jsx)(T,{render:(0,L.jsx)(se,{"aria-label":D?`Show whitespace changes`:`Hide whitespace changes`,variant:`outline`,size:`xs`,pressed:D,onPressedChange:e=>{O(!!e)}}),children:(0,L.jsx)(We,{className:`size-3`})}),(0,L.jsx)(v,{side:`top`,children:D?`Show whitespace changes`:`Hide whitespace changes`})]})]})]}),children:I?Qe?W!==null&&U.length===0?(0,L.jsx)(`div`,{className:`flex flex-1 items-center justify-center px-5 text-center text-xs text-muted-foreground/70`,children:`No completed turns yet.`}):(0,L.jsx)(L.Fragment,{children:(0,L.jsxs)(`div`,{className:`diff-panel-viewport flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden`,children:[Et&&(0,L.jsx)(`p`,{className:`shrink-0 border-b border-border/70 bg-muted/40 px-3 py-1.5 text-[11px] text-muted-foreground`,children:`This diff was truncated because it exceeded the preview limit. The changes shown are incomplete.`}),Ot&&!Q&&(0,L.jsx)(`div`,{className:`px-3`,children:(0,L.jsx)(`p`,{className:`mb-2 text-[11px] text-red-500/80`,children:Ot})}),Q?Q.kind===`files`?(0,L.jsx)(`div`,{className:`min-h-0 flex-1`,onClickCapture:e=>{let t=(e.nativeEvent.composedPath?.()??[]).find(e=>e instanceof HTMLElement&&e.hasAttribute(`data-title`))?.textContent?.trim();t&&Ft(t)},children:(0,L.jsx)(Ye,{viewerRef:He,className:`diff-render-surface h-full min-h-0 overflow-auto`,files:$,sectionId:lt,sectionTitle:dt,composerDraftTarget:t,renderHeaderPrefix:(e,t,n)=>{let r=Ae(e);return(0,L.jsxs)(b,{children:[(0,L.jsx)(T,{render:(0,L.jsx)(`button`,{type:`button`,className:f(`inline-flex size-5 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 bg-transparent p-0 transition-colors hover:bg-foreground/10 focus-visible:outline-hidden`,ye(e)),"aria-label":n?`Expand ${r}`:`Collapse ${r}`,"aria-expanded":!n,onClick:e=>{e.stopPropagation(),It(t)}}),children:n?(0,L.jsx)(i,{className:`size-4`}):(0,L.jsx)(_,{className:`size-4`})}),(0,L.jsx)(v,{side:`top`,children:n?`Expand diff`:`Collapse diff`})]})},options:{diffStyle:x===`split`?`split`:`unified`,lineDiffType:`none`,overflow:C?`wrap`:`scroll`,theme:Se(u),themeType:u,unsafeCSS:it,stickyHeaders:!0,itemMetrics:{diffHeaderHeight:33},layout:{paddingTop:0,paddingBottom:8,gap:8}}},Y??lt)}):(0,L.jsx)(`div`,{className:`min-h-0 flex-1 overflow-auto p-2`,children:(0,L.jsxs)(`div`,{className:`space-y-2`,children:[(0,L.jsx)(`p`,{className:`text-[11px] text-muted-foreground/75`,children:Q.reason}),(0,L.jsx)(`pre`,{className:f(`max-h-[72vh] rounded-md border border-border/70 bg-background/70 p-3 font-mono text-[11px] leading-relaxed text-muted-foreground/90`,C?`overflow-auto whitespace-pre-wrap wrap-break-word`:`overflow-auto`),children:Q.text})]})}):Dt?(0,L.jsx)(de,{label:q?`Loading checkpoint diff...`:G===`unstaged`?`Loading working tree diff...`:`Loading branch diff...`}):(0,L.jsx)(`div`,{className:`flex h-full items-center justify-center px-3 py-2 text-xs text-muted-foreground/70`,children:(0,L.jsx)(`p`,{children:kt?`No net changes in this selection.`:`No patch available for this selection.`})})]})}):(0,L.jsx)(`div`,{className:`flex flex-1 items-center justify-center px-5 text-center text-xs text-muted-foreground/70`,children:`Turn diffs are unavailable because this project is not a git repository.`}):(0,L.jsx)(`div`,{className:`flex flex-1 items-center justify-center px-5 text-center text-xs text-muted-foreground/70`,children:`Select a thread to inspect turn diffs.`})})}export{_e as DiffWorkerPoolProvider,U as default};
|
|
98
|
-
//# sourceMappingURL=DiffPanel
|
|
98
|
+
//# sourceMappingURL=DiffPanel--7DOgfjC.js.map
|