@ashlr/hub 3.13.0 → 3.14.0
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/CHANGELOG.md +74 -0
- package/dist/authority-surface.json +204 -124
- package/dist/build-identity.json +2 -2
- package/dist/cli/authority.js +112 -18
- package/dist/cli/authority.js.map +1 -1
- package/dist/cli/comms.d.ts +33 -19
- package/dist/cli/comms.js +128 -151
- package/dist/cli/comms.js.map +1 -1
- package/dist/cli/completions.js +1 -1
- package/dist/cli/completions.js.map +1 -1
- package/dist/cli/daemon.js +29 -0
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/director.d.ts +8 -12
- package/dist/cli/director.js +17 -52
- package/dist/cli/director.js.map +1 -1
- package/dist/cli/fleet.js +4 -1
- package/dist/cli/fleet.js.map +1 -1
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/leader.d.ts +27 -3
- package/dist/cli/leader.js +253 -4
- package/dist/cli/leader.js.map +1 -1
- package/dist/core/authority/server-enforcement.d.ts +110 -0
- package/dist/core/authority/server-enforcement.js +260 -0
- package/dist/core/authority/server-enforcement.js.map +1 -0
- package/dist/core/authority/standing-grant.d.ts +24 -4
- package/dist/core/authority/standing-grant.js +19 -3
- package/dist/core/authority/standing-grant.js.map +1 -1
- package/dist/core/cloud/timeline.js +13 -7
- package/dist/core/cloud/timeline.js.map +1 -1
- package/dist/core/comms/change-digest.d.ts +130 -0
- package/dist/core/comms/change-digest.js +451 -0
- package/dist/core/comms/change-digest.js.map +1 -0
- package/dist/core/comms/director-prompt.d.ts +4 -5
- package/dist/core/comms/director-prompt.js +4 -71
- package/dist/core/comms/director-prompt.js.map +1 -1
- package/dist/core/comms/director.d.ts +24 -61
- package/dist/core/comms/director.js +29 -382
- package/dist/core/comms/director.js.map +1 -1
- package/dist/core/comms/dispatch.d.ts +37 -12
- package/dist/core/comms/dispatch.js +244 -177
- package/dist/core/comms/dispatch.js.map +1 -1
- package/dist/core/comms/elon-dialogue.d.ts +23 -15
- package/dist/core/comms/elon-dialogue.js +36 -307
- package/dist/core/comms/elon-dialogue.js.map +1 -1
- package/dist/core/comms/fleet-pulse.js +4 -7
- package/dist/core/comms/fleet-pulse.js.map +1 -1
- package/dist/core/comms/handlers.d.ts +10 -6
- package/dist/core/comms/handlers.js +14 -48
- package/dist/core/comms/handlers.js.map +1 -1
- package/dist/core/comms/migrations.d.ts +47 -0
- package/dist/core/comms/migrations.js +125 -0
- package/dist/core/comms/migrations.js.map +1 -0
- package/dist/core/comms/requests.d.ts +32 -5
- package/dist/core/comms/requests.js +101 -5
- package/dist/core/comms/requests.js.map +1 -1
- package/dist/core/comms/telegram-channel.d.ts +104 -0
- package/dist/core/comms/telegram-channel.js +622 -0
- package/dist/core/comms/telegram-channel.js.map +1 -0
- package/dist/core/comms/telegram-thread-map.d.ts +56 -0
- package/dist/core/comms/telegram-thread-map.js +144 -0
- package/dist/core/comms/telegram-thread-map.js.map +1 -0
- package/dist/core/daemon/capacity-publisher.d.ts +8 -1
- package/dist/core/daemon/capacity-publisher.js +40 -2
- package/dist/core/daemon/capacity-publisher.js.map +1 -1
- package/dist/core/daemon/loop.js +18 -4
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/tick-deadline.d.ts +44 -0
- package/dist/core/daemon/tick-deadline.js +83 -0
- package/dist/core/daemon/tick-deadline.js.map +1 -0
- package/dist/core/daemon/tick-hooks.d.ts +7 -0
- package/dist/core/daemon/tick-hooks.js.map +1 -1
- package/dist/core/daemon/tick-progress.d.ts +39 -0
- package/dist/core/daemon/tick-progress.js +194 -0
- package/dist/core/daemon/tick-progress.js.map +1 -0
- package/dist/core/dashboard.js +3 -1
- package/dist/core/dashboard.js.map +1 -1
- package/dist/core/fleet/fleet-merge-state.d.ts +6 -0
- package/dist/core/fleet/fleet-merge-state.js.map +1 -1
- package/dist/core/fleet/host-merge.d.ts +9 -0
- package/dist/core/fleet/host-merge.js +13 -2
- package/dist/core/fleet/host-merge.js.map +1 -1
- package/dist/core/fleet/merge-gates.d.ts +13 -0
- package/dist/core/fleet/merge-gates.js +14 -0
- package/dist/core/fleet/merge-gates.js.map +1 -1
- package/dist/core/fleet/mirrors.d.ts +162 -6
- package/dist/core/fleet/mirrors.js +1051 -49
- package/dist/core/fleet/mirrors.js.map +1 -1
- package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
- package/dist/core/fleet/standing-merge-pass.js +72 -1
- package/dist/core/fleet/standing-merge-pass.js.map +1 -1
- package/dist/core/fleet/status.d.ts +17 -0
- package/dist/core/fleet/status.js +22 -0
- package/dist/core/fleet/status.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +1 -1
- package/dist/core/fleet/tick-hooks-live.js +13 -3
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/git.d.ts +17 -0
- package/dist/core/git.js +124 -25
- package/dist/core/git.js.map +1 -1
- package/dist/core/goals/open-goals.d.ts +47 -0
- package/dist/core/goals/open-goals.js +33 -0
- package/dist/core/goals/open-goals.js.map +1 -0
- package/dist/core/inbox/merge.d.ts +5 -0
- package/dist/core/inbox/merge.js +58 -2
- package/dist/core/inbox/merge.js.map +1 -1
- package/dist/core/integrations/locus.d.ts +28 -0
- package/dist/core/integrations/locus.js +155 -30
- package/dist/core/integrations/locus.js.map +1 -1
- package/dist/core/integrations/telegram-format.d.ts +40 -0
- package/dist/core/integrations/telegram-format.js +123 -0
- package/dist/core/integrations/telegram-format.js.map +1 -0
- package/dist/core/integrations/telegram.d.ts +60 -4
- package/dist/core/integrations/telegram.js +161 -28
- package/dist/core/integrations/telegram.js.map +1 -1
- package/dist/core/mcp-registry.d.ts +12 -0
- package/dist/core/mcp-registry.js +70 -0
- package/dist/core/mcp-registry.js.map +1 -1
- package/dist/core/observability/rollup.d.ts +12 -10
- package/dist/core/observability/rollup.js +44 -17
- package/dist/core/observability/rollup.js.map +1 -1
- package/dist/core/resources/connection-monitor.d.ts +9 -0
- package/dist/core/resources/connection-monitor.js +19 -9
- package/dist/core/resources/connection-monitor.js.map +1 -1
- package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
- package/dist/core/resources/quota-refresh-lease.js +34 -1
- package/dist/core/resources/quota-refresh-lease.js.map +1 -1
- package/dist/core/routing/budget-api.d.ts +7 -1
- package/dist/core/routing/budget-api.js +56 -2
- package/dist/core/routing/budget-api.js.map +1 -1
- package/dist/core/routing/readiness-types.d.ts +82 -0
- package/dist/core/routing/readiness-types.js +23 -0
- package/dist/core/routing/readiness-types.js.map +1 -0
- package/dist/core/routing/readiness.d.ts +103 -0
- package/dist/core/routing/readiness.js +480 -0
- package/dist/core/routing/readiness.js.map +1 -0
- package/dist/core/sandbox/confine.js +22 -1
- package/dist/core/sandbox/confine.js.map +1 -1
- package/dist/core/sandbox/policy.d.ts +23 -0
- package/dist/core/sandbox/policy.js +100 -0
- package/dist/core/sandbox/policy.js.map +1 -1
- package/dist/core/types.d.ts +13 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
- package/dist/core/usage/frontier-usage.d.ts +20 -2
- package/dist/core/usage/frontier-usage.js +75 -17
- package/dist/core/usage/frontier-usage.js.map +1 -1
- package/dist/core/verse/accounts.d.ts +45 -0
- package/dist/core/verse/accounts.js +246 -17
- package/dist/core/verse/accounts.js.map +1 -1
- package/dist/core/verse/apps-api.js +23 -11
- package/dist/core/verse/apps-api.js.map +1 -1
- package/dist/core/verse/apps.d.ts +11 -9
- package/dist/core/verse/apps.js +2 -2
- package/dist/core/verse/apps.js.map +1 -1
- package/dist/core/verse/authority-api.d.ts +8 -2
- package/dist/core/verse/authority-api.js +40 -5
- package/dist/core/verse/authority-api.js.map +1 -1
- package/dist/core/verse/autonomy-ladder.d.ts +172 -0
- package/dist/core/verse/autonomy-ladder.js +251 -0
- package/dist/core/verse/autonomy-ladder.js.map +1 -0
- package/dist/core/verse/context-fit.js +7 -5
- package/dist/core/verse/context-fit.js.map +1 -1
- package/dist/core/verse/control-api.d.ts +23 -1
- package/dist/core/verse/control-api.js +117 -10
- package/dist/core/verse/control-api.js.map +1 -1
- package/dist/core/verse/fleet-live-api.js +13 -5
- package/dist/core/verse/fleet-live-api.js.map +1 -1
- package/dist/core/verse/folder-io.d.ts +50 -0
- package/dist/core/verse/folder-io.js +142 -0
- package/dist/core/verse/folder-io.js.map +1 -0
- package/dist/core/verse/git-api.js +5 -4
- package/dist/core/verse/git-api.js.map +1 -1
- package/dist/core/verse/git-ops.d.ts +10 -1
- package/dist/core/verse/git-ops.js +18 -2
- package/dist/core/verse/git-ops.js.map +1 -1
- package/dist/core/verse/github-api.d.ts +1 -1
- package/dist/core/verse/github-api.js +5 -4
- package/dist/core/verse/github-api.js.map +1 -1
- package/dist/core/verse/github-repo.js +118 -14
- package/dist/core/verse/github-repo.js.map +1 -1
- package/dist/core/verse/leader-api.d.ts +5 -4
- package/dist/core/verse/leader-api.js +237 -10
- package/dist/core/verse/leader-api.js.map +1 -1
- package/dist/core/verse/local-models.d.ts +10 -0
- package/dist/core/verse/local-models.js +10 -1
- package/dist/core/verse/local-models.js.map +1 -1
- package/dist/core/verse/login-path.d.ts +73 -0
- package/dist/core/verse/login-path.js +123 -14
- package/dist/core/verse/login-path.js.map +1 -1
- package/dist/core/verse/mcp-control-api.js +4 -4
- package/dist/core/verse/mcp-control-api.js.map +1 -1
- package/dist/core/verse/mcp-scope.d.ts +22 -0
- package/dist/core/verse/mcp-scope.js +41 -1
- package/dist/core/verse/mcp-scope.js.map +1 -1
- package/dist/core/verse/mcp-seat-view.d.ts +10 -0
- package/dist/core/verse/mcp-seat-view.js +30 -4
- package/dist/core/verse/mcp-seat-view.js.map +1 -1
- package/dist/core/verse/overnight-api.js +20 -2
- package/dist/core/verse/overnight-api.js.map +1 -1
- package/dist/core/verse/path-guard.d.ts +24 -0
- package/dist/core/verse/path-guard.js +91 -22
- package/dist/core/verse/path-guard.js.map +1 -1
- package/dist/core/verse/preview-api.js +22 -0
- package/dist/core/verse/preview-api.js.map +1 -1
- package/dist/core/verse/projects.d.ts +21 -0
- package/dist/core/verse/projects.js +82 -0
- package/dist/core/verse/projects.js.map +1 -1
- package/dist/core/verse/session-controls-api.js +5 -3
- package/dist/core/verse/session-controls-api.js.map +1 -1
- package/dist/core/verse/session-handoff.d.ts +26 -0
- package/dist/core/verse/session-handoff.js +90 -12
- package/dist/core/verse/session-handoff.js.map +1 -1
- package/dist/core/verse/terminal-api.js +7 -4
- package/dist/core/verse/terminal-api.js.map +1 -1
- package/dist/core/verse/terminal.js +9 -5
- package/dist/core/verse/terminal.js.map +1 -1
- package/dist/core/verse/verse-api.js +81 -27
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/verse/workspaces.d.ts +51 -0
- package/dist/core/verse/workspaces.js +177 -47
- package/dist/core/verse/workspaces.js.map +1 -1
- package/dist/core/vision/leader-apply.d.ts +40 -0
- package/dist/core/vision/leader-apply.js +101 -30
- package/dist/core/vision/leader-apply.js.map +1 -1
- package/dist/core/vision/leader-cadence.d.ts +114 -0
- package/dist/core/vision/leader-cadence.js +127 -0
- package/dist/core/vision/leader-cadence.js.map +1 -0
- package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
- package/dist/core/vision/leader-goal-evidence.js +36 -0
- package/dist/core/vision/leader-goal-evidence.js.map +1 -0
- package/dist/core/vision/leader-health.d.ts +53 -0
- package/dist/core/vision/leader-health.js +92 -0
- package/dist/core/vision/leader-health.js.map +1 -0
- package/dist/core/vision/leader-operator.d.ts +176 -0
- package/dist/core/vision/leader-operator.js +355 -0
- package/dist/core/vision/leader-operator.js.map +1 -0
- package/dist/core/vision/leader-run-chain.d.ts +41 -0
- package/dist/core/vision/leader-run-chain.js +54 -0
- package/dist/core/vision/leader-run-chain.js.map +1 -0
- package/dist/core/vision/leader-seat-plan.d.ts +68 -0
- package/dist/core/vision/leader-seat-plan.js +93 -0
- package/dist/core/vision/leader-seat-plan.js.map +1 -0
- package/dist/core/vision/leader-seat.d.ts +71 -5
- package/dist/core/vision/leader-seat.js +235 -33
- package/dist/core/vision/leader-seat.js.map +1 -1
- package/dist/core/vision/leader-thread-types.d.ts +104 -0
- package/dist/core/vision/leader-thread-types.js +9 -0
- package/dist/core/vision/leader-thread-types.js.map +1 -0
- package/dist/core/vision/leader-thread.d.ts +138 -0
- package/dist/core/vision/leader-thread.js +926 -0
- package/dist/core/vision/leader-thread.js.map +1 -0
- package/dist/core/vision/leader-types.d.ts +75 -1
- package/dist/core/vision/leader.d.ts +88 -18
- package/dist/core/vision/leader.js +269 -69
- package/dist/core/vision/leader.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js → ActionMenu-CIiX2X8w.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
- package/dist/core/web/public/next/assets/{Advanced-cVYTAsfB.js.map → Advanced-DHsysoIL.js.map} +1 -1
- package/dist/core/web/public/next/assets/{App-IsaWDsdF.js → App-CMeAocmW.js} +5 -5
- package/dist/core/web/public/next/assets/{App-IsaWDsdF.js.map → App-CMeAocmW.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
- package/dist/core/web/public/next/assets/{AppsSection-DDqeSrty.js.map → AppsSection-DISYnMnc.js.map} +1 -1
- package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js → AutonomyOffState-CEPSZToP.js} +3 -3
- package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js.map → AutonomyOffState-CEPSZToP.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-Dwn8UtOy.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
- package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js → BranchBar-BxhdiIpx.js} +2 -2
- package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
- package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js → BudgetControl-C-0KhjRS.js} +2 -2
- package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js.map → BudgetControl-C-0KhjRS.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js → Button-D90dzI_o.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js.map → Button-D90dzI_o.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js → CapacityStrip-qKDBC65C.js} +2 -2
- package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
- package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
- package/dist/core/web/public/next/assets/{ChatSection-C9myY4ei.js.map → ChatSection-DlT4QU6a.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
- package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
- package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
- package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js → DeleteChatDialog-BCfP12GH.js} +2 -2
- package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js → Dialog-D3msQlCj.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js.map → Dialog-D3msQlCj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js → DiffPane-Ix6hvXlY.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js → DiffViewer-C4WKsCIe.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
- package/dist/core/web/public/next/assets/{DockHost-BcEq2qaS.js.map → DockHost-aWP7liri.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js → EmptyState-D2IRy3Cg.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js → Epistemic-DMr18muX.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js.map → Epistemic-DMr18muX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js → EvidenceTimeline-DXmmz6Fi.js} +2 -2
- package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js.map → EvidenceTimeline-DXmmz6Fi.js.map} +1 -1
- package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
- package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
- package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js → GearTray-Dt-ee32-.js} +2 -2
- package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js.map → GearTray-Dt-ee32-.js.map} +1 -1
- package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
- package/dist/core/web/public/next/assets/{GrowthSection-BvZezOsX.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js → HandoffDialog-CLJQLe7M.js} +2 -2
- package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js → Input-D_KRJA9V.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js.map → Input-D_KRJA9V.js.map} +1 -1
- package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-nuXer4K-.js.map → McpSection-DGbRcyv8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js → MessageMarkdown-DFvk06qG.js} +3 -3
- package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js → Meter-CMj-VafN.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js.map → Meter-CMj-VafN.js.map} +1 -1
- package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
- package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
- package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js → NeedsYouList-CCsijdWt.js} +2 -2
- package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
- package/dist/core/web/public/next/assets/{NewChatDialog-BqFTWgHU.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
- package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js → OnboardingFlow-Cy9BA9eR.js} +3 -3
- package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js.map → OnboardingFlow-Cy9BA9eR.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
- package/dist/core/web/public/next/assets/{OnboardingGate-BZafM1Vf.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
- package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
- package/dist/core/web/public/next/assets/{PreviewPane-zT3gK9TD.js.map → PreviewPane-COid5A0f.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js → ProviderLogo-Cq-CYIwT.js} +2 -2
- package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js → RailStatus-Co5UB6We.js} +2 -2
- package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js.map → RailStatus-Co5UB6We.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js → RefreshIndicator-DO9ibnSq.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CAxPQ4sZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
- package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js → SeatSelector-J5R3zDkB.js} +3 -3
- package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js → Segmented-CGh_-tBb.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js.map → Segmented-CGh_-tBb.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-By-V9lMc.js → Select-CWnmUzs3.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-By-V9lMc.js.map → Select-CWnmUzs3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js → SessionGate-sp4KsnUo.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js → SessionInsightChip-DLFAzdbi.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js → SessionSearch-DbFjwR1h.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SettingsSection-Bf74l0Gj.js → SettingsSection-Ch23msJ5.js} +2 -2
- package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
- package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js → SetupChecklist-Bd76MBAR.js} +2 -2
- package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js.map → SetupChecklist-Bd76MBAR.js.map} +1 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
- package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js → Sheet-BZ2AG4Eo.js} +2 -2
- package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
- package/dist/core/web/public/next/assets/{Sidebar-C9YtBYVZ.js.map → Sidebar-DN--cPYN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js → Slider-KVoJLDD6.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js.map → Slider-KVoJLDD6.js.map} +1 -1
- package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
- package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js → StatusBadge-CXsYqmdU.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
- package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
- package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js → Surface-BfDmQcKe.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js.map → Surface-BfDmQcKe.js.map} +1 -1
- package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
- package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js → Switch-9NtO_6Lj.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js.map → Switch-9NtO_6Lj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js → Tag-DscCRFcN.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js.map → Tag-DscCRFcN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js → TerminalPane-B668-DJW.js} +5 -5
- package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js.map → TerminalPane-B668-DJW.js.map} +1 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-BpphLqoz.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js → UniverseView-DG70zH0W.js} +4 -4
- package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js.map → UniverseView-DG70zH0W.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
- package/dist/core/web/public/next/assets/{Workspace-RXy0pqp6.js.map → Workspace-D1nP9BhD.js.map} +1 -1
- package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
- package/dist/core/web/public/next/assets/{actions-BZTidCXZ.js.map → actions-CY-PjpGc.js.map} +1 -1
- package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
- package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js → apps-model-Du02KhAf.js} +2 -2
- package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js.map → apps-model-Du02KhAf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js → authority-model-79SeuKlJ.js} +2 -2
- package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js.map → authority-model-79SeuKlJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
- package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
- package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
- package/dist/core/web/public/next/assets/{budget-queries-DFF-3ICg.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
- package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
- package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
- package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
- package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js → cloud-model-BDivRMqv.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js.map → cloud-model-BDivRMqv.js.map} +1 -1
- package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js → cloud-queries-BPQQ5_pJ.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
- package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{command-catalog-ffCAijVY.js → command-catalog-BIntSa9l.js} +2 -2
- package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
- package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js → context-model-Br8t9jgG.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js.map → context-model-Br8t9jgG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js → context-model-CokrgEUq.js} +3 -3
- package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js.map → context-model-CokrgEUq.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
- package/dist/core/web/public/next/assets/{context-queries-_9bFWb9v.js.map → context-queries-eL3caKVG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js → control-queries-B9K-wmcB.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js.map → control-queries-B9K-wmcB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js → copy-setup-XMgCC5f8.js} +2 -2
- package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js.map → copy-setup-XMgCC5f8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js → dock-icons-BJ6ZqB2t.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js → fleet-model-BvDR3gjp.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js → fleet-queries-W2UFVMZJ.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js → focus-trap-CtI1SlMX.js} +2 -2
- package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{format-BmH2yWL6.js → format-CH4g_sl1.js} +2 -2
- package/dist/core/web/public/next/assets/{format-BmH2yWL6.js.map → format-CH4g_sl1.js.map} +1 -1
- package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
- package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js → git-model-Dnkd1TnK.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js.map → git-model-Dnkd1TnK.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
- package/dist/core/web/public/next/assets/{global-y_exIyAP.js.map → global-CMNW_dqn.js.map} +1 -1
- package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
- package/dist/core/web/public/next/assets/{guarded-runners-Cd4POBtI.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-CygCEFWs.js → icons-D1sYbCTQ.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-CygCEFWs.js.map → icons-D1sYbCTQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-CyK31YRm.js → index-DZ-UQ7v8.js} +3 -3
- package/dist/core/web/public/next/assets/{index-CyK31YRm.js.map → index-DZ-UQ7v8.js.map} +1 -1
- package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
- package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
- package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js → live-model-D_32RAOR.js} +2 -2
- package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js.map → live-model-D_32RAOR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js → mind.module-7hA92hRg.js} +2 -2
- package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js.map → mind.module-7hA92hRg.js.map} +1 -1
- package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-CWlxEMEm.js.map → mutations-DQPbFdRJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{nav-mimleI0R.js → nav-0dOYe2rJ.js} +2 -2
- package/dist/core/web/public/next/assets/{nav-mimleI0R.js.map → nav-0dOYe2rJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js → overnight-queries-C4wOnFtE.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
- package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
- package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js → queries-BTXWdZzU.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js.map → queries-BTXWdZzU.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js → reasoning-pref-Ca6lN6x_.js} +2 -2
- package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js → reveal-anchor-DfNLgK_I.js} +2 -2
- package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
- package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
- package/dist/core/web/public/next/assets/{seat-subscription-BhUUz7VL.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js → sidebar-model-CLCdqwkR.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js → slots-C-qBeu-8.js} +3 -3
- package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js.map → slots-C-qBeu-8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js → surface-data-Dj71tdD-.js} +2 -2
- package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js.map → surface-data-Dj71tdD-.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
- package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js → tasks-model-O8yR5YXp.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js → terminal-icons-CoRZq9iO.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
- package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
- package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js → usage-queries-AdjEyEtn.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js → use-guarded-action-CuuMHeDX.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js → use-ticker-BBcp02SZ.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js → use-token-gate-CbXVYQYI.js} +2 -2
- package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js → useOnboarding-C_Fpe_sH.js} +2 -2
- package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js → useVerseTranscript-DgbigUlV.js} +2 -2
- package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js → verse-icons-S56hIiXS.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js.map → verse-icons-S56hIiXS.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
- package/dist/core/web/public/next/assets/{verse-model-JTuvRBVK.js.map → verse-model-DAVevkNe.js.map} +1 -1
- package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js → warmup-B_RAtNZ_.js} +3 -3
- package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js.map → warmup-B_RAtNZ_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js → why-seat-model-M_r0wX3b.js} +2 -2
- package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js.map → why-seat-model-M_r0wX3b.js.map} +1 -1
- package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js → workspace-model-dji5-Al3.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js.map → workspace-model-dji5-Al3.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/core/web/read-projection-worker.js +2 -1
- package/dist/core/web/read-projection-worker.js.map +1 -1
- package/dist/core/web/read-projections.d.ts +3 -0
- package/dist/core/web/read-projections.js +2 -2
- package/dist/core/web/read-projections.js.map +1 -1
- package/dist/core/web/visibility.js +3 -4
- package/dist/core/web/visibility.js.map +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +3 -2
- package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js +0 -2
- package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
- package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +0 -2
- package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js +0 -3
- package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-BvZezOsX.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BqFTWgHU.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +0 -3
- package/dist/core/web/public/next/assets/PreviewPane-zT3gK9TD.js +0 -2
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CAxPQ4sZ.js +0 -7
- package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js +0 -2
- package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-Bf74l0Gj.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +0 -3
- package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
- package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BpphLqoz.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-RXy0pqp6.js +0 -10
- package/dist/core/web/public/next/assets/actions-BZTidCXZ.js +0 -2
- package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
- package/dist/core/web/public/next/assets/budget-queries-DFF-3ICg.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzxWrZn7.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzxWrZn7.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
- package/dist/core/web/public/next/assets/command-catalog-ffCAijVY.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-_9bFWb9v.js +0 -2
- package/dist/core/web/public/next/assets/global-y_exIyAP.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-Cd4POBtI.js +0 -2
- package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +0 -2
- package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-BhUUz7VL.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-JTuvRBVK.js +0 -2
package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js.map → DiffPane-Ix6hvXlY.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiffPane-Cpr9soB2.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/git/DiffPane.module.css","../../../../../../src/web-ui/routes/verse/git/PatchView.tsx","../../../../../../src/web-ui/routes/verse/git/DiffPane.tsx"],"sourcesContent":["/*\n * Review pane (SPEC-310C §3). Lives in the dock: 320px to 60% of the window,\n * a sheet below 1024, a bottom sheet below 480 — so the layout answers the\n * PANE's width (a container query), not the window's. Narrow: file list over\n * patch. At 720px+ of pane: list beside patch.\n *\n * Diff tints are the diff's own mixes over --bg-code (as in chat.module.css),\n * and the +/− marker column carries the meaning, never colour alone.\n */\n.pane {\n container-type: inline-size;\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: 100%;\n min-height: 0;\n background: var(--bg-canvas);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n /* Same row tints as the transcript's DiffBlock (chat.module.css), so a\n change looks the same in the chat and in Review; the emphasis mix marks\n the changed span inside a line (git-contrast.test.ts holds text on all four). */\n --diff-add: color-mix(in srgb, var(--status-success-solid) 22%, var(--bg-code));\n --diff-del: color-mix(in srgb, var(--status-danger-solid) 22%, var(--bg-code));\n --diff-add-em: color-mix(in srgb, var(--status-success-solid) 36%, var(--bg-code));\n --diff-del-em: color-mix(in srgb, var(--status-danger-solid) 36%, var(--bg-code));\n}\n\n/* ---- header -------------------------------------------------------------- */\n\n/* Height, padding, border and surface come from ../dock/pane-chrome.module.css\n (the row every dock pane shares); Review only wraps it at narrow widths. */\n.head { flex-wrap: wrap; }\n/* Scoped under .head so it outranks the shared title's size and colour. */\n.head .rootName {\n max-width: 16ch;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.rootPick { display: inline-flex; min-width: 0; }\n.select {\n min-height: var(--control-h-sm);\n max-width: 16ch;\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n}\n.select:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.summary {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n}\n.summary:empty { display: none; }\n.muted { color: var(--text-tertiary); }\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n.ref {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n background: var(--bg-code);\n color: var(--text-primary);\n}\n\n.skeleton {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3);\n}\n\n/* ---- body: list over patch, or beside it --------------------------------- */\n\n.body {\n flex: 1 1 auto;\n min-height: 0;\n display: grid;\n /* Stacked: the list takes what it needs, up to a cap, and the patch the rest. */\n grid-template-rows: auto minmax(0, 1fr);\n overflow: hidden;\n}\n\n.files {\n min-height: 0;\n max-height: min(34vh, 14rem);\n overflow: auto;\n border-bottom: 1px solid var(--border-subtle);\n}\n/* Side by side once the PANE is wide enough. Declared after .files so it wins. */\n@container (min-width: 720px) {\n .body {\n grid-template-rows: none;\n grid-template-columns: minmax(12rem, 30%) minmax(0, 1fr);\n }\n .files { border-bottom: 0; border-right: 1px solid var(--border-subtle); max-height: none; }\n}\n\n.fileList {\n list-style: none;\n margin: 0;\n padding: var(--space-1) 0;\n}\n.fileList:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--border-focus); }\n.group { display: block; }\n.groupFiles { list-style: none; margin: 0; padding: 0; }\n.dir {\n display: block;\n padding: var(--space-2) var(--space-3) var(--space-1);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n}\n.file {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-xs);\n padding: 0 var(--space-3) 0 var(--space-4);\n cursor: pointer;\n border-left: 2px solid transparent;\n}\n.file:hover { background: var(--bg-hover); }\n.file[aria-selected='true'] { background: var(--bg-selected); border-left-color: var(--accent-600); }\n.file[aria-disabled='true'] { cursor: default; color: var(--text-tertiary); }\n.fileStatus {\n flex: none;\n width: 1.4em;\n text-align: center;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-secondary);\n}\n.file[data-status='A'] .fileStatus { color: var(--status-success-fg); }\n.file[data-status='D'] .fileStatus { color: var(--status-danger-fg); }\n.file[data-status='U'] .fileStatus { color: var(--status-warning-fg); }\n.fileName {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n.fileCounts,\n.fileSettled {\n flex: none;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n}\n.fileComments {\n flex: none;\n min-width: 1.5em;\n padding: 0 var(--space-1);\n border-radius: var(--radius-full);\n background: var(--accent-100);\n color: var(--accent-700);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-align: center;\n}\n\n.patchArea {\n min-height: 0;\n min-width: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n.patchPath {\n position: sticky;\n top: 0;\n z-index: 1;\n margin: 0;\n padding: var(--space-2) var(--space-3);\n background: var(--bg-canvas);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n}\n.patchNotice,\n.patchError {\n margin: 0;\n padding: var(--space-4) var(--space-3);\n color: var(--text-secondary);\n}\n.patchError {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-2);\n color: var(--status-danger-fg);\n}\n.patchError > p { margin: 0; }\n.truncated {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n}\n\n/* ---- the patch grid ------------------------------------------------------ */\n\n.patch { min-width: 0; }\n.grid {\n width: 100%;\n border-collapse: collapse;\n table-layout: auto;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n background: var(--bg-code);\n}\n.grid:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--border-focus); }\n\n.hunkRow > td {\n padding: var(--space-1) var(--space-3);\n background: var(--bg-surface);\n color: var(--text-tertiary);\n border-top: 1px solid var(--border-subtle);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-ui);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n}\n\n.lineRow[data-kind='add'] > td { background: var(--diff-add); }\n.lineRow[data-kind='del'] > td { background: var(--diff-del); }\n.half[data-kind='add'] { background: var(--diff-add); }\n.half[data-kind='del'] { background: var(--diff-del); }\n.half[data-kind='empty'] { background: color-mix(in srgb, var(--text-tertiary) 6%, var(--bg-code)); }\n.lineRow[data-active='true'] > td { box-shadow: inset 0 1px 0 var(--border-focus), inset 0 -1px 0 var(--border-focus); }\n\n.no {\n width: 1%;\n min-width: 3.5ch;\n padding: 0 var(--space-2);\n text-align: right;\n /* Real line numbers, read to find the change in an editor: the body floor\n on the code ground, which --text-tertiary misses in light (chat.module.css). */\n color: var(--text-secondary);\n user-select: none;\n white-space: nowrap;\n vertical-align: top;\n}\n.gutter {\n width: 1.6em;\n padding: 0;\n vertical-align: top;\n text-align: center;\n}\n.marker {\n width: 1.2em;\n padding: 0;\n text-align: center;\n color: var(--text-secondary);\n user-select: none;\n vertical-align: top;\n}\n.code,\n.half {\n padding: 0 var(--space-3) 0 var(--space-1);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n word-break: break-word;\n vertical-align: top;\n color: var(--text-primary);\n}\n.grid[data-layout='split'] .half { width: 50%; }\n.codeText { font-family: inherit; }\n.em { border-radius: 2px; }\n.lineRow[data-kind='add'] .em,\n.half[data-kind='add'] .em { background: var(--diff-add-em); }\n.lineRow[data-kind='del'] .em,\n.half[data-kind='del'] .em { background: var(--diff-del-em); }\n\n/* The gutter \"+\" appears on the hovered or active line (the pointer's GitHub habit). */\n.gutterAdd {\n display: inline-grid;\n place-items: center;\n width: 1.3em;\n height: 1.3em;\n margin-top: 1px;\n padding: 0;\n border: 0;\n border-radius: var(--radius-xs);\n background: var(--accent-600);\n color: var(--text-on-accent);\n font: inherit;\n font-weight: var(--font-weight-bold);\n line-height: 1;\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.lineRow:hover .gutterAdd,\n.lineRow[data-active='true'] .gutterAdd,\n.gutterAdd:focus-visible { opacity: 1; }\n\n.tok_plain { color: inherit; }\n/* Secondary, not tertiary: tertiary falls to 3.5:1 on the add tint (git-contrast.test.ts); italics carry \"comment\". */\n.tok_comment { color: var(--text-secondary); font-style: italic; }\n.tok_string { color: var(--status-success-fg); }\n.tok_number { color: var(--status-warning-fg); }\n.tok_keyword { color: var(--accent-700); font-weight: var(--font-weight-medium); }\n\n.showAll {\n margin: var(--space-2) var(--space-3);\n align-self: flex-start;\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n cursor: pointer;\n}\n\n/* ---- comments ------------------------------------------------------------ */\n\n.threadRow > td {\n padding: var(--space-2) var(--space-3);\n background: var(--bg-surface);\n border-top: 1px solid var(--border-subtle);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n white-space: normal;\n}\n.comment {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: baseline;\n gap: var(--space-2);\n padding: var(--space-1) 0;\n}\n.commentWhere {\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n color: var(--text-tertiary);\n font-family: var(--font-display);\n}\n.commentText { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text-primary); }\n.commentRemove,\n.linkButton {\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n}\n.commentRemove:focus-visible,\n.linkButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.editor { display: flex; flex-direction: column; gap: var(--space-2); }\n.editorLabel { font-size: var(--text-xs-size); color: var(--text-secondary); font-weight: var(--font-weight-medium); }\n.editorInput {\n width: 100%;\n box-sizing: border-box;\n min-height: calc(var(--text-sm-line) * 2 + var(--space-4));\n padding: var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n resize: vertical;\n}\n.editorInput:focus-visible { outline: none; border-color: var(--border-focus); box-shadow: var(--shadow-focus-ring); }\n.editorActions { display: flex; align-items: center; gap: var(--space-2); justify-content: flex-end; flex-wrap: wrap; }\n.editorHint { margin-right: auto; font-size: var(--text-xs-size); color: var(--text-tertiary); }\n\n.saveButton {\n min-height: var(--control-h-xs);\n padding: 0 var(--space-3);\n border: 1px solid var(--accent-600);\n border-radius: var(--radius-sm);\n background: var(--accent-600);\n color: var(--text-on-accent);\n font: inherit;\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n cursor: pointer;\n}\n.saveButton:hover { background: var(--accent-700); border-color: var(--accent-700); }\n.saveButton:disabled { opacity: 0.6; cursor: default; }\n.saveButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.foot {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-2) var(--space-3);\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n.footCount { margin-right: auto; color: var(--text-secondary); font-size: var(--text-sm-size); }\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .gutterAdd { transition: none; }\n}\n","/**\n * routes/verse/git/PatchView.tsx — one file's patch in the Review pane,\n * unified or split, with line comments (unit C5; SPEC-310C §3 \"Diff/Review\").\n *\n * Reuses the inbox parser (`parseUnifiedDiff`, `toSplitRows`) and highlighter\n * (`tokenizeLine`) verbatim — the same pieces DiffBlock renders the\n * transcript's inline diffs with — plus `intralineSpans` (chat/line-diff.ts)\n * to emphasise the part of a changed line that changed.\n *\n * KEYBOARD. The patch is ONE tab stop (a grid with an active line, announced\n * through aria-activedescendant — thousands of focusable rows would make Tab\n * useless): ↑ ↓ move a line, PageUp PageDown move twenty, Home End jump,\n * Enter opens a comment on the active line. In the comment box ⌘/Ctrl+Enter\n * saves and Escape cancels, returning focus to the patch. The pointer gets a\n * \"+\" in the gutter of the hovered line, as on GitHub.\n *\n * A patch the server cut at 256 KB says so, and rows past ROW_LIMIT are\n * behind \"Show all\" — every row is DOM.\n */\nimport { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react';\nimport { parseUnifiedDiff, toSplitRows, type DiffLine } from '../../inbox/diff-parser.js';\nimport { languageForPath, tokenizeLine, type LangFamily } from '../../inbox/highlight.js';\nimport { intralineSpans } from '../chat/line-diff.js';\nimport { formatCount, type ReviewComment } from './git-model.js';\nimport styles from './DiffPane.module.css';\n\nexport type PatchLayout = 'unified' | 'split';\n\n/** Rows rendered before \"Show all\". */\nexport const ROW_LIMIT = 3_000;\nconst PAGE = 20;\n\nexport interface PatchViewProps {\n path: string;\n text: string;\n truncated: boolean;\n /** Bytes of the whole patch before the cut (for \"showing 256 KB of 1.2 MB\"). */\n totalBytes: number | null;\n layout: PatchLayout;\n comments: readonly ReviewComment[];\n onAddComment: (c: Omit<ReviewComment, 'id'>) => void;\n onRemoveComment: (id: string) => void;\n}\n\n/** One commentable line, in display order. */\ninterface Anchor {\n key: string;\n line: number;\n side: 'new' | 'old';\n}\n\ntype UnifiedRow =\n | { kind: 'hunk'; key: string; label: string }\n | { kind: 'line'; key: string; line: DiffLine; anchor: Anchor; emphasis: [number, number] | null };\n\ntype SplitRowView =\n | { kind: 'hunk'; key: string; label: string }\n | {\n kind: 'pair';\n key: string;\n left: DiffLine | null;\n right: DiffLine | null;\n anchor: Anchor;\n leftEmphasis: [number, number] | null;\n rightEmphasis: [number, number] | null;\n };\n\nfunction anchorFor(line: DiffLine, key: string): Anchor {\n if (line.kind === 'del') return { key, line: line.oldLineNo ?? 0, side: 'old' };\n return { key, line: line.newLineNo ?? line.oldLineNo ?? 0, side: 'new' };\n}\n\nfunction hunkLabel(header: string, index: number): string {\n const section = header.replace(/^@@[^@]*@@/, '').trim();\n const m = /^@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/.exec(header);\n const where = m ? `line ${m[2]}` : `hunk ${index + 1}`;\n return section ? `${where} · ${section}` : where;\n}\n\nfunction buildRows(text: string): { unified: UnifiedRow[]; split: SplitRowView[]; notice: string | null; status: string } {\n const parsed = parseUnifiedDiff(text);\n const file = parsed.files[0];\n if (!file) return { unified: [], split: [], notice: null, status: 'modified' };\n const unified: UnifiedRow[] = [];\n const split: SplitRowView[] = [];\n file.hunks.forEach((hunk, h) => {\n const label = hunkLabel(hunk.header, h);\n unified.push({ kind: 'hunk', key: `h${h}`, label });\n split.push({ kind: 'hunk', key: `h${h}`, label });\n // Pair each run of deletions with the run of additions after it, for emphasis in both layouts.\n const pairs = toSplitRows(hunk.lines);\n const emphasisOf = new Map<DiffLine, [number, number] | null>();\n for (const p of pairs) {\n if (p.left && p.right && p.left.kind === 'del' && p.right.kind === 'add') {\n const spans = intralineSpans(p.left.text, p.right.text);\n emphasisOf.set(p.left, spans ? spans.old : null);\n emphasisOf.set(p.right, spans ? spans.new : null);\n }\n }\n hunk.lines.forEach((line, i) => {\n const key = `h${h}l${i}`;\n unified.push({ kind: 'line', key, line, anchor: anchorFor(line, key), emphasis: emphasisOf.get(line) ?? null });\n });\n pairs.forEach((p, i) => {\n const key = `h${h}p${i}`;\n const anchorLine = p.right ?? p.left!;\n split.push({\n kind: 'pair',\n key,\n left: p.left,\n right: p.right,\n anchor: anchorFor(anchorLine, key),\n leftEmphasis: p.left ? emphasisOf.get(p.left) ?? null : null,\n rightEmphasis: p.right ? emphasisOf.get(p.right) ?? null : null,\n });\n });\n });\n return { unified, split, notice: file.unparsedNotice, status: file.status };\n}\n\nfunction formatBytes(n: number): string {\n if (n >= 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n return `${Math.round(n / 1024)} KB`;\n}\n\nexport function PatchView({ path, text, truncated, totalBytes, layout, comments, onAddComment, onRemoveComment }: PatchViewProps) {\n const lang = languageForPath(path);\n const built = useMemo(() => buildRows(text), [text]);\n const [showAll, setShowAll] = useState(false);\n const [active, setActive] = useState(0);\n const [editing, setEditing] = useState<Anchor | null>(null);\n const gridRef = useRef<HTMLTableElement>(null);\n const idBase = useId();\n\n const rows = layout === 'split' ? built.split : built.unified;\n const limited = !showAll && rows.length > ROW_LIMIT;\n const visible = limited ? rows.slice(0, ROW_LIMIT) : rows;\n /** Indexes (into `visible`) of commentable rows — what the arrow keys walk. */\n const lineIndexes = useMemo(() => visible.flatMap((r, i) => (r.kind === 'hunk' ? [] : [i])), [visible]);\n\n useEffect(() => {\n setActive(0);\n setEditing(null);\n setShowAll(false);\n }, [text, layout]);\n\n const activeRowIndex = lineIndexes[Math.min(active, Math.max(0, lineIndexes.length - 1))] ?? -1;\n const activeRow = activeRowIndex >= 0 ? visible[activeRowIndex] : undefined;\n const activeAnchor = activeRow && activeRow.kind !== 'hunk' ? activeRow.anchor : null;\n const cellId = (key: string) => `${idBase}-${key}`;\n\n useEffect(() => {\n if (activeAnchor === null) return;\n const el = document.getElementById(cellId(activeAnchor.key));\n el?.scrollIntoView?.({ block: 'nearest' });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeAnchor?.key]);\n\n const onKey = (e: ReactKeyboardEvent<HTMLTableElement>) => {\n if (e.target !== e.currentTarget) return;\n const last = lineIndexes.length - 1;\n const go = (n: number) => {\n e.preventDefault();\n setActive(Math.max(0, Math.min(last, n)));\n };\n switch (e.key) {\n case 'ArrowDown': go(active + 1); break;\n case 'ArrowUp': go(active - 1); break;\n case 'PageDown': go(active + PAGE); break;\n case 'PageUp': go(active - PAGE); break;\n case 'Home': go(0); break;\n case 'End': go(last); break;\n case 'Enter':\n if (activeAnchor) {\n e.preventDefault();\n setEditing(activeAnchor);\n }\n break;\n default:\n break;\n }\n };\n\n const commentsAt = (anchor: Anchor) => comments.filter((c) => c.line === anchor.line && c.side === anchor.side);\n const startComment = (anchor: Anchor, rowIndex: number) => {\n const at = lineIndexes.indexOf(rowIndex);\n if (at >= 0) setActive(at);\n setEditing(anchor);\n };\n const closeEditor = () => {\n setEditing(null);\n gridRef.current?.focus();\n };\n\n if (built.notice && rows.length === 0) {\n return <p className={styles.patchNotice}>{/binary/i.test(built.notice) ? 'Binary file — no lines to show.' : built.notice}</p>;\n }\n if (rows.length === 0) {\n return (\n <p className={styles.patchNotice}>\n {built.status === 'renamed' ? 'Renamed with no content changes.' : 'No line changes (a mode or permission change).'}\n </p>\n );\n }\n\n // Both layouts are five columns: two numbers + gutter + marker + code, or number + half + gutter + number + half.\n const colSpan = 5;\n return (\n <div className={styles.patch}>\n {truncated ? (\n <p className={styles.truncated} role=\"note\">\n Showing the first 256 KB{totalBytes ? ` of ${formatBytes(totalBytes)}` : ''}. Open the file in your editor for the rest.\n </p>\n ) : null}\n <table\n ref={gridRef}\n role=\"grid\"\n className={styles.grid}\n data-layout={layout}\n tabIndex={0}\n aria-label={`Changes in ${path}. Arrow keys move between lines; Enter adds a comment.`}\n aria-activedescendant={activeAnchor ? cellId(activeAnchor.key) : undefined}\n aria-rowcount={visible.length}\n onKeyDown={onKey}\n >\n <tbody>\n {visible.map((row, index) => {\n if (row.kind === 'hunk') {\n return (\n <tr key={row.key} className={styles.hunkRow}>\n <td colSpan={colSpan} className={styles.hunkCell} role=\"gridcell\">\n {row.label}\n </td>\n </tr>\n );\n }\n const isActive = index === activeRowIndex;\n // A split row shows two lines; a comment made on either side (in\n // either layout) belongs under it.\n const thread = row.kind === 'pair' && row.left && row.left.kind === 'del' && row.right\n ? [...commentsAt(row.anchor), ...commentsAt(anchorFor(row.left, row.key))]\n : commentsAt(row.anchor);\n const isEditing = editing?.key === row.anchor.key;\n return (\n <FragmentRows key={row.key}>\n {row.kind === 'line' ? (\n <tr className={styles.lineRow} data-kind={row.line.kind} data-active={isActive ? 'true' : undefined}>\n <td className={styles.no} aria-hidden=\"true\">{row.line.oldLineNo ?? ''}</td>\n <td className={styles.no} aria-hidden=\"true\">{row.line.newLineNo ?? ''}</td>\n <td className={styles.gutter}>\n <AddButton onClick={() => startComment(row.anchor, index)} line={row.anchor.line} />\n </td>\n <td className={styles.marker} aria-hidden=\"true\">\n {row.line.kind === 'add' ? '+' : row.line.kind === 'del' ? '−' : ''}\n </td>\n <td id={cellId(row.key)} role=\"gridcell\" className={styles.code} aria-label={lineLabel(row.line)}>\n <Code text={row.line.text} lang={lang} emphasis={row.emphasis} kind={row.line.kind} />\n </td>\n </tr>\n ) : (\n <tr className={styles.lineRow} data-kind=\"pair\" data-active={isActive ? 'true' : undefined}>\n <td className={styles.no} aria-hidden=\"true\">{row.left?.oldLineNo ?? ''}</td>\n <td className={styles.half} data-kind={row.left?.kind ?? 'empty'}>\n {row.left ? <Code text={row.left.text} lang={lang} emphasis={row.leftEmphasis} kind={row.left.kind} /> : null}\n </td>\n <td className={styles.gutter}>\n <AddButton onClick={() => startComment(row.anchor, index)} line={row.anchor.line} />\n </td>\n <td className={styles.no} aria-hidden=\"true\">{row.right?.newLineNo ?? ''}</td>\n <td\n id={cellId(row.key)}\n role=\"gridcell\"\n className={styles.half}\n data-kind={row.right?.kind ?? 'empty'}\n aria-label={[row.left ? lineLabel(row.left) : null, row.right && row.right !== row.left ? lineLabel(row.right) : null].filter(Boolean).join('; ')}\n >\n {row.right ? <Code text={row.right.text} lang={lang} emphasis={row.rightEmphasis} kind={row.right.kind} /> : null}\n </td>\n </tr>\n )}\n {thread.length > 0 || isEditing ? (\n <tr className={styles.threadRow}>\n <td colSpan={colSpan} role=\"gridcell\">\n {thread.map((c) => (\n <div key={c.id} className={styles.comment}>\n <span className={styles.commentWhere}>\n {c.side === 'old' ? 'Removed line' : 'Line'} {c.line}\n </span>\n <p className={styles.commentText}>{c.note}</p>\n <button type=\"button\" className={styles.commentRemove} onClick={() => onRemoveComment(c.id)} aria-label={`Remove the comment on line ${c.line}`}>\n Remove\n </button>\n </div>\n ))}\n {isEditing ? (\n <CommentEditor\n anchor={row.anchor}\n onCancel={closeEditor}\n onSave={(note) => {\n onAddComment({ path, line: row.anchor.line, side: row.anchor.side, note });\n closeEditor();\n }}\n />\n ) : null}\n </td>\n </tr>\n ) : null}\n </FragmentRows>\n );\n })}\n </tbody>\n </table>\n {limited ? (\n <button type=\"button\" className={styles.showAll} onClick={() => setShowAll(true)}>\n Show all {formatCount(rows.length)} lines\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction FragmentRows({ children }: { children: ReactNode }) {\n return <>{children}</>;\n}\n\nfunction lineLabel(line: DiffLine): string {\n const n = line.kind === 'del' ? line.oldLineNo : line.newLineNo;\n const what = line.kind === 'add' ? 'added' : line.kind === 'del' ? 'removed' : 'unchanged';\n return `Line ${n ?? '—'}, ${what}: ${line.text}`;\n}\n\nfunction AddButton({ onClick, line }: { onClick: () => void; line: number }) {\n return (\n <button type=\"button\" className={styles.gutterAdd} tabIndex={-1} onClick={onClick} aria-label={`Add a comment on line ${line}`}\n title={`Add a comment on line ${line}`}>\n +\n </button>\n );\n}\n\nfunction Code({ text, lang, emphasis, kind }: { text: string; lang: LangFamily; emphasis: [number, number] | null; kind: DiffLine['kind'] }) {\n const tokens = tokenizeLine(text, lang);\n if (!emphasis || kind === 'context') {\n return (\n <code className={styles.codeText}>\n {tokens.map((t, i) => (\n <span key={i} className={styles[`tok_${t.kind}`]}>{t.text}</span>\n ))}\n </code>\n );\n }\n // Split tokens at the emphasis boundaries so highlighting and emphasis compose.\n const [from, to] = emphasis;\n const parts: Array<{ text: string; kind: string; em: boolean }> = [];\n let at = 0;\n for (const t of tokens) {\n const start = at;\n const end = at + t.text.length;\n const cuts = [start, Math.max(start, Math.min(end, from)), Math.max(start, Math.min(end, to)), end];\n for (let c = 0; c < 3; c++) {\n const a = cuts[c]!;\n const b = cuts[c + 1]!;\n if (b > a) parts.push({ text: text.slice(a, b), kind: t.kind, em: c === 1 });\n }\n at = end;\n }\n return (\n <code className={styles.codeText}>\n {parts.map((p, i) => (\n <span key={i} className={`${styles[`tok_${p.kind}`] ?? ''} ${p.em ? styles.em : ''}`}>{p.text}</span>\n ))}\n </code>\n );\n}\n\nfunction CommentEditor({ anchor, onSave, onCancel }: { anchor: Anchor; onSave: (note: string) => void; onCancel: () => void }) {\n const [note, setNote] = useState('');\n const ref = useRef<HTMLTextAreaElement>(null);\n const id = useId();\n useEffect(() => {\n ref.current?.focus();\n }, []);\n const save = () => {\n if (note.trim()) onSave(note.trim());\n };\n return (\n <div className={styles.editor}>\n <label htmlFor={id} className={styles.editorLabel}>\n Comment on {anchor.side === 'old' ? 'removed line' : 'line'} {anchor.line}\n </label>\n <textarea\n id={id}\n ref={ref}\n className={styles.editorInput}\n rows={2}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n save();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n onCancel();\n }\n }}\n placeholder=\"What should change here?\"\n maxLength={4_000}\n />\n <div className={styles.editorActions}>\n <span className={styles.editorHint}>⌘Enter saves · Esc cancels</span>\n <button type=\"button\" className={styles.linkButton} onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className={styles.saveButton} onClick={save} disabled={!note.trim()}>\n Save comment\n </button>\n </div>\n </div>\n );\n}\n","/**\n * routes/verse/git/DiffPane.tsx — the dock's Review pane (unit C5; SPEC-310C\n * §3 \"Diff/Review\"). Mounted by C2 through the `diff-pane` slot with exactly\n * DiffPaneProps.\n *\n * [repo ▾] [This turn | Uncommitted | Branch] [Unified|Split] ⟳\n * 12 files · +340 −20 against main\n * ┌ file list (M/A/D/R/U + ± per file) ┐\n * └ patch of the selected file (lazy, ≤ 256 KB) with \"+\" line comments ┘\n * 2 comments [Add to message]\n *\n * SCOPES\n * This turn the files the chat's latest turn touched (C2 derives them\n * from events), shown with their CURRENT uncommitted diff; a\n * file the turn touched that has since been committed is listed\n * as such rather than silently dropped.\n * Uncommitted working tree against HEAD, untracked files included.\n * Branch everything the branch would ship against its base.\n *\n * PATCHES LOAD LAZILY: the list is one request; a patch is fetched when its\n * file is selected, cached for the life of the listing, and capped by the\n * server at 256 KB. Nothing is fetched while the pane is a background tab\n * (`visible` false) — it catches up when shown.\n *\n * COMMENTS are drafts held here, per file, until \"Add to message\" hands them\n * to the composer as `path:line: note` lines (C2's onAddToMessage; ⌘Enter in\n * the composer sends). They survive switching files and scopes, not a reload.\n *\n * KEYBOARD: the scope and layout switches are radio groups (← →); the file\n * list is a listbox (↑ ↓ Home End select and load); the patch is a grid (see\n * PatchView). Tab moves between those four stops.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { IconRefresh } from '../../../components/primitives/icons.js';\nimport type { VerseGitDiffFile, VerseGitDiffScope, VerseReviewScope } from '../../../data/api-types.js';\nimport type { DiffPaneProps } from '../shell/slots.js';\nimport {\n FILE_STATUS_WORD,\n commentsToMessage,\n describeGitError,\n diffstatLabel,\n formatCount,\n groupFiles,\n type ReviewComment,\n} from './git-model.js';\nimport { fetchGitDiff, isRootUnavailable, type GitDiffView } from './git-queries.js';\nimport { PatchView, type PatchLayout } from './PatchView.js';\nimport chrome from '../dock/pane-chrome.module.css';\nimport styles from './DiffPane.module.css';\n\nexport interface DiffPaneTestProps {\n /** Test seam for the diff reads. */\n fetchDiff?: typeof fetchGitDiff;\n}\n\n/** Below this pane width the split layout is offered but unified is the default. */\nconst SPLIT_MIN_WIDTH = 640;\n\ntype ListState =\n | { state: 'idle' }\n | { state: 'loading' }\n | { state: 'ready'; data: GitDiffView; key: string }\n | { state: 'not-a-repo' }\n | { state: 'error'; message: string };\n\ntype PatchState =\n | { state: 'idle' }\n | { state: 'loading' }\n | { state: 'ready'; text: string; truncated: boolean; totalBytes: number | null }\n | { state: 'error'; message: string };\n\n/** One row of the file list: a real change, or a turn file that is no longer uncommitted. */\ninterface ListEntry {\n file: VerseGitDiffFile;\n /** \"This turn\" only: the turn touched it, but it has no uncommitted change now. */\n settled: boolean;\n}\n\nfunction rootName(root: string): string {\n const parts = root.replace(/[\\\\/]+$/, '').split(/[\\\\/]/);\n return parts[parts.length - 1] || root;\n}\n\nfunction serverScope(scope: VerseReviewScope): VerseGitDiffScope {\n return scope === 'branch' ? 'branch' : 'working';\n}\n\nexport function DiffPane({ roots, request, turnFiles, onAddToMessage, visible, fetchDiff = fetchGitDiff }: DiffPaneProps & DiffPaneTestProps) {\n const [root, setRoot] = useState<string | null>(roots[0] ?? null);\n const [scope, setScope] = useState<VerseReviewScope>('working');\n const [file, setFile] = useState<string | null>(null);\n const [layout, setLayout] = useState<PatchLayout>('unified');\n const [rawList, setList] = useState<ListState>({ state: 'idle' });\n const [patch, setPatch] = useState<PatchState>({ state: 'idle' });\n const [comments, setComments] = useState<ReviewComment[]>([]);\n const [announce, setAnnounce] = useState('');\n const [reloadKey, setReloadKey] = useState(0);\n const [wide, setWide] = useState(true);\n const paneRef = useRef<HTMLDivElement>(null);\n const patchCache = useRef(new Map<string, PatchState & { state: 'ready' }>());\n const listRef = useRef<HTMLUListElement>(null);\n const nextCommentId = useRef(1);\n const handledNonce = useRef<number | null>(null);\n const listId = useId();\n const rootId = useId();\n\n // Keep the chosen root valid as the chat's roots change.\n useEffect(() => {\n if (root === null || !roots.includes(root)) setRoot(roots[0] ?? null);\n }, [roots, root]);\n\n // An open request from the bar's ± counts, the dock command, or a transcript link.\n useEffect(() => {\n if (!request || handledNonce.current === request.nonce) return;\n handledNonce.current = request.nonce;\n setRoot(request.root);\n setScope(request.scope);\n setFile(request.file ?? null);\n }, [request]);\n\n // The pane's own width (it lives in a resizable dock), for the split default.\n useEffect(() => {\n const el = paneRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? 0;\n setWide(w >= SPLIT_MIN_WIDTH);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n // ---- the file list ------------------------------------------------------\n useEffect(() => {\n if (!visible || root === null) return;\n const controller = new AbortController();\n const key = `${root}\\0${serverScope(scope)}`;\n patchCache.current.clear();\n // A refresh of the SAME listing keeps showing it while it reloads; a new\n // root or scope must not show the previous one's files under its name.\n setList((prev) => (prev.state === 'ready' && prev.key === key ? prev : { state: 'loading' }));\n fetchDiff(root, serverScope(scope), null, controller.signal)\n .then((data) => {\n if (!controller.signal.aborted) setList({ state: 'ready', data, key });\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n if (isRootUnavailable(err)) setList({ state: 'not-a-repo' });\n else {\n console.warn('[verse] review list failed', err);\n setList({ state: 'error', message: describeGitError(err) });\n }\n });\n return () => controller.abort();\n }, [root, scope, visible, reloadKey, fetchDiff]);\n\n // The listing as it applies to what is on screen NOW: in the render right\n // after a root or scope switch, the previous listing is still in state and\n // must read as loading, or the selection and patch effects would act on it.\n const currentKey = root === null ? '' : `${root}\\0${serverScope(scope)}`;\n const list: ListState = useMemo(\n () => (rawList.state === 'ready' && rawList.key !== currentKey ? { state: 'loading' } : rawList),\n [rawList, currentKey],\n );\n\n const entries: ListEntry[] = useMemo(() => {\n if (list.state !== 'ready') return [];\n if (scope !== 'turn') return list.data.files.map((f) => ({ file: f, settled: false }));\n const touched = turnFiles.filter((t) => t.root === root).map((t) => t.path);\n const byPath = new Map(list.data.files.map((f) => [f.path, f]));\n return [...new Set(touched)].map((path) => {\n const change = byPath.get(path);\n return change\n ? { file: change, settled: false }\n : { file: { path, oldPath: null, status: 'M' as const, additions: 0, deletions: 0, binary: false }, settled: true };\n });\n }, [list, scope, turnFiles, root]);\n\n // Grouped exactly as the list draws them, so ↑/↓ and \"the first file\" follow what is on screen.\n const groups = useMemo(() => groupFiles(entries.map((e) => e.file)), [entries]);\n const selectable = useMemo(() => {\n const byPath = new Map(entries.map((e) => [e.file.path, e]));\n return groups.flatMap((g) => g.files.map((f) => byPath.get(f.path)!)).filter((e) => !e.settled);\n }, [groups, entries]);\n\n // Keep a valid selection: the requested file, else the first change.\n useEffect(() => {\n if (list.state !== 'ready') return;\n if (file !== null && selectable.some((e) => e.file.path === file)) return;\n setFile(selectable[0]?.file.path ?? null);\n }, [list, selectable, file]);\n\n // ---- the selected file's patch -------------------------------------------\n useEffect(() => {\n if (!visible || root === null || file === null || list.state !== 'ready') {\n setPatch({ state: 'idle' });\n return;\n }\n const entry = selectable.find((e) => e.file.path === file);\n if (!entry) return;\n const key = `${serverScope(scope)}\\0${file}`;\n const hit = patchCache.current.get(key);\n if (hit) {\n setPatch(hit);\n return;\n }\n if (entry.file.binary) {\n setPatch({ state: 'ready', text: '', truncated: false, totalBytes: null });\n return;\n }\n const controller = new AbortController();\n setPatch({ state: 'loading' });\n fetchDiff(root, serverScope(scope), file, controller.signal)\n .then((data) => {\n if (controller.signal.aborted) return;\n const ready = { state: 'ready' as const, text: data.patch?.text ?? '', truncated: data.patch?.truncated ?? false, totalBytes: data.patchBytes ?? null };\n patchCache.current.set(key, ready);\n setPatch(ready);\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n console.warn('[verse] review patch failed', err);\n setPatch({ state: 'error', message: describeGitError(err) });\n });\n return () => controller.abort();\n }, [root, scope, file, visible, list, selectable, fetchDiff]);\n\n // ---- comments ------------------------------------------------------------\n const addComment = useCallback((c: Omit<ReviewComment, 'id'>) => {\n setComments((prev) => [...prev, { ...c, id: `c${nextCommentId.current++}` }]);\n setAnnounce(`Comment added on line ${c.line}.`);\n }, []);\n const removeComment = useCallback((id: string) => {\n setComments((prev) => prev.filter((c) => c.id !== id));\n setAnnounce('Comment removed.');\n }, []);\n const sendComments = () => {\n if (comments.length === 0) return;\n onAddToMessage(commentsToMessage(comments));\n setAnnounce(`Added ${comments.length} ${comments.length === 1 ? 'comment' : 'comments'} to the message.`);\n setComments([]);\n };\n\n // ---- file list keyboard (listbox) -----------------------------------------\n const onListKey = (e: ReactKeyboardEvent<HTMLUListElement>) => {\n if (selectable.length === 0) return;\n const at = selectable.findIndex((x) => x.file.path === file);\n let next = at;\n if (e.key === 'ArrowDown') next = Math.min(selectable.length - 1, at + 1);\n else if (e.key === 'ArrowUp') next = Math.max(0, at - 1);\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = selectable.length - 1;\n else return;\n e.preventDefault();\n const path = selectable[next]!.file.path;\n setFile(path);\n const escaped = typeof CSS !== 'undefined' && typeof CSS.escape === 'function' ? CSS.escape(path) : path.replace(/[\"\\\\]/g, '\\\\$&');\n listRef.current?.querySelector<HTMLElement>(`[data-path=\"${escaped}\"]`)?.scrollIntoView?.({ block: 'nearest' });\n };\n\n // ---- render --------------------------------------------------------------\n const turnCount = turnFiles.filter((t) => t.root === root).length;\n const scopeOptions = [\n { value: 'turn' as const, label: 'This turn', disabled: turnCount === 0 },\n { value: 'working' as const, label: 'Uncommitted' },\n { value: 'branch' as const, label: 'Branch' },\n ];\n const layoutOptions = [\n { value: 'unified' as const, label: 'Unified' },\n { value: 'split' as const, label: 'Split' },\n ];\n const effectiveLayout: PatchLayout = layout === 'split' && !wide ? 'unified' : layout;\n const totals = entries.reduce(\n (acc, e) => (e.settled ? acc : { files: acc.files + 1, additions: acc.additions + e.file.additions, deletions: acc.deletions + e.file.deletions }),\n { files: 0, additions: 0, deletions: 0 },\n );\n const base = list.state === 'ready' ? list.data.base : null;\n const fileComments = comments.filter((c) => c.path === file);\n const refresh = () => setReloadKey((n) => n + 1);\n\n if (roots.length === 0 || root === null) {\n return (\n <div className={styles.pane} ref={paneRef}>\n <EmptyState compact title=\"No folder to review\"\n body=\"This chat has no project folder. Start a chat in a project to review the changes it makes.\" />\n </div>\n );\n }\n\n return (\n <div className={styles.pane} ref={paneRef} data-wide={wide ? 'true' : 'false'}>\n <header className={`${chrome.header} ${styles.head}`}>\n {roots.length > 1 ? (\n <label className={styles.rootPick}>\n <span className={styles.visuallyHidden}>Repository</span>\n <select id={rootId} value={root} onChange={(e) => { setRoot(e.target.value); setFile(null); }} className={styles.select} title={root}>\n {roots.map((r) => (\n <option key={r} value={r}>{rootName(r)}</option>\n ))}\n </select>\n </label>\n ) : (\n <span className={`${chrome.title} ${styles.rootName}`} title={root}>{rootName(root)}</span>\n )}\n <Segmented\n aria-label=\"What to review\"\n size=\"sm\"\n options={scopeOptions}\n value={scope}\n onChange={(next) => { setScope(next); setFile(null); }}\n />\n <div className={chrome.actions}>\n <Segmented\n aria-label=\"Diff layout\"\n size=\"sm\"\n options={layoutOptions.map((o) => (o.value === 'split' && !wide ? { ...o, disabled: true } : o))}\n value={effectiveLayout}\n onChange={setLayout}\n />\n {/* The same ghost sm icon button the Terminal and Preview headers use. */}\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconRefresh />} aria-label=\"Refresh changes\" title=\"Refresh changes\" onClick={refresh} />\n </div>\n </header>\n\n <p className={styles.summary}>\n {list.state === 'ready' ? (\n totals.files === 0 ? (\n <span>{emptySentence(scope, base)}</span>\n ) : (\n <span aria-label={diffstatLabel(totals.files, totals.additions, totals.deletions)}>\n {formatCount(totals.files)} {totals.files === 1 ? 'file' : 'files'} · <span className={styles.add}>+{formatCount(totals.additions)}</span>{' '}\n <span className={styles.del}>{'\\u2212'}{formatCount(totals.deletions)}</span>\n {scope === 'branch' && base ? <> against <code className={styles.ref}>{base}</code></> : null}\n {scope === 'working' ? ' uncommitted' : null}\n </span>\n )\n ) : list.state === 'loading' || list.state === 'idle' ? (\n <span className={styles.muted}>Reading changes…</span>\n ) : null}\n </p>\n\n {list.state === 'not-a-repo' ? (\n <EmptyState compact title=\"Not a git repository\"\n body={`${rootName(root)} is not tracked by git, so there is nothing to review. Run git init in the terminal to start tracking it.`} />\n ) : list.state === 'error' ? (\n <EmptyState compact tone=\"error\" title=\"Could not read the changes\" body={list.message}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={refresh}>Try again</Button>} />\n ) : list.state !== 'ready' ? (\n <div className={styles.skeleton} aria-hidden=\"true\">\n <SkeletonLine />\n <SkeletonLine />\n <SkeletonLine />\n </div>\n ) : entries.length === 0 ? (\n // The summary line above states the fact; this says where to look next.\n <p className={styles.patchNotice}>{emptyNextStep(scope)}</p>\n ) : (\n <div className={styles.body}>\n <nav className={styles.files} aria-label=\"Changed files\">\n <ul\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label=\"Changed files\"\n className={styles.fileList}\n tabIndex={0}\n aria-activedescendant={file ? `${listId}-${encodeURIComponent(file)}` : undefined}\n onKeyDown={onListKey}\n >\n {groups.map((group) => (\n <li key={group.dir || '.'} role=\"presentation\" className={styles.group}>\n {/* RTL truncation keeps the tail of a long path visible; the LRM keeps\n the trailing slash from being reordered to the front. */}\n {group.dir ? <span className={styles.dir} role=\"presentation\" title={`${group.dir}/`}>{group.dir}/{'\\u200E'}</span> : null}\n <ul role=\"presentation\" className={styles.groupFiles}>\n {group.files.map((f) => {\n const settled = entries.find((e) => e.file.path === f.path)?.settled ?? false;\n const selected = f.path === file;\n const count = comments.filter((c) => c.path === f.path).length;\n return (\n <li\n key={f.path}\n id={`${listId}-${encodeURIComponent(f.path)}`}\n data-path={f.path}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={settled || undefined}\n className={styles.file}\n data-status={f.status}\n onClick={() => { if (!settled) setFile(f.path); }}\n title={f.oldPath ? `${f.oldPath} → ${f.path}` : f.path}\n >\n <span className={styles.fileStatus} aria-label={FILE_STATUS_WORD[f.status]}>{f.status}</span>\n <span className={styles.fileName}>{f.name}</span>\n {count > 0 ? <span className={styles.fileComments} aria-label={`${count} ${count === 1 ? 'comment' : 'comments'}`}>{count}</span> : null}\n {settled ? (\n <span className={styles.fileSettled}>committed</span>\n ) : f.binary ? (\n <span className={styles.fileCounts}>binary</span>\n ) : (\n <span className={styles.fileCounts}>\n <span className={styles.add}>+{formatCount(f.additions)}</span> <span className={styles.del}>{'−'}{formatCount(f.deletions)}</span>\n </span>\n )}\n </li>\n );\n })}\n </ul>\n </li>\n ))}\n </ul>\n </nav>\n\n <section className={styles.patchArea} aria-label={file ? `Patch for ${file}` : 'Patch'}>\n {file === null ? (\n <p className={styles.patchNotice}>Choose a file in the list to see its changes.</p>\n ) : patch.state === 'loading' || patch.state === 'idle' ? (\n <div className={styles.skeleton} aria-hidden=\"true\">\n <SkeletonLine />\n <SkeletonLine />\n </div>\n ) : patch.state === 'error' ? (\n <div className={styles.patchError} role=\"alert\">\n <p>{patch.message}</p>\n <Button size=\"sm\" variant=\"subtle\" onClick={refresh}>Try again</Button>\n </div>\n ) : (\n <>\n <h3 className={styles.patchPath} title={file}>{file}</h3>\n {selectable.find((e) => e.file.path === file)?.file.binary ? (\n <p className={styles.patchNotice}>Binary file — no lines to show.</p>\n ) : (\n <PatchView\n path={file}\n text={patch.text}\n truncated={patch.truncated}\n totalBytes={patch.totalBytes}\n layout={effectiveLayout}\n comments={fileComments}\n onAddComment={addComment}\n onRemoveComment={removeComment}\n />\n )}\n </>\n )}\n </section>\n </div>\n )}\n\n {comments.length > 0 ? (\n <footer className={styles.foot}>\n <span className={styles.footCount}>\n {comments.length} {comments.length === 1 ? 'comment' : 'comments'}\n {new Set(comments.map((c) => c.path)).size > 1 ? ` in ${new Set(comments.map((c) => c.path)).size} files` : ''}\n </span>\n <button type=\"button\" className={styles.linkButton} onClick={() => { setComments([]); setAnnounce('Comments discarded.'); }}>\n Discard\n </button>\n <button type=\"button\" className={styles.saveButton} onClick={sendComments}>\n Add to message\n </button>\n </footer>\n ) : null}\n <p className={styles.visuallyHidden} role=\"status\" aria-live=\"polite\">{announce}</p>\n </div>\n );\n}\n\n/** What to do about an empty scope: the next place to look, never a dead end. */\nfunction emptyNextStep(scope: VerseReviewScope): string {\n if (scope === 'turn') return 'Switch to Uncommitted or Branch to see the rest of the changes.';\n if (scope === 'working') return 'Edits the chat makes show up here as they land. Branch shows what is already committed.';\n return 'Commits on this branch show up here. Uncommitted shows edits that are not committed yet.';\n}\n\nfunction emptySentence(scope: VerseReviewScope, base: string | null): string {\n if (scope === 'turn') return 'The latest turn changed no files here.';\n if (scope === 'working') return 'No uncommitted changes.';\n return base ? `This branch has no changes against ${base}.` : 'No changes on this branch.';\n}\n"],"mappings":"+0EC6Ba,EAAY,IACnB,EAAO,GAqCb,SAAS,EAAU,EAAgB,EAAqB,CAEtD,OADI,EAAK,OAAS,MAAc,CAAE,MAAK,KAAM,EAAK,WAAa,EAAG,KAAM,KAAM,EACvE,CAAE,MAAK,KAAM,EAAK,WAAa,EAAK,WAAa,EAAG,KAAM,KAAM,CACzE,CAEA,SAAS,EAAU,EAAgB,EAAuB,CACxD,IAAM,EAAU,EAAO,QAAQ,aAAc,EAAE,CAAC,CAAC,KAAK,EAChD,EAAI,0CAA0C,KAAK,CAAM,EACzD,EAAQ,EAAI,QAAQ,EAAE,KAAO,QAAQ,EAAQ,IACnD,OAAO,EAAU,GAAG,EAAM,KAAK,IAAY,CAC7C,CAEA,SAAS,EAAU,EAAuG,CAExH,IAAM,EADS,EAAiB,CACnB,CAAA,CAAO,MAAM,GAC1B,GAAI,CAAC,EAAM,MAAO,CAAE,QAAS,CAAC,EAAG,MAAO,CAAC,EAAG,OAAQ,KAAM,OAAQ,UAAW,EAC7E,IAAM,EAAwB,CAAC,EACzB,EAAwB,CAAC,EAiC/B,OAhCA,EAAK,MAAM,SAAS,EAAM,IAAM,CAC9B,IAAM,EAAQ,EAAU,EAAK,OAAQ,CAAC,EACtC,EAAQ,KAAK,CAAE,KAAM,OAAQ,IAAK,IAAI,IAAK,OAAM,CAAC,EAClD,EAAM,KAAK,CAAE,KAAM,OAAQ,IAAK,IAAI,IAAK,OAAM,CAAC,EAEhD,IAAM,EAAQ,EAAY,EAAK,KAAK,EAC9B,EAAa,IAAI,IACvB,IAAK,IAAM,KAAK,EACd,GAAI,EAAE,MAAQ,EAAE,OAAS,EAAE,KAAK,OAAS,OAAS,EAAE,MAAM,OAAS,MAAO,CACxE,IAAM,EAAQ,EAAe,EAAE,KAAK,KAAM,EAAE,MAAM,IAAI,EACtD,EAAW,IAAI,EAAE,KAAM,EAAQ,EAAM,IAAM,IAAI,EAC/C,EAAW,IAAI,EAAE,MAAO,EAAQ,EAAM,IAAM,IAAI,CAClD,CAEF,EAAK,MAAM,SAAS,EAAM,IAAM,CAC9B,IAAM,EAAM,IAAI,EAAE,GAAG,IACrB,EAAQ,KAAK,CAAE,KAAM,OAAQ,MAAK,OAAM,OAAQ,EAAU,EAAM,CAAG,EAAG,SAAU,EAAW,IAAI,CAAI,GAAK,IAAK,CAAC,CAChH,CAAC,EACD,EAAM,SAAS,EAAG,IAAM,CACtB,IAAM,EAAM,IAAI,EAAE,GAAG,IACf,EAAa,EAAE,OAAS,EAAE,KAChC,EAAM,KAAK,CACT,KAAM,OACN,MACA,KAAM,EAAE,KACR,MAAO,EAAE,MACT,OAAQ,EAAU,EAAY,CAAG,EACjC,aAAc,EAAE,KAAO,EAAW,IAAI,EAAE,IAAI,GAAK,KAAO,KACxD,cAAe,EAAE,MAAQ,EAAW,IAAI,EAAE,KAAK,GAAK,KAAO,IAC7D,CAAC,CACH,CAAC,CACH,CAAC,EACM,CAAE,UAAS,QAAO,OAAQ,EAAK,eAAgB,OAAQ,EAAK,MAAO,CAC5E,CAEA,SAAS,GAAY,EAAmB,CAEtC,OADI,GAAK,QAAoB,IAAI,EAAK,QAAA,CAAc,QAAQ,CAAC,EAAE,KACxD,GAAG,KAAK,MAAM,EAAI,IAAI,EAAE,IACjC,CAEA,SAAgB,EAAU,CAAE,OAAM,OAAM,YAAW,aAAY,SAAQ,WAAU,eAAc,mBAAmC,CAChI,IAAM,EAAO,EAAgB,CAAI,EAC3B,GAAA,EAAQ,EAAA,QAAA,KAAc,EAAU,CAAI,EAAG,CAAC,CAAI,CAAC,EAC7C,CAAC,GAAS,IAAA,EAAc,EAAA,SAAA,CAAS,EAAK,EACtC,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,CAAC,EAChC,CAAC,GAAS,IAAA,EAAc,EAAA,SAAA,CAAwB,IAAI,EACpD,GAAA,EAAU,EAAA,OAAA,CAAyB,IAAI,EACvC,GAAA,EAAS,EAAA,MAAA,CAAM,EAEf,EAAO,IAAW,QAAU,EAAM,MAAQ,EAAM,QAChD,EAAU,CAAC,IAAW,EAAK,OAAA,IAC3B,EAAU,EAAU,EAAK,MAAM,EAAG,CAAS,EAAI,EAE/C,GAAA,EAAc,EAAA,QAAA,KAAc,EAAQ,SAAS,EAAG,IAAO,EAAE,OAAS,OAAS,CAAC,EAAI,CAAC,CAAC,CAAE,EAAG,CAAC,CAAO,CAAC,GAEtG,EAAA,EAAA,UAAA,KAAgB,CACd,EAAU,CAAC,EACX,EAAW,IAAI,EACf,EAAW,EAAK,CAClB,EAAG,CAAC,EAAM,CAAM,CAAC,EAEjB,IAAM,EAAiB,EAAY,KAAK,IAAI,EAAQ,KAAK,IAAI,EAAG,EAAY,OAAS,CAAC,CAAC,IAAM,GACvF,EAAY,GAAkB,EAAI,EAAQ,GAAkB,IAAA,GAC5D,EAAe,GAAa,EAAU,OAAS,OAAS,EAAU,OAAS,KAC3E,EAAU,GAAgB,GAAG,EAAO,GAAG,KAE7C,EAAA,EAAA,UAAA,KAAgB,CACV,IAAiB,MAErB,SADoB,eAAe,EAAO,EAAa,GAAG,CAC1D,CAAA,EAAI,iBAAiB,CAAE,MAAO,SAAU,CAAC,CAE3C,EAAG,CAAC,GAAc,GAAG,CAAC,EAEtB,IAAM,EAAS,GAA4C,CACzD,GAAI,EAAE,SAAW,EAAE,cAAe,OAClC,IAAM,EAAO,EAAY,OAAS,EAC5B,EAAM,GAAc,CACxB,EAAE,eAAe,EACjB,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,EAAM,CAAC,CAAC,CAAC,CAC1C,EACA,OAAQ,EAAE,IAAV,CACE,IAAK,YAAa,EAAG,EAAS,CAAC,EAAG,MAClC,IAAK,UAAW,EAAG,EAAS,CAAC,EAAG,MAChC,IAAK,WAAY,EAAG,EAAS,CAAI,EAAG,MACpC,IAAK,SAAU,EAAG,EAAS,CAAI,EAAG,MAClC,IAAK,OAAQ,EAAG,CAAC,EAAG,MACpB,IAAK,MAAO,EAAG,CAAI,EAAG,MACtB,IAAK,QACC,IACF,EAAE,eAAe,EACjB,EAAW,CAAY,EAK7B,CACF,EAEM,EAAc,GAAmB,EAAS,OAAQ,GAAM,EAAE,OAAS,EAAO,MAAQ,EAAE,OAAS,EAAO,IAAI,EACxG,GAAgB,EAAgB,IAAqB,CACzD,IAAM,EAAK,EAAY,QAAQ,CAAQ,EACnC,GAAM,GAAG,EAAU,CAAE,EACzB,EAAW,CAAM,CACnB,EACM,MAAoB,CACxB,EAAW,IAAI,EACf,EAAQ,SAAS,MAAM,CACzB,EAeA,OAbI,EAAM,QAAU,EAAK,SAAW,GAC3B,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAc,SAAA,UAAU,KAAK,EAAM,MAAM,EAAI,kCAAoC,EAAM,MAAU,CAAA,EAE3H,EAAK,SAAW,GAEhB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAClB,SAAA,EAAM,SAAW,UAAY,mCAAqC,gDAClE,CAAA,GAOL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAvB,SAAA,CACG,GACC,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAW,KAAK,OAArC,SAAA,CAA4C,2BACjB,EAAa,OAAO,GAAY,CAAU,IAAM,GAAG,8CAC3E,CACD,CAAA,EAAA,MACJ,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,IAAK,EACL,KAAK,OACL,UAAW,EAAO,KAClB,cAAa,EACb,SAAU,EACV,aAAY,cAAc,EAAK,wDAC/B,wBAAuB,EAAe,EAAO,EAAa,GAAG,EAAI,IAAA,GACjE,gBAAe,EAAQ,OACvB,UAAW,EAEX,UAAA,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SACG,EAAQ,KAAK,EAAK,IAAU,CAC3B,GAAI,EAAI,OAAS,OACf,OACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAkB,UAAW,EAAO,QAClC,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAa,UAAS,UAAW,EAAO,SAAU,KAAK,WACpD,SAAA,EAAI,KACH,CAAA,CACF,EAJK,EAAI,GAIT,EAGR,IAAM,EAAW,IAAU,EAGrB,EAAS,EAAI,OAAS,QAAU,EAAI,MAAQ,EAAI,KAAK,OAAS,OAAS,EAAI,MAC7E,CAAC,GAAG,EAAW,EAAI,MAAM,EAAG,GAAG,EAAW,EAAU,EAAI,KAAM,EAAI,GAAG,CAAC,CAAC,EACvE,EAAW,EAAI,MAAM,EACnB,EAAY,IAAS,MAAQ,EAAI,OAAO,IAC9C,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,CACG,EAAI,OAAS,QACZ,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,QAAS,YAAW,EAAI,KAAK,KAAM,cAAa,EAAW,OAAS,IAAA,GAA1F,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,GAAI,cAAY,OAAQ,SAAA,EAAI,KAAK,WAAa,EAAO,CAAA,GAC3E,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,GAAI,cAAY,OAAQ,SAAA,EAAI,KAAK,WAAa,EAAO,CAAA,GAC3E,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,OACpB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,YAAe,EAAa,EAAI,OAAQ,CAAK,EAAG,KAAM,EAAI,OAAO,IAAO,CAAA,CACjF,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,OAAQ,cAAY,OACvC,SAAA,EAAI,KAAK,OAAS,MAAQ,IAAM,EAAI,KAAK,OAAS,MAAQ,IAAM,EAC/D,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAO,EAAI,GAAG,EAAG,KAAK,WAAW,UAAW,EAAO,KAAM,aAAY,EAAU,EAAI,IAAI,EAC7F,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAM,EAAI,KAAK,KAAY,OAAM,SAAU,EAAI,SAAU,KAAM,EAAI,KAAK,IAAO,CAAA,CACnF,CAAA,CACF,CAEJ,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,QAAS,YAAU,OAAO,cAAa,EAAW,OAAS,IAAA,GAAjF,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,GAAI,cAAY,OAAQ,SAAA,EAAI,MAAM,WAAa,EAAO,CAAA,GAC5E,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KAAM,YAAW,EAAI,MAAM,MAAQ,QACtD,SAAA,EAAI,MAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAM,EAAI,KAAK,KAAY,OAAM,SAAU,EAAI,aAAc,KAAM,EAAI,KAAK,IAAO,CAAA,EAAI,IACvG,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,OACpB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,YAAe,EAAa,EAAI,OAAQ,CAAK,EAAG,KAAM,EAAI,OAAO,IAAO,CAAA,CACjF,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,GAAI,cAAY,OAAQ,SAAA,EAAI,OAAO,WAAa,EAAO,CAAA,GAC7E,EAAA,EAAA,IAAA,CAAC,KAAD,CACE,GAAI,EAAO,EAAI,GAAG,EAClB,KAAK,WACL,UAAW,EAAO,KAClB,YAAW,EAAI,OAAO,MAAQ,QAC9B,aAAY,CAAC,EAAI,KAAO,EAAU,EAAI,IAAI,EAAI,KAAM,EAAI,OAAS,EAAI,QAAU,EAAI,KAAO,EAAU,EAAI,KAAK,EAAI,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI,EAE/I,SAAA,EAAI,OAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAM,EAAI,MAAM,KAAY,OAAM,SAAU,EAAI,cAAe,KAAM,EAAI,MAAM,IAAO,CAAA,EAAI,IAC3G,CAAA,CACF,CAEL,CAAA,EAAA,EAAO,OAAS,GAAK,GACpB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,UACpB,UAAA,EAAA,EAAA,KAAA,CAAC,KAAD,CAAa,UAAS,KAAK,WAA3B,SAAA,CACG,EAAO,IAAK,IACX,EAAA,EAAA,KAAA,CAAC,MAAD,CAAgB,UAAW,EAAO,QAAlC,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAxB,SAAA,CACG,EAAE,OAAS,MAAQ,eAAiB,OAAO,IAAE,EAAE,IAC5C,KACN,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAc,SAAA,EAAE,IAAQ,CAAA,GAC7C,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,cAAe,YAAe,EAAgB,EAAE,EAAE,EAAG,aAAY,8BAA8B,EAAE,OAAQ,SAAA,QAEzI,CAAA,CACL,CARK,EAAA,EAAE,EAQP,CACN,EACA,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,EAAI,OACZ,SAAU,EACV,OAAS,GAAS,CAChB,EAAa,CAAE,OAAM,KAAM,EAAI,OAAO,KAAM,KAAM,EAAI,OAAO,KAAM,MAAK,CAAC,EACzE,EAAY,CACd,CACD,CAAA,EACC,IACF,GACF,CAAA,EACF,IACQ,CAAA,EA/DK,EAAI,GA+DT,CAElB,CAAC,CACI,CAAA,CACF,CAAA,EACN,GACC,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,QAAS,YAAe,EAAW,EAAI,EAA/E,SAAA,CAAkF,YACtE,EAAY,EAAK,MAAM,EAAE,QAC7B,CACN,CAAA,EAAA,IACD,GAET,CAEA,SAAS,EAAa,CAAE,YAAqC,CAC3D,OAAO,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAG,UAAW,CAAA,CACvB,CAEA,SAAS,EAAU,EAAwB,CACzC,IAAM,EAAI,EAAK,OAAS,MAAQ,EAAK,UAAY,EAAK,UAChD,EAAO,EAAK,OAAS,MAAQ,QAAU,EAAK,OAAS,MAAQ,UAAY,YAC/E,MAAO,QAAQ,GAAK,IAAI,IAAI,EAAK,IAAI,EAAK,MAC5C,CAEA,SAAS,EAAU,CAAE,UAAS,QAA+C,CAC3E,OACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,UAAW,SAAU,GAAa,UAAS,aAAY,yBAAyB,IACtH,MAAO,yBAAyB,IAAQ,SAAA,GAElC,CAAA,CAEZ,CAEA,SAAS,EAAK,CAAE,OAAM,OAAM,WAAU,QAAuG,CAC3I,IAAM,EAAS,EAAa,EAAM,CAAI,EACtC,GAAI,CAAC,GAAY,IAAS,UACxB,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SACrB,SAAA,EAAO,KAAK,EAAG,KACd,EAAA,EAAA,IAAA,CAAC,OAAD,CAAc,UAAW,EAAO,OAAO,EAAE,QAAU,SAAA,EAAE,IAAW,EAArD,CAAqD,CACjE,CACG,CAAA,EAIV,GAAM,CAAC,EAAM,GAAM,EACb,EAA4D,CAAC,EAC/D,EAAK,EACT,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAQ,EACR,EAAM,EAAK,EAAE,KAAK,OAClB,EAAO,CAAC,EAAO,KAAK,IAAI,EAAO,KAAK,IAAI,EAAK,CAAI,CAAC,EAAG,KAAK,IAAI,EAAO,KAAK,IAAI,EAAK,CAAE,CAAC,EAAG,CAAG,EAClG,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAM,EAAI,EAAK,GACT,EAAI,EAAK,EAAI,GACf,EAAI,GAAG,EAAM,KAAK,CAAE,KAAM,EAAK,MAAM,EAAG,CAAC,EAAG,KAAM,EAAE,KAAM,GAAI,IAAM,CAAE,CAAC,CAC7E,CACA,EAAK,CACP,CACA,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SACrB,SAAA,EAAM,KAAK,EAAG,KACb,EAAA,EAAA,IAAA,CAAC,OAAD,CAAc,UAAW,GAAG,EAAO,OAAO,EAAE,SAAW,GAAG,GAAG,EAAE,GAAK,EAAO,GAAK,KAAO,SAAA,EAAE,IAAW,EAAzF,CAAyF,CACrG,CACG,CAAA,CAEV,CAEA,SAAS,EAAc,CAAE,SAAQ,SAAQ,YAAsF,CAC7H,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAE,EAC7B,GAAA,EAAM,EAAA,OAAA,CAA4B,IAAI,EACtC,GAAA,EAAK,EAAA,MAAA,CAAM,GACjB,EAAA,EAAA,UAAA,KAAgB,CACd,EAAI,SAAS,MAAM,CACrB,EAAG,CAAC,CAAC,EACL,IAAM,MAAa,CACb,EAAK,KAAK,GAAG,EAAO,EAAK,KAAK,CAAC,CACrC,EACA,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,QAAS,EAAI,UAAW,EAAO,YAAtC,SAAA,CAAmD,cACrC,EAAO,OAAS,MAAQ,eAAiB,OAAO,IAAE,EAAO,IAChE,KACP,EAAA,EAAA,IAAA,CAAC,WAAD,CACM,KACC,MACL,UAAW,EAAO,YAClB,KAAM,EACN,MAAO,EACP,SAAW,GAAM,EAAQ,EAAE,OAAO,KAAK,EACvC,UAAY,GAAM,CACZ,EAAE,MAAQ,UAAY,EAAE,SAAW,EAAE,UACvC,EAAE,eAAe,EACjB,EAAK,GACI,EAAE,MAAQ,WACnB,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAClB,EAAS,EAEb,EACA,YAAY,2BACZ,UAAW,GACZ,CAAA,GACD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAY,SAAA,4BAAgC,CAAA,GACpE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,WAAY,QAAS,EAAU,SAAA,QAE/D,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,WAAY,QAAS,EAAM,SAAU,CAAC,EAAK,KAAK,EAAG,SAAA,cAEnF,CAAA,CACL,GACF,GAET,CCzWA,IAAM,EAAkB,IAsBxB,SAAS,EAAS,EAAsB,CACtC,IAAM,EAAQ,EAAK,QAAQ,UAAW,EAAE,CAAC,CAAC,MAAM,OAAO,EACvD,OAAO,EAAM,EAAM,OAAS,IAAM,CACpC,CAEA,SAAS,EAAY,EAA4C,CAC/D,OAAO,IAAU,SAAW,SAAW,SACzC,CAEA,SAAgB,EAAS,CAAE,QAAO,UAAS,YAAW,iBAAgB,UAAS,YAAY,IAAmD,CAC5I,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAwB,EAAM,IAAM,IAAI,EAC1D,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAA2B,SAAS,EACxD,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAwB,IAAI,EAC9C,CAAC,EAAQ,KAAA,EAAa,EAAA,SAAA,CAAsB,SAAS,EACrD,CAAC,EAAS,IAAA,EAAW,EAAA,SAAA,CAAoB,CAAE,MAAO,MAAO,CAAC,EAC1D,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAqB,CAAE,MAAO,MAAO,CAAC,EAC1D,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAA0B,CAAC,CAAC,EACtD,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAS,EAAE,EACrC,CAAC,GAAW,KAAA,EAAgB,EAAA,SAAA,CAAS,CAAC,EACtC,CAAC,EAAM,KAAA,EAAW,EAAA,SAAA,CAAS,EAAI,EAC/B,GAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,GAAA,EAAa,EAAA,OAAA,CAAO,IAAI,GAA8C,EACtE,IAAA,EAAU,EAAA,OAAA,CAAyB,IAAI,EACvC,IAAA,EAAgB,EAAA,OAAA,CAAO,CAAC,EACxB,IAAA,EAAe,EAAA,OAAA,CAAsB,IAAI,EACzC,GAAA,EAAS,EAAA,MAAA,CAAM,EACf,IAAA,EAAS,EAAA,MAAA,CAAM,GAGrB,EAAA,EAAA,UAAA,KAAgB,EACV,IAAS,MAAQ,CAAC,EAAM,SAAS,CAAI,IAAG,EAAQ,EAAM,IAAM,IAAI,CACtE,EAAG,CAAC,EAAO,CAAI,CAAC,GAGhB,EAAA,EAAA,UAAA,KAAgB,CACT,GAAW,GAAa,UAAY,EAAQ,QACjD,GAAa,QAAU,EAAQ,MAC/B,EAAQ,EAAQ,IAAI,EACpB,EAAS,EAAQ,KAAK,EACtB,EAAQ,EAAQ,MAAQ,IAAI,EAC9B,EAAG,CAAC,CAAO,CAAC,GAGZ,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAK,EAAQ,QACnB,GAAI,CAAC,GAAM,OAAO,eAAmB,IAAa,OAClD,IAAM,EAAK,IAAI,eAAgB,GAAY,CACzC,IAAM,EAAI,EAAQ,EAAE,EAAE,YAAY,OAAS,EAC3C,GAAQ,GAAK,CAAe,CAC9B,CAAC,EAED,OADA,EAAG,QAAQ,CAAE,MACA,EAAG,WAAW,CAC7B,EAAG,CAAC,CAAC,GAGL,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,GAAW,IAAS,KAAM,OAC/B,IAAM,EAAa,IAAI,gBACjB,EAAM,GAAG,EAAK,IAAI,EAAY,CAAK,IAiBzC,OAhBA,EAAW,QAAQ,MAAM,EAGzB,EAAS,GAAU,EAAK,QAAU,SAAW,EAAK,MAAQ,EAAM,EAAO,CAAE,MAAO,SAAU,CAAE,EAC5F,EAAU,EAAM,EAAY,CAAK,EAAG,KAAM,EAAW,MAAM,CAAC,CACzD,KAAM,GAAS,CACT,EAAW,OAAO,SAAS,EAAQ,CAAE,MAAO,QAAS,OAAM,KAAI,CAAC,CACvE,CAAC,CAAC,CACD,MAAO,GAAiB,CACnB,EAAW,OAAO,UAClB,EAAkB,CAAG,EAAG,EAAQ,CAAE,MAAO,YAAa,CAAC,GAEzD,QAAQ,KAAK,6BAA8B,CAAG,EAC9C,EAAQ,CAAE,MAAO,QAAS,QAAS,EAAiB,CAAG,CAAE,CAAC,GAE9D,CAAC,MACU,EAAW,MAAM,CAChC,EAAG,CAAC,EAAM,EAAO,EAAS,GAAW,CAAS,CAAC,EAK/C,IAAM,GAAa,IAAS,KAAO,GAAK,GAAG,EAAK,IAAI,EAAY,CAAK,IAC/D,GAAA,EAAkB,EAAA,QAAA,KACf,EAAQ,QAAU,SAAW,EAAQ,MAAQ,GAAa,CAAE,MAAO,SAAU,EAAI,EACxF,CAAC,EAAS,EAAU,CACtB,EAEM,GAAA,EAAuB,EAAA,QAAA,KAAc,CACzC,GAAI,EAAK,QAAU,QAAS,MAAO,CAAC,EACpC,GAAI,IAAU,OAAQ,OAAO,EAAK,KAAK,MAAM,IAAK,IAAO,CAAE,KAAM,EAAG,QAAS,EAAM,EAAE,EACrF,IAAM,EAAU,EAAU,OAAQ,GAAM,EAAE,OAAS,CAAI,CAAC,CAAC,IAAK,GAAM,EAAE,IAAI,EACpE,EAAS,IAAI,IAAI,EAAK,KAAK,MAAM,IAAK,GAAM,CAAC,EAAE,KAAM,CAAC,CAAC,CAAC,EAC9D,MAAO,CAAC,GAAG,IAAI,IAAI,CAAO,CAAC,CAAC,CAAC,IAAK,GAAS,CACzC,IAAM,EAAS,EAAO,IAAI,CAAI,EAC9B,OAAO,EACH,CAAE,KAAM,EAAQ,QAAS,EAAM,EAC/B,CAAE,KAAM,CAAE,OAAM,QAAS,KAAM,OAAQ,IAAc,UAAW,EAAG,UAAW,EAAG,OAAQ,EAAM,EAAG,QAAS,EAAK,CACtH,CAAC,CACH,EAAG,CAAC,EAAM,EAAO,EAAW,CAAI,CAAC,EAG3B,GAAA,EAAS,EAAA,QAAA,KAAc,EAAW,EAAQ,IAAK,GAAM,EAAE,IAAI,CAAC,EAAG,CAAC,CAAO,CAAC,EACxE,GAAA,EAAa,EAAA,QAAA,KAAc,CAC/B,IAAM,EAAS,IAAI,IAAI,EAAQ,IAAK,GAAM,CAAC,EAAE,KAAK,KAAM,CAAC,CAAC,CAAC,EAC3D,OAAO,EAAO,QAAS,GAAM,EAAE,MAAM,IAAK,GAAM,EAAO,IAAI,EAAE,IAAI,CAAE,CAAC,CAAC,CAAC,OAAQ,GAAM,CAAC,EAAE,OAAO,CAChG,EAAG,CAAC,EAAQ,CAAO,CAAC,GAGpB,EAAA,EAAA,UAAA,KAAgB,CACV,EAAK,QAAU,UACf,IAAS,MAAQ,EAAW,KAAM,GAAM,EAAE,KAAK,OAAS,CAAI,GAChE,EAAQ,EAAW,EAAE,EAAE,KAAK,MAAQ,IAAI,EAC1C,EAAG,CAAC,EAAM,EAAY,CAAI,CAAC,GAG3B,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,GAAW,IAAS,MAAQ,IAAS,MAAQ,EAAK,QAAU,QAAS,CACxE,EAAS,CAAE,MAAO,MAAO,CAAC,EAC1B,MACF,CACA,IAAM,EAAQ,EAAW,KAAM,GAAM,EAAE,KAAK,OAAS,CAAI,EACzD,GAAI,CAAC,EAAO,OACZ,IAAM,EAAM,GAAG,EAAY,CAAK,EAAE,IAAI,IAChC,EAAM,EAAW,QAAQ,IAAI,CAAG,EACtC,GAAI,EAAK,CACP,EAAS,CAAG,EACZ,MACF,CACA,GAAI,EAAM,KAAK,OAAQ,CACrB,EAAS,CAAE,MAAO,QAAS,KAAM,GAAI,UAAW,GAAO,WAAY,IAAK,CAAC,EACzE,MACF,CACA,IAAM,EAAa,IAAI,gBAcvB,OAbA,EAAS,CAAE,MAAO,SAAU,CAAC,EAC7B,EAAU,EAAM,EAAY,CAAK,EAAG,EAAM,EAAW,MAAM,CAAC,CACzD,KAAM,GAAS,CACd,GAAI,EAAW,OAAO,QAAS,OAC/B,IAAM,EAAQ,CAAE,MAAO,QAAkB,KAAM,EAAK,OAAO,MAAQ,GAAI,UAAW,EAAK,OAAO,WAAa,GAAO,WAAY,EAAK,YAAc,IAAK,EACtJ,EAAW,QAAQ,IAAI,EAAK,CAAK,EACjC,EAAS,CAAK,CAChB,CAAC,CAAC,CACD,MAAO,GAAiB,CACnB,EAAW,OAAO,UACtB,QAAQ,KAAK,8BAA+B,CAAG,EAC/C,EAAS,CAAE,MAAO,QAAS,QAAS,EAAiB,CAAG,CAAE,CAAC,EAC7D,CAAC,MACU,EAAW,MAAM,CAChC,EAAG,CAAC,EAAM,EAAO,EAAM,EAAS,EAAM,EAAY,CAAS,CAAC,EAG5D,IAAM,IAAA,EAAa,EAAA,YAAA,CAAa,GAAiC,CAC/D,EAAa,GAAS,CAAC,GAAG,EAAM,CAAE,GAAG,EAAG,GAAI,IAAI,GAAc,WAAY,CAAC,CAAC,EAC5E,EAAY,yBAAyB,EAAE,KAAK,EAAE,CAChD,EAAG,CAAC,CAAC,EACC,IAAA,EAAgB,EAAA,YAAA,CAAa,GAAe,CAChD,EAAa,GAAS,EAAK,OAAQ,GAAM,EAAE,KAAO,CAAE,CAAC,EACrD,EAAY,kBAAkB,CAChC,EAAG,CAAC,CAAC,EACC,OAAqB,CACrB,EAAS,SAAW,IACxB,EAAe,GAAkB,CAAQ,CAAC,EAC1C,EAAY,SAAS,EAAS,OAAO,GAAG,EAAS,SAAW,EAAI,UAAY,WAAW,iBAAiB,EACxG,EAAY,CAAC,CAAC,EAChB,EAGM,GAAa,GAA4C,CAC7D,GAAI,EAAW,SAAW,EAAG,OAC7B,IAAM,EAAK,EAAW,UAAW,GAAM,EAAE,KAAK,OAAS,CAAI,EACvD,EAAO,EACX,GAAI,EAAE,MAAQ,YAAa,EAAO,KAAK,IAAI,EAAW,OAAS,EAAG,EAAK,CAAC,OACnE,GAAI,EAAE,MAAQ,UAAW,EAAO,KAAK,IAAI,EAAG,EAAK,CAAC,OAClD,GAAI,EAAE,MAAQ,OAAQ,EAAO,OAC7B,GAAI,EAAE,MAAQ,MAAO,EAAO,EAAW,OAAS,OAChD,OACL,EAAE,eAAe,EACjB,IAAM,EAAO,EAAW,EAAK,CAAE,KAAK,KACpC,EAAQ,CAAI,EACZ,IAAM,EAAU,OAAO,IAAQ,KAAe,OAAO,IAAI,QAAW,WAAa,IAAI,OAAO,CAAI,EAAI,EAAK,QAAQ,SAAU,MAAM,EACjI,GAAQ,SAAS,cAA2B,eAAe,EAAQ,GAAG,CAAC,EAAE,iBAAiB,CAAE,MAAO,SAAU,CAAC,CAChH,EAIM,GAAe,CACnB,CAAE,MAAO,OAAiB,MAAO,YAAa,SAF9B,EAAU,OAAQ,GAAM,EAAE,OAAS,CAAI,CAAC,CAAC,SAEa,CAAE,EACxE,CAAE,MAAO,UAAoB,MAAO,aAAc,EAClD,CAAE,MAAO,SAAmB,MAAO,QAAS,CAC9C,EACM,GAAgB,CACpB,CAAE,MAAO,UAAoB,MAAO,SAAU,EAC9C,CAAE,MAAO,QAAkB,MAAO,OAAQ,CAC5C,EACM,GAA+B,IAAW,SAAW,CAAC,EAAO,UAAY,EACzE,EAAS,EAAQ,QACpB,EAAK,IAAO,EAAE,QAAU,EAAM,CAAE,MAAO,EAAI,MAAQ,EAAG,UAAW,EAAI,UAAY,EAAE,KAAK,UAAW,UAAW,EAAI,UAAY,EAAE,KAAK,SAAU,EAChJ,CAAE,MAAO,EAAG,UAAW,EAAG,UAAW,CAAE,CACzC,EACM,EAAO,EAAK,QAAU,QAAU,EAAK,KAAK,KAAO,KACjD,GAAe,EAAS,OAAQ,GAAM,EAAE,OAAS,CAAI,EACrD,MAAgB,GAAc,GAAM,EAAI,CAAC,EAW/C,OATI,EAAM,SAAW,GAAK,IAAS,MAE/B,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,IAAK,EAChC,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAA,GAAQ,MAAM,sBACxB,KAAK,4FAA8F,CAAA,CAClG,CAAA,GAKP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,IAAK,EAAS,YAAW,EAAO,OAAS,QAAtE,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,GAAG,EAAO,OAAO,GAAG,EAAO,OAA9C,SAAA,CACG,EAAM,OAAS,GACd,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,SAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,eAAgB,SAAA,YAAgB,CAAA,GACxD,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,GAAI,GAAQ,MAAO,EAAM,SAAW,GAAM,CAAE,EAAQ,EAAE,OAAO,KAAK,EAAG,EAAQ,IAAI,CAAG,EAAG,UAAW,EAAO,OAAQ,MAAO,EAC7H,SAAA,EAAM,IAAK,IACV,EAAA,EAAA,IAAA,CAAC,SAAD,CAAgB,MAAO,EAAI,SAAA,EAAS,CAAC,CAAU,EAAlC,CAAkC,CAChD,CACK,CAAA,CACH,CAEP,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,WAAY,MAAO,EAAO,SAAA,EAAS,CAAI,CAAQ,CAAA,GAE5F,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAW,iBACX,KAAK,KACL,QAAS,GACT,MAAO,EACP,SAAW,GAAS,CAAE,EAAS,CAAI,EAAG,EAAQ,IAAI,CAAG,CACtD,CAAA,GACD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,aAAW,cACX,KAAK,KACL,QAAS,GAAc,IAAK,GAAO,EAAE,QAAU,SAAW,CAAC,EAAO,CAAE,GAAG,EAAG,SAAU,EAAK,EAAI,CAAE,EAC/F,MAAO,GACP,SAAU,EACX,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,CAAA,EAAG,aAAW,kBAAkB,MAAM,kBAAkB,QAAS,CAAU,CAAA,CAClI,GACC,KAER,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,QAClB,SAAA,EAAK,QAAU,QACd,EAAO,QAAU,GACf,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAc,EAAO,CAAI,CAAQ,CAAA,GAExC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,aAAY,EAAc,EAAO,MAAO,EAAO,UAAW,EAAO,SAAS,EAAhF,SAAA,CACG,EAAY,EAAO,KAAK,EAAE,IAAE,EAAO,QAAU,EAAI,OAAS,QAAQ,OAAG,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAxB,SAAA,CAA6B,IAAE,EAAY,EAAO,SAAS,CAAQ,IAAE,KAC3I,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAxB,SAAA,CAA8B,IAAU,EAAY,EAAO,SAAS,CAAQ,IAC3E,IAAU,UAAY,GAAO,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CAAE,aAAS,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAM,SAAA,CAAW,CAAA,CAAG,CAAA,CAAA,EAAI,KACxF,IAAU,UAAY,eAAiB,IACpC,CAEN,CAAA,EAAA,EAAK,QAAU,WAAa,EAAK,QAAU,QAC7C,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,SAAA,kBAAsB,CAAA,EACnD,IACH,CAAA,EAEF,EAAK,QAAU,cACd,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAA,GAAQ,MAAM,uBACxB,KAAM,GAAG,EAAS,CAAI,EAAE,0GAA6G,CAAA,EACrI,EAAK,QAAU,SACjB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAA,GAAQ,KAAK,QAAQ,MAAM,6BAA6B,KAAM,EAAK,QAC7E,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,KAAK,QAAQ,SAAS,QAAS,EAAS,SAAA,WAAiB,CAAA,CAAI,CAAA,EAClF,EAAK,QAAU,QAMf,EAAQ,SAAW,GAErB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAc,SAAA,EAAc,CAAK,CAAK,CAAA,GAE3D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAO,aAAW,gBACvC,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CACE,IAAK,GACL,GAAI,EACJ,KAAK,UACL,aAAW,gBACX,UAAW,EAAO,SAClB,SAAU,EACV,wBAAuB,EAAO,GAAG,EAAO,GAAG,mBAAmB,CAAI,IAAM,IAAA,GACxE,UAAW,GAEV,SAAA,EAAO,IAAK,IACX,EAAA,EAAA,KAAA,CAAC,KAAD,CAA2B,KAAK,eAAe,UAAW,EAAO,MAAjE,SAAA,CAGG,EAAM,KAAM,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,KAAK,eAAe,MAAO,GAAG,EAAM,IAAI,GAArE,SAAA,CAA0E,EAAM,IAAI,IAAE,GAAe,CAAI,CAAA,EAAA,MACtH,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,KAAK,eAAe,UAAW,EAAO,WACvC,SAAA,EAAM,MAAM,IAAK,GAAM,CACtB,IAAM,EAAU,EAAQ,KAAM,GAAM,EAAE,KAAK,OAAS,EAAE,IAAI,CAAC,EAAE,SAAW,GAClE,EAAW,EAAE,OAAS,EACtB,EAAQ,EAAS,OAAQ,GAAM,EAAE,OAAS,EAAE,IAAI,CAAC,CAAC,OACxD,OACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAEE,GAAI,GAAG,EAAO,GAAG,mBAAmB,EAAE,IAAI,IAC1C,YAAW,EAAE,KACb,KAAK,SACL,gBAAe,EACf,gBAAe,GAAW,IAAA,GAC1B,UAAW,EAAO,KAClB,cAAa,EAAE,OACf,YAAe,CAAO,GAAS,EAAQ,EAAE,IAAI,CAAG,EAChD,MAAO,EAAE,QAAU,GAAG,EAAE,QAAQ,KAAK,EAAE,OAAS,EAAE,KAVpD,SAAA,EAYE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAY,aAAY,EAAiB,EAAE,QAAU,SAAA,EAAE,MAAa,CAAA,GAC5F,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAW,SAAA,EAAE,IAAW,CAAA,EAC/C,EAAQ,GAAI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAc,aAAY,GAAG,EAAM,GAAG,IAAU,EAAI,UAAY,aAAe,SAAA,CAAY,CAAA,EAAI,KACnI,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAa,SAAA,WAAe,CAAA,EAClD,EAAE,QACJ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAY,SAAA,QAAY,CAAA,GAEhD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAxB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAxB,SAAA,CAA6B,IAAE,EAAY,EAAE,SAAS,CAAQ,IAAC,KAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAxB,SAAA,CAA8B,IAAK,EAAY,EAAE,SAAS,CAAQ,GAC9H,GAEN,CAvBG,EAAA,EAAE,IAuBL,CAER,CAAC,CACC,CAAA,CACF,CAtCK,EAAA,EAAM,KAAO,GAsClB,CACL,CACC,CAAA,CACD,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW,EAAO,UAAW,aAAY,EAAO,aAAa,IAAS,QAC5E,SAAA,IAAS,MACR,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAa,SAAA,+CAAgD,CAAA,EAChF,EAAM,QAAU,WAAa,EAAM,QAAU,QAC/C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAU,cAAY,OAA7C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,CAAA,GACf,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,CAAA,CACZ,CACH,CAAA,EAAA,EAAM,QAAU,SAClB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAY,KAAK,QAAxC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAM,OAAW,CAAA,GACrB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,KAAK,QAAQ,SAAS,QAAS,EAAS,SAAA,WAAiB,CAAA,CACnE,CAEL,CAAA,GAAA,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,UAAW,MAAO,EAAO,SAAA,CAAS,CAAA,EACvD,EAAW,KAAM,GAAM,EAAE,KAAK,OAAS,CAAI,CAAC,EAAE,KAAK,QAClD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAa,SAAA,iCAAkC,CAAA,GAEpE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EACN,KAAM,EAAM,KACZ,UAAW,EAAM,UACjB,WAAY,EAAM,WAClB,OAAQ,GACR,SAAU,GACV,aAAc,GACd,gBAAiB,EAClB,CAAA,CAEH,CAAA,CAAA,CAEG,CAAA,CACN,KAlGL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAU,cAAY,OAA7C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,CAAA,GACf,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,CAAA,GACf,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,CAAA,CACZ,CACH,CAAA,EAgGH,EAAS,OAAS,GACjB,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,KAA1B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAxB,SAAA,CACG,EAAS,OAAO,IAAE,EAAS,SAAW,EAAI,UAAY,WACtD,IAAI,IAAI,EAAS,IAAK,GAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAO,EAAI,OAAO,IAAI,IAAI,EAAS,IAAK,GAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,QAAU,EACxG,KACN,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,WAAY,YAAe,CAAE,EAAY,CAAC,CAAC,EAAG,EAAY,qBAAqB,CAAG,EAAG,SAAA,SAErH,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,WAAY,QAAS,GAAc,SAAA,gBAEnE,CAAA,CACF,CACN,CAAA,EAAA,MACJ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,eAAgB,KAAK,SAAS,YAAU,SAAU,SAAA,CAAY,CAAA,CAChF,GAET,CAGA,SAAS,EAAc,EAAiC,CAGtD,OAFI,IAAU,OAAe,kEACzB,IAAU,UAAkB,0FACzB,0FACT,CAEA,SAAS,EAAc,EAAyB,EAA6B,CAG3E,OAFI,IAAU,OAAe,yCACzB,IAAU,UAAkB,0BACzB,EAAO,sCAAsC,EAAK,GAAK,4BAChE"}
|
|
1
|
+
{"version":3,"file":"DiffPane-Ix6hvXlY.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/git/DiffPane.module.css","../../../../../../src/web-ui/routes/verse/git/PatchView.tsx","../../../../../../src/web-ui/routes/verse/git/DiffPane.tsx"],"sourcesContent":["/*\n * Review pane (SPEC-310C §3). Lives in the dock: 320px to 60% of the window,\n * a sheet below 1024, a bottom sheet below 480 — so the layout answers the\n * PANE's width (a container query), not the window's. Narrow: file list over\n * patch. At 720px+ of pane: list beside patch.\n *\n * Diff tints are the diff's own mixes over --bg-code (as in chat.module.css),\n * and the +/− marker column carries the meaning, never colour alone.\n */\n.pane {\n container-type: inline-size;\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: 100%;\n min-height: 0;\n background: var(--bg-canvas);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n /* Same row tints as the transcript's DiffBlock (chat.module.css), so a\n change looks the same in the chat and in Review; the emphasis mix marks\n the changed span inside a line (git-contrast.test.ts holds text on all four). */\n --diff-add: color-mix(in srgb, var(--status-success-solid) 22%, var(--bg-code));\n --diff-del: color-mix(in srgb, var(--status-danger-solid) 22%, var(--bg-code));\n --diff-add-em: color-mix(in srgb, var(--status-success-solid) 36%, var(--bg-code));\n --diff-del-em: color-mix(in srgb, var(--status-danger-solid) 36%, var(--bg-code));\n}\n\n/* ---- header -------------------------------------------------------------- */\n\n/* Height, padding, border and surface come from ../dock/pane-chrome.module.css\n (the row every dock pane shares); Review only wraps it at narrow widths. */\n.head { flex-wrap: wrap; }\n/* Scoped under .head so it outranks the shared title's size and colour. */\n.head .rootName {\n max-width: 16ch;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.rootPick { display: inline-flex; min-width: 0; }\n.select {\n min-height: var(--control-h-sm);\n max-width: 16ch;\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n}\n.select:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.summary {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n}\n.summary:empty { display: none; }\n.muted { color: var(--text-tertiary); }\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n.ref {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n background: var(--bg-code);\n color: var(--text-primary);\n}\n\n.skeleton {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3);\n}\n\n/* ---- body: list over patch, or beside it --------------------------------- */\n\n.body {\n flex: 1 1 auto;\n min-height: 0;\n display: grid;\n /* Stacked: the list takes what it needs, up to a cap, and the patch the rest. */\n grid-template-rows: auto minmax(0, 1fr);\n overflow: hidden;\n}\n\n.files {\n min-height: 0;\n max-height: min(34vh, 14rem);\n overflow: auto;\n border-bottom: 1px solid var(--border-subtle);\n}\n/* Side by side once the PANE is wide enough. Declared after .files so it wins. */\n@container (min-width: 720px) {\n .body {\n grid-template-rows: none;\n grid-template-columns: minmax(12rem, 30%) minmax(0, 1fr);\n }\n .files { border-bottom: 0; border-right: 1px solid var(--border-subtle); max-height: none; }\n}\n\n.fileList {\n list-style: none;\n margin: 0;\n padding: var(--space-1) 0;\n}\n.fileList:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--border-focus); }\n.group { display: block; }\n.groupFiles { list-style: none; margin: 0; padding: 0; }\n.dir {\n display: block;\n padding: var(--space-2) var(--space-3) var(--space-1);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n}\n.file {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-xs);\n padding: 0 var(--space-3) 0 var(--space-4);\n cursor: pointer;\n border-left: 2px solid transparent;\n}\n.file:hover { background: var(--bg-hover); }\n.file[aria-selected='true'] { background: var(--bg-selected); border-left-color: var(--accent-600); }\n.file[aria-disabled='true'] { cursor: default; color: var(--text-tertiary); }\n.fileStatus {\n flex: none;\n width: 1.4em;\n text-align: center;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-secondary);\n}\n.file[data-status='A'] .fileStatus { color: var(--status-success-fg); }\n.file[data-status='D'] .fileStatus { color: var(--status-danger-fg); }\n.file[data-status='U'] .fileStatus { color: var(--status-warning-fg); }\n.fileName {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n.fileCounts,\n.fileSettled {\n flex: none;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n}\n.fileComments {\n flex: none;\n min-width: 1.5em;\n padding: 0 var(--space-1);\n border-radius: var(--radius-full);\n background: var(--accent-100);\n color: var(--accent-700);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-align: center;\n}\n\n.patchArea {\n min-height: 0;\n min-width: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n.patchPath {\n position: sticky;\n top: 0;\n z-index: 1;\n margin: 0;\n padding: var(--space-2) var(--space-3);\n background: var(--bg-canvas);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n}\n.patchNotice,\n.patchError {\n margin: 0;\n padding: var(--space-4) var(--space-3);\n color: var(--text-secondary);\n}\n.patchError {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-2);\n color: var(--status-danger-fg);\n}\n.patchError > p { margin: 0; }\n.truncated {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n}\n\n/* ---- the patch grid ------------------------------------------------------ */\n\n.patch { min-width: 0; }\n.grid {\n width: 100%;\n border-collapse: collapse;\n table-layout: auto;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n background: var(--bg-code);\n}\n.grid:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--border-focus); }\n\n.hunkRow > td {\n padding: var(--space-1) var(--space-3);\n background: var(--bg-surface);\n color: var(--text-tertiary);\n border-top: 1px solid var(--border-subtle);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-ui);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n}\n\n.lineRow[data-kind='add'] > td { background: var(--diff-add); }\n.lineRow[data-kind='del'] > td { background: var(--diff-del); }\n.half[data-kind='add'] { background: var(--diff-add); }\n.half[data-kind='del'] { background: var(--diff-del); }\n.half[data-kind='empty'] { background: color-mix(in srgb, var(--text-tertiary) 6%, var(--bg-code)); }\n.lineRow[data-active='true'] > td { box-shadow: inset 0 1px 0 var(--border-focus), inset 0 -1px 0 var(--border-focus); }\n\n.no {\n width: 1%;\n min-width: 3.5ch;\n padding: 0 var(--space-2);\n text-align: right;\n /* Real line numbers, read to find the change in an editor: the body floor\n on the code ground, which --text-tertiary misses in light (chat.module.css). */\n color: var(--text-secondary);\n user-select: none;\n white-space: nowrap;\n vertical-align: top;\n}\n.gutter {\n width: 1.6em;\n padding: 0;\n vertical-align: top;\n text-align: center;\n}\n.marker {\n width: 1.2em;\n padding: 0;\n text-align: center;\n color: var(--text-secondary);\n user-select: none;\n vertical-align: top;\n}\n.code,\n.half {\n padding: 0 var(--space-3) 0 var(--space-1);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n word-break: break-word;\n vertical-align: top;\n color: var(--text-primary);\n}\n.grid[data-layout='split'] .half { width: 50%; }\n.codeText { font-family: inherit; }\n.em { border-radius: 2px; }\n.lineRow[data-kind='add'] .em,\n.half[data-kind='add'] .em { background: var(--diff-add-em); }\n.lineRow[data-kind='del'] .em,\n.half[data-kind='del'] .em { background: var(--diff-del-em); }\n\n/* The gutter \"+\" appears on the hovered or active line (the pointer's GitHub habit). */\n.gutterAdd {\n display: inline-grid;\n place-items: center;\n width: 1.3em;\n height: 1.3em;\n margin-top: 1px;\n padding: 0;\n border: 0;\n border-radius: var(--radius-xs);\n background: var(--accent-600);\n color: var(--text-on-accent);\n font: inherit;\n font-weight: var(--font-weight-bold);\n line-height: 1;\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.lineRow:hover .gutterAdd,\n.lineRow[data-active='true'] .gutterAdd,\n.gutterAdd:focus-visible { opacity: 1; }\n\n.tok_plain { color: inherit; }\n/* Secondary, not tertiary: tertiary falls to 3.5:1 on the add tint (git-contrast.test.ts); italics carry \"comment\". */\n.tok_comment { color: var(--text-secondary); font-style: italic; }\n.tok_string { color: var(--status-success-fg); }\n.tok_number { color: var(--status-warning-fg); }\n.tok_keyword { color: var(--accent-700); font-weight: var(--font-weight-medium); }\n\n.showAll {\n margin: var(--space-2) var(--space-3);\n align-self: flex-start;\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n cursor: pointer;\n}\n\n/* ---- comments ------------------------------------------------------------ */\n\n.threadRow > td {\n padding: var(--space-2) var(--space-3);\n background: var(--bg-surface);\n border-top: 1px solid var(--border-subtle);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n white-space: normal;\n}\n.comment {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: baseline;\n gap: var(--space-2);\n padding: var(--space-1) 0;\n}\n.commentWhere {\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n color: var(--text-tertiary);\n font-family: var(--font-display);\n}\n.commentText { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text-primary); }\n.commentRemove,\n.linkButton {\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n}\n.commentRemove:focus-visible,\n.linkButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.editor { display: flex; flex-direction: column; gap: var(--space-2); }\n.editorLabel { font-size: var(--text-xs-size); color: var(--text-secondary); font-weight: var(--font-weight-medium); }\n.editorInput {\n width: 100%;\n box-sizing: border-box;\n min-height: calc(var(--text-sm-line) * 2 + var(--space-4));\n padding: var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n resize: vertical;\n}\n.editorInput:focus-visible { outline: none; border-color: var(--border-focus); box-shadow: var(--shadow-focus-ring); }\n.editorActions { display: flex; align-items: center; gap: var(--space-2); justify-content: flex-end; flex-wrap: wrap; }\n.editorHint { margin-right: auto; font-size: var(--text-xs-size); color: var(--text-tertiary); }\n\n.saveButton {\n min-height: var(--control-h-xs);\n padding: 0 var(--space-3);\n border: 1px solid var(--accent-600);\n border-radius: var(--radius-sm);\n background: var(--accent-600);\n color: var(--text-on-accent);\n font: inherit;\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n cursor: pointer;\n}\n.saveButton:hover { background: var(--accent-700); border-color: var(--accent-700); }\n.saveButton:disabled { opacity: 0.6; cursor: default; }\n.saveButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.foot {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-2) var(--space-3);\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n.footCount { margin-right: auto; color: var(--text-secondary); font-size: var(--text-sm-size); }\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .gutterAdd { transition: none; }\n}\n","/**\n * routes/verse/git/PatchView.tsx — one file's patch in the Review pane,\n * unified or split, with line comments (unit C5; SPEC-310C §3 \"Diff/Review\").\n *\n * Reuses the inbox parser (`parseUnifiedDiff`, `toSplitRows`) and highlighter\n * (`tokenizeLine`) verbatim — the same pieces DiffBlock renders the\n * transcript's inline diffs with — plus `intralineSpans` (chat/line-diff.ts)\n * to emphasise the part of a changed line that changed.\n *\n * KEYBOARD. The patch is ONE tab stop (a grid with an active line, announced\n * through aria-activedescendant — thousands of focusable rows would make Tab\n * useless): ↑ ↓ move a line, PageUp PageDown move twenty, Home End jump,\n * Enter opens a comment on the active line. In the comment box ⌘/Ctrl+Enter\n * saves and Escape cancels, returning focus to the patch. The pointer gets a\n * \"+\" in the gutter of the hovered line, as on GitHub.\n *\n * A patch the server cut at 256 KB says so, and rows past ROW_LIMIT are\n * behind \"Show all\" — every row is DOM.\n */\nimport { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react';\nimport { parseUnifiedDiff, toSplitRows, type DiffLine } from '../../inbox/diff-parser.js';\nimport { languageForPath, tokenizeLine, type LangFamily } from '../../inbox/highlight.js';\nimport { intralineSpans } from '../chat/line-diff.js';\nimport { formatCount, type ReviewComment } from './git-model.js';\nimport styles from './DiffPane.module.css';\n\nexport type PatchLayout = 'unified' | 'split';\n\n/** Rows rendered before \"Show all\". */\nexport const ROW_LIMIT = 3_000;\nconst PAGE = 20;\n\nexport interface PatchViewProps {\n path: string;\n text: string;\n truncated: boolean;\n /** Bytes of the whole patch before the cut (for \"showing 256 KB of 1.2 MB\"). */\n totalBytes: number | null;\n layout: PatchLayout;\n comments: readonly ReviewComment[];\n onAddComment: (c: Omit<ReviewComment, 'id'>) => void;\n onRemoveComment: (id: string) => void;\n}\n\n/** One commentable line, in display order. */\ninterface Anchor {\n key: string;\n line: number;\n side: 'new' | 'old';\n}\n\ntype UnifiedRow =\n | { kind: 'hunk'; key: string; label: string }\n | { kind: 'line'; key: string; line: DiffLine; anchor: Anchor; emphasis: [number, number] | null };\n\ntype SplitRowView =\n | { kind: 'hunk'; key: string; label: string }\n | {\n kind: 'pair';\n key: string;\n left: DiffLine | null;\n right: DiffLine | null;\n anchor: Anchor;\n leftEmphasis: [number, number] | null;\n rightEmphasis: [number, number] | null;\n };\n\nfunction anchorFor(line: DiffLine, key: string): Anchor {\n if (line.kind === 'del') return { key, line: line.oldLineNo ?? 0, side: 'old' };\n return { key, line: line.newLineNo ?? line.oldLineNo ?? 0, side: 'new' };\n}\n\nfunction hunkLabel(header: string, index: number): string {\n const section = header.replace(/^@@[^@]*@@/, '').trim();\n const m = /^@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/.exec(header);\n const where = m ? `line ${m[2]}` : `hunk ${index + 1}`;\n return section ? `${where} · ${section}` : where;\n}\n\nfunction buildRows(text: string): { unified: UnifiedRow[]; split: SplitRowView[]; notice: string | null; status: string } {\n const parsed = parseUnifiedDiff(text);\n const file = parsed.files[0];\n if (!file) return { unified: [], split: [], notice: null, status: 'modified' };\n const unified: UnifiedRow[] = [];\n const split: SplitRowView[] = [];\n file.hunks.forEach((hunk, h) => {\n const label = hunkLabel(hunk.header, h);\n unified.push({ kind: 'hunk', key: `h${h}`, label });\n split.push({ kind: 'hunk', key: `h${h}`, label });\n // Pair each run of deletions with the run of additions after it, for emphasis in both layouts.\n const pairs = toSplitRows(hunk.lines);\n const emphasisOf = new Map<DiffLine, [number, number] | null>();\n for (const p of pairs) {\n if (p.left && p.right && p.left.kind === 'del' && p.right.kind === 'add') {\n const spans = intralineSpans(p.left.text, p.right.text);\n emphasisOf.set(p.left, spans ? spans.old : null);\n emphasisOf.set(p.right, spans ? spans.new : null);\n }\n }\n hunk.lines.forEach((line, i) => {\n const key = `h${h}l${i}`;\n unified.push({ kind: 'line', key, line, anchor: anchorFor(line, key), emphasis: emphasisOf.get(line) ?? null });\n });\n pairs.forEach((p, i) => {\n const key = `h${h}p${i}`;\n const anchorLine = p.right ?? p.left!;\n split.push({\n kind: 'pair',\n key,\n left: p.left,\n right: p.right,\n anchor: anchorFor(anchorLine, key),\n leftEmphasis: p.left ? emphasisOf.get(p.left) ?? null : null,\n rightEmphasis: p.right ? emphasisOf.get(p.right) ?? null : null,\n });\n });\n });\n return { unified, split, notice: file.unparsedNotice, status: file.status };\n}\n\nfunction formatBytes(n: number): string {\n if (n >= 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n return `${Math.round(n / 1024)} KB`;\n}\n\nexport function PatchView({ path, text, truncated, totalBytes, layout, comments, onAddComment, onRemoveComment }: PatchViewProps) {\n const lang = languageForPath(path);\n const built = useMemo(() => buildRows(text), [text]);\n const [showAll, setShowAll] = useState(false);\n const [active, setActive] = useState(0);\n const [editing, setEditing] = useState<Anchor | null>(null);\n const gridRef = useRef<HTMLTableElement>(null);\n const idBase = useId();\n\n const rows = layout === 'split' ? built.split : built.unified;\n const limited = !showAll && rows.length > ROW_LIMIT;\n const visible = limited ? rows.slice(0, ROW_LIMIT) : rows;\n /** Indexes (into `visible`) of commentable rows — what the arrow keys walk. */\n const lineIndexes = useMemo(() => visible.flatMap((r, i) => (r.kind === 'hunk' ? [] : [i])), [visible]);\n\n useEffect(() => {\n setActive(0);\n setEditing(null);\n setShowAll(false);\n }, [text, layout]);\n\n const activeRowIndex = lineIndexes[Math.min(active, Math.max(0, lineIndexes.length - 1))] ?? -1;\n const activeRow = activeRowIndex >= 0 ? visible[activeRowIndex] : undefined;\n const activeAnchor = activeRow && activeRow.kind !== 'hunk' ? activeRow.anchor : null;\n const cellId = (key: string) => `${idBase}-${key}`;\n\n useEffect(() => {\n if (activeAnchor === null) return;\n const el = document.getElementById(cellId(activeAnchor.key));\n el?.scrollIntoView?.({ block: 'nearest' });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeAnchor?.key]);\n\n const onKey = (e: ReactKeyboardEvent<HTMLTableElement>) => {\n if (e.target !== e.currentTarget) return;\n const last = lineIndexes.length - 1;\n const go = (n: number) => {\n e.preventDefault();\n setActive(Math.max(0, Math.min(last, n)));\n };\n switch (e.key) {\n case 'ArrowDown': go(active + 1); break;\n case 'ArrowUp': go(active - 1); break;\n case 'PageDown': go(active + PAGE); break;\n case 'PageUp': go(active - PAGE); break;\n case 'Home': go(0); break;\n case 'End': go(last); break;\n case 'Enter':\n if (activeAnchor) {\n e.preventDefault();\n setEditing(activeAnchor);\n }\n break;\n default:\n break;\n }\n };\n\n const commentsAt = (anchor: Anchor) => comments.filter((c) => c.line === anchor.line && c.side === anchor.side);\n const startComment = (anchor: Anchor, rowIndex: number) => {\n const at = lineIndexes.indexOf(rowIndex);\n if (at >= 0) setActive(at);\n setEditing(anchor);\n };\n const closeEditor = () => {\n setEditing(null);\n gridRef.current?.focus();\n };\n\n if (built.notice && rows.length === 0) {\n return <p className={styles.patchNotice}>{/binary/i.test(built.notice) ? 'Binary file — no lines to show.' : built.notice}</p>;\n }\n if (rows.length === 0) {\n return (\n <p className={styles.patchNotice}>\n {built.status === 'renamed' ? 'Renamed with no content changes.' : 'No line changes (a mode or permission change).'}\n </p>\n );\n }\n\n // Both layouts are five columns: two numbers + gutter + marker + code, or number + half + gutter + number + half.\n const colSpan = 5;\n return (\n <div className={styles.patch}>\n {truncated ? (\n <p className={styles.truncated} role=\"note\">\n Showing the first 256 KB{totalBytes ? ` of ${formatBytes(totalBytes)}` : ''}. Open the file in your editor for the rest.\n </p>\n ) : null}\n <table\n ref={gridRef}\n role=\"grid\"\n className={styles.grid}\n data-layout={layout}\n tabIndex={0}\n aria-label={`Changes in ${path}. Arrow keys move between lines; Enter adds a comment.`}\n aria-activedescendant={activeAnchor ? cellId(activeAnchor.key) : undefined}\n aria-rowcount={visible.length}\n onKeyDown={onKey}\n >\n <tbody>\n {visible.map((row, index) => {\n if (row.kind === 'hunk') {\n return (\n <tr key={row.key} className={styles.hunkRow}>\n <td colSpan={colSpan} className={styles.hunkCell} role=\"gridcell\">\n {row.label}\n </td>\n </tr>\n );\n }\n const isActive = index === activeRowIndex;\n // A split row shows two lines; a comment made on either side (in\n // either layout) belongs under it.\n const thread = row.kind === 'pair' && row.left && row.left.kind === 'del' && row.right\n ? [...commentsAt(row.anchor), ...commentsAt(anchorFor(row.left, row.key))]\n : commentsAt(row.anchor);\n const isEditing = editing?.key === row.anchor.key;\n return (\n <FragmentRows key={row.key}>\n {row.kind === 'line' ? (\n <tr className={styles.lineRow} data-kind={row.line.kind} data-active={isActive ? 'true' : undefined}>\n <td className={styles.no} aria-hidden=\"true\">{row.line.oldLineNo ?? ''}</td>\n <td className={styles.no} aria-hidden=\"true\">{row.line.newLineNo ?? ''}</td>\n <td className={styles.gutter}>\n <AddButton onClick={() => startComment(row.anchor, index)} line={row.anchor.line} />\n </td>\n <td className={styles.marker} aria-hidden=\"true\">\n {row.line.kind === 'add' ? '+' : row.line.kind === 'del' ? '−' : ''}\n </td>\n <td id={cellId(row.key)} role=\"gridcell\" className={styles.code} aria-label={lineLabel(row.line)}>\n <Code text={row.line.text} lang={lang} emphasis={row.emphasis} kind={row.line.kind} />\n </td>\n </tr>\n ) : (\n <tr className={styles.lineRow} data-kind=\"pair\" data-active={isActive ? 'true' : undefined}>\n <td className={styles.no} aria-hidden=\"true\">{row.left?.oldLineNo ?? ''}</td>\n <td className={styles.half} data-kind={row.left?.kind ?? 'empty'}>\n {row.left ? <Code text={row.left.text} lang={lang} emphasis={row.leftEmphasis} kind={row.left.kind} /> : null}\n </td>\n <td className={styles.gutter}>\n <AddButton onClick={() => startComment(row.anchor, index)} line={row.anchor.line} />\n </td>\n <td className={styles.no} aria-hidden=\"true\">{row.right?.newLineNo ?? ''}</td>\n <td\n id={cellId(row.key)}\n role=\"gridcell\"\n className={styles.half}\n data-kind={row.right?.kind ?? 'empty'}\n aria-label={[row.left ? lineLabel(row.left) : null, row.right && row.right !== row.left ? lineLabel(row.right) : null].filter(Boolean).join('; ')}\n >\n {row.right ? <Code text={row.right.text} lang={lang} emphasis={row.rightEmphasis} kind={row.right.kind} /> : null}\n </td>\n </tr>\n )}\n {thread.length > 0 || isEditing ? (\n <tr className={styles.threadRow}>\n <td colSpan={colSpan} role=\"gridcell\">\n {thread.map((c) => (\n <div key={c.id} className={styles.comment}>\n <span className={styles.commentWhere}>\n {c.side === 'old' ? 'Removed line' : 'Line'} {c.line}\n </span>\n <p className={styles.commentText}>{c.note}</p>\n <button type=\"button\" className={styles.commentRemove} onClick={() => onRemoveComment(c.id)} aria-label={`Remove the comment on line ${c.line}`}>\n Remove\n </button>\n </div>\n ))}\n {isEditing ? (\n <CommentEditor\n anchor={row.anchor}\n onCancel={closeEditor}\n onSave={(note) => {\n onAddComment({ path, line: row.anchor.line, side: row.anchor.side, note });\n closeEditor();\n }}\n />\n ) : null}\n </td>\n </tr>\n ) : null}\n </FragmentRows>\n );\n })}\n </tbody>\n </table>\n {limited ? (\n <button type=\"button\" className={styles.showAll} onClick={() => setShowAll(true)}>\n Show all {formatCount(rows.length)} lines\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction FragmentRows({ children }: { children: ReactNode }) {\n return <>{children}</>;\n}\n\nfunction lineLabel(line: DiffLine): string {\n const n = line.kind === 'del' ? line.oldLineNo : line.newLineNo;\n const what = line.kind === 'add' ? 'added' : line.kind === 'del' ? 'removed' : 'unchanged';\n return `Line ${n ?? '—'}, ${what}: ${line.text}`;\n}\n\nfunction AddButton({ onClick, line }: { onClick: () => void; line: number }) {\n return (\n <button type=\"button\" className={styles.gutterAdd} tabIndex={-1} onClick={onClick} aria-label={`Add a comment on line ${line}`}\n title={`Add a comment on line ${line}`}>\n +\n </button>\n );\n}\n\nfunction Code({ text, lang, emphasis, kind }: { text: string; lang: LangFamily; emphasis: [number, number] | null; kind: DiffLine['kind'] }) {\n const tokens = tokenizeLine(text, lang);\n if (!emphasis || kind === 'context') {\n return (\n <code className={styles.codeText}>\n {tokens.map((t, i) => (\n <span key={i} className={styles[`tok_${t.kind}`]}>{t.text}</span>\n ))}\n </code>\n );\n }\n // Split tokens at the emphasis boundaries so highlighting and emphasis compose.\n const [from, to] = emphasis;\n const parts: Array<{ text: string; kind: string; em: boolean }> = [];\n let at = 0;\n for (const t of tokens) {\n const start = at;\n const end = at + t.text.length;\n const cuts = [start, Math.max(start, Math.min(end, from)), Math.max(start, Math.min(end, to)), end];\n for (let c = 0; c < 3; c++) {\n const a = cuts[c]!;\n const b = cuts[c + 1]!;\n if (b > a) parts.push({ text: text.slice(a, b), kind: t.kind, em: c === 1 });\n }\n at = end;\n }\n return (\n <code className={styles.codeText}>\n {parts.map((p, i) => (\n <span key={i} className={`${styles[`tok_${p.kind}`] ?? ''} ${p.em ? styles.em : ''}`}>{p.text}</span>\n ))}\n </code>\n );\n}\n\nfunction CommentEditor({ anchor, onSave, onCancel }: { anchor: Anchor; onSave: (note: string) => void; onCancel: () => void }) {\n const [note, setNote] = useState('');\n const ref = useRef<HTMLTextAreaElement>(null);\n const id = useId();\n useEffect(() => {\n ref.current?.focus();\n }, []);\n const save = () => {\n if (note.trim()) onSave(note.trim());\n };\n return (\n <div className={styles.editor}>\n <label htmlFor={id} className={styles.editorLabel}>\n Comment on {anchor.side === 'old' ? 'removed line' : 'line'} {anchor.line}\n </label>\n <textarea\n id={id}\n ref={ref}\n className={styles.editorInput}\n rows={2}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n save();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n onCancel();\n }\n }}\n placeholder=\"What should change here?\"\n maxLength={4_000}\n />\n <div className={styles.editorActions}>\n <span className={styles.editorHint}>⌘Enter saves · Esc cancels</span>\n <button type=\"button\" className={styles.linkButton} onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className={styles.saveButton} onClick={save} disabled={!note.trim()}>\n Save comment\n </button>\n </div>\n </div>\n );\n}\n","/**\n * routes/verse/git/DiffPane.tsx — the dock's Review pane (unit C5; SPEC-310C\n * §3 \"Diff/Review\"). Mounted by C2 through the `diff-pane` slot with exactly\n * DiffPaneProps.\n *\n * [repo ▾] [This turn | Uncommitted | Branch] [Unified|Split] ⟳\n * 12 files · +340 −20 against main\n * ┌ file list (M/A/D/R/U + ± per file) ┐\n * └ patch of the selected file (lazy, ≤ 256 KB) with \"+\" line comments ┘\n * 2 comments [Add to message]\n *\n * SCOPES\n * This turn the files the chat's latest turn touched (C2 derives them\n * from events), shown with their CURRENT uncommitted diff; a\n * file the turn touched that has since been committed is listed\n * as such rather than silently dropped.\n * Uncommitted working tree against HEAD, untracked files included.\n * Branch everything the branch would ship against its base.\n *\n * PATCHES LOAD LAZILY: the list is one request; a patch is fetched when its\n * file is selected, cached for the life of the listing, and capped by the\n * server at 256 KB. Nothing is fetched while the pane is a background tab\n * (`visible` false) — it catches up when shown.\n *\n * COMMENTS are drafts held here, per file, until \"Add to message\" hands them\n * to the composer as `path:line: note` lines (C2's onAddToMessage; ⌘Enter in\n * the composer sends). They survive switching files and scopes, not a reload.\n *\n * KEYBOARD: the scope and layout switches are radio groups (← →); the file\n * list is a listbox (↑ ↓ Home End select and load); the patch is a grid (see\n * PatchView). Tab moves between those four stops.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { IconRefresh } from '../../../components/primitives/icons.js';\nimport type { VerseGitDiffFile, VerseGitDiffScope, VerseReviewScope } from '../../../data/api-types.js';\nimport type { DiffPaneProps } from '../shell/slots.js';\nimport {\n FILE_STATUS_WORD,\n commentsToMessage,\n describeGitError,\n diffstatLabel,\n formatCount,\n groupFiles,\n type ReviewComment,\n} from './git-model.js';\nimport { fetchGitDiff, isRootUnavailable, type GitDiffView } from './git-queries.js';\nimport { PatchView, type PatchLayout } from './PatchView.js';\nimport chrome from '../dock/pane-chrome.module.css';\nimport styles from './DiffPane.module.css';\n\nexport interface DiffPaneTestProps {\n /** Test seam for the diff reads. */\n fetchDiff?: typeof fetchGitDiff;\n}\n\n/** Below this pane width the split layout is offered but unified is the default. */\nconst SPLIT_MIN_WIDTH = 640;\n\ntype ListState =\n | { state: 'idle' }\n | { state: 'loading' }\n | { state: 'ready'; data: GitDiffView; key: string }\n | { state: 'not-a-repo' }\n | { state: 'error'; message: string };\n\ntype PatchState =\n | { state: 'idle' }\n | { state: 'loading' }\n | { state: 'ready'; text: string; truncated: boolean; totalBytes: number | null }\n | { state: 'error'; message: string };\n\n/** One row of the file list: a real change, or a turn file that is no longer uncommitted. */\ninterface ListEntry {\n file: VerseGitDiffFile;\n /** \"This turn\" only: the turn touched it, but it has no uncommitted change now. */\n settled: boolean;\n}\n\nfunction rootName(root: string): string {\n const parts = root.replace(/[\\\\/]+$/, '').split(/[\\\\/]/);\n return parts[parts.length - 1] || root;\n}\n\nfunction serverScope(scope: VerseReviewScope): VerseGitDiffScope {\n return scope === 'branch' ? 'branch' : 'working';\n}\n\nexport function DiffPane({ roots, request, turnFiles, onAddToMessage, visible, fetchDiff = fetchGitDiff }: DiffPaneProps & DiffPaneTestProps) {\n const [root, setRoot] = useState<string | null>(roots[0] ?? null);\n const [scope, setScope] = useState<VerseReviewScope>('working');\n const [file, setFile] = useState<string | null>(null);\n const [layout, setLayout] = useState<PatchLayout>('unified');\n const [rawList, setList] = useState<ListState>({ state: 'idle' });\n const [patch, setPatch] = useState<PatchState>({ state: 'idle' });\n const [comments, setComments] = useState<ReviewComment[]>([]);\n const [announce, setAnnounce] = useState('');\n const [reloadKey, setReloadKey] = useState(0);\n const [wide, setWide] = useState(true);\n const paneRef = useRef<HTMLDivElement>(null);\n const patchCache = useRef(new Map<string, PatchState & { state: 'ready' }>());\n const listRef = useRef<HTMLUListElement>(null);\n const nextCommentId = useRef(1);\n const handledNonce = useRef<number | null>(null);\n const listId = useId();\n const rootId = useId();\n\n // Keep the chosen root valid as the chat's roots change.\n useEffect(() => {\n if (root === null || !roots.includes(root)) setRoot(roots[0] ?? null);\n }, [roots, root]);\n\n // An open request from the bar's ± counts, the dock command, or a transcript link.\n useEffect(() => {\n if (!request || handledNonce.current === request.nonce) return;\n handledNonce.current = request.nonce;\n setRoot(request.root);\n setScope(request.scope);\n setFile(request.file ?? null);\n }, [request]);\n\n // The pane's own width (it lives in a resizable dock), for the split default.\n useEffect(() => {\n const el = paneRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? 0;\n setWide(w >= SPLIT_MIN_WIDTH);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n // ---- the file list ------------------------------------------------------\n useEffect(() => {\n if (!visible || root === null) return;\n const controller = new AbortController();\n const key = `${root}\\0${serverScope(scope)}`;\n patchCache.current.clear();\n // A refresh of the SAME listing keeps showing it while it reloads; a new\n // root or scope must not show the previous one's files under its name.\n setList((prev) => (prev.state === 'ready' && prev.key === key ? prev : { state: 'loading' }));\n fetchDiff(root, serverScope(scope), null, controller.signal)\n .then((data) => {\n if (!controller.signal.aborted) setList({ state: 'ready', data, key });\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n if (isRootUnavailable(err)) setList({ state: 'not-a-repo' });\n else {\n console.warn('[verse] review list failed', err);\n setList({ state: 'error', message: describeGitError(err) });\n }\n });\n return () => controller.abort();\n }, [root, scope, visible, reloadKey, fetchDiff]);\n\n // The listing as it applies to what is on screen NOW: in the render right\n // after a root or scope switch, the previous listing is still in state and\n // must read as loading, or the selection and patch effects would act on it.\n const currentKey = root === null ? '' : `${root}\\0${serverScope(scope)}`;\n const list: ListState = useMemo(\n () => (rawList.state === 'ready' && rawList.key !== currentKey ? { state: 'loading' } : rawList),\n [rawList, currentKey],\n );\n\n const entries: ListEntry[] = useMemo(() => {\n if (list.state !== 'ready') return [];\n if (scope !== 'turn') return list.data.files.map((f) => ({ file: f, settled: false }));\n const touched = turnFiles.filter((t) => t.root === root).map((t) => t.path);\n const byPath = new Map(list.data.files.map((f) => [f.path, f]));\n return [...new Set(touched)].map((path) => {\n const change = byPath.get(path);\n return change\n ? { file: change, settled: false }\n : { file: { path, oldPath: null, status: 'M' as const, additions: 0, deletions: 0, binary: false }, settled: true };\n });\n }, [list, scope, turnFiles, root]);\n\n // Grouped exactly as the list draws them, so ↑/↓ and \"the first file\" follow what is on screen.\n const groups = useMemo(() => groupFiles(entries.map((e) => e.file)), [entries]);\n const selectable = useMemo(() => {\n const byPath = new Map(entries.map((e) => [e.file.path, e]));\n return groups.flatMap((g) => g.files.map((f) => byPath.get(f.path)!)).filter((e) => !e.settled);\n }, [groups, entries]);\n\n // Keep a valid selection: the requested file, else the first change.\n useEffect(() => {\n if (list.state !== 'ready') return;\n if (file !== null && selectable.some((e) => e.file.path === file)) return;\n setFile(selectable[0]?.file.path ?? null);\n }, [list, selectable, file]);\n\n // ---- the selected file's patch -------------------------------------------\n useEffect(() => {\n if (!visible || root === null || file === null || list.state !== 'ready') {\n setPatch({ state: 'idle' });\n return;\n }\n const entry = selectable.find((e) => e.file.path === file);\n if (!entry) return;\n const key = `${serverScope(scope)}\\0${file}`;\n const hit = patchCache.current.get(key);\n if (hit) {\n setPatch(hit);\n return;\n }\n if (entry.file.binary) {\n setPatch({ state: 'ready', text: '', truncated: false, totalBytes: null });\n return;\n }\n const controller = new AbortController();\n setPatch({ state: 'loading' });\n fetchDiff(root, serverScope(scope), file, controller.signal)\n .then((data) => {\n if (controller.signal.aborted) return;\n const ready = { state: 'ready' as const, text: data.patch?.text ?? '', truncated: data.patch?.truncated ?? false, totalBytes: data.patchBytes ?? null };\n patchCache.current.set(key, ready);\n setPatch(ready);\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n console.warn('[verse] review patch failed', err);\n setPatch({ state: 'error', message: describeGitError(err) });\n });\n return () => controller.abort();\n }, [root, scope, file, visible, list, selectable, fetchDiff]);\n\n // ---- comments ------------------------------------------------------------\n const addComment = useCallback((c: Omit<ReviewComment, 'id'>) => {\n setComments((prev) => [...prev, { ...c, id: `c${nextCommentId.current++}` }]);\n setAnnounce(`Comment added on line ${c.line}.`);\n }, []);\n const removeComment = useCallback((id: string) => {\n setComments((prev) => prev.filter((c) => c.id !== id));\n setAnnounce('Comment removed.');\n }, []);\n const sendComments = () => {\n if (comments.length === 0) return;\n onAddToMessage(commentsToMessage(comments));\n setAnnounce(`Added ${comments.length} ${comments.length === 1 ? 'comment' : 'comments'} to the message.`);\n setComments([]);\n };\n\n // ---- file list keyboard (listbox) -----------------------------------------\n const onListKey = (e: ReactKeyboardEvent<HTMLUListElement>) => {\n if (selectable.length === 0) return;\n const at = selectable.findIndex((x) => x.file.path === file);\n let next = at;\n if (e.key === 'ArrowDown') next = Math.min(selectable.length - 1, at + 1);\n else if (e.key === 'ArrowUp') next = Math.max(0, at - 1);\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = selectable.length - 1;\n else return;\n e.preventDefault();\n const path = selectable[next]!.file.path;\n setFile(path);\n const escaped = typeof CSS !== 'undefined' && typeof CSS.escape === 'function' ? CSS.escape(path) : path.replace(/[\"\\\\]/g, '\\\\$&');\n listRef.current?.querySelector<HTMLElement>(`[data-path=\"${escaped}\"]`)?.scrollIntoView?.({ block: 'nearest' });\n };\n\n // ---- render --------------------------------------------------------------\n const turnCount = turnFiles.filter((t) => t.root === root).length;\n const scopeOptions = [\n { value: 'turn' as const, label: 'This turn', disabled: turnCount === 0 },\n { value: 'working' as const, label: 'Uncommitted' },\n { value: 'branch' as const, label: 'Branch' },\n ];\n const layoutOptions = [\n { value: 'unified' as const, label: 'Unified' },\n { value: 'split' as const, label: 'Split' },\n ];\n const effectiveLayout: PatchLayout = layout === 'split' && !wide ? 'unified' : layout;\n const totals = entries.reduce(\n (acc, e) => (e.settled ? acc : { files: acc.files + 1, additions: acc.additions + e.file.additions, deletions: acc.deletions + e.file.deletions }),\n { files: 0, additions: 0, deletions: 0 },\n );\n const base = list.state === 'ready' ? list.data.base : null;\n const fileComments = comments.filter((c) => c.path === file);\n const refresh = () => setReloadKey((n) => n + 1);\n\n if (roots.length === 0 || root === null) {\n return (\n <div className={styles.pane} ref={paneRef}>\n <EmptyState compact title=\"No folder to review\"\n body=\"This chat has no project folder. Start a chat in a project to review the changes it makes.\" />\n </div>\n );\n }\n\n return (\n <div className={styles.pane} ref={paneRef} data-wide={wide ? 'true' : 'false'}>\n <header className={`${chrome.header} ${styles.head}`}>\n {roots.length > 1 ? (\n <label className={styles.rootPick}>\n <span className={styles.visuallyHidden}>Repository</span>\n <select id={rootId} value={root} onChange={(e) => { setRoot(e.target.value); setFile(null); }} className={styles.select} title={root}>\n {roots.map((r) => (\n <option key={r} value={r}>{rootName(r)}</option>\n ))}\n </select>\n </label>\n ) : (\n <span className={`${chrome.title} ${styles.rootName}`} title={root}>{rootName(root)}</span>\n )}\n <Segmented\n aria-label=\"What to review\"\n size=\"sm\"\n options={scopeOptions}\n value={scope}\n onChange={(next) => { setScope(next); setFile(null); }}\n />\n <div className={chrome.actions}>\n <Segmented\n aria-label=\"Diff layout\"\n size=\"sm\"\n options={layoutOptions.map((o) => (o.value === 'split' && !wide ? { ...o, disabled: true } : o))}\n value={effectiveLayout}\n onChange={setLayout}\n />\n {/* The same ghost sm icon button the Terminal and Preview headers use. */}\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconRefresh />} aria-label=\"Refresh changes\" title=\"Refresh changes\" onClick={refresh} />\n </div>\n </header>\n\n <p className={styles.summary}>\n {list.state === 'ready' ? (\n totals.files === 0 ? (\n <span>{emptySentence(scope, base)}</span>\n ) : (\n <span aria-label={diffstatLabel(totals.files, totals.additions, totals.deletions)}>\n {formatCount(totals.files)} {totals.files === 1 ? 'file' : 'files'} · <span className={styles.add}>+{formatCount(totals.additions)}</span>{' '}\n <span className={styles.del}>{'\\u2212'}{formatCount(totals.deletions)}</span>\n {scope === 'branch' && base ? <> against <code className={styles.ref}>{base}</code></> : null}\n {scope === 'working' ? ' uncommitted' : null}\n </span>\n )\n ) : list.state === 'loading' || list.state === 'idle' ? (\n <span className={styles.muted}>Reading changes…</span>\n ) : null}\n </p>\n\n {list.state === 'not-a-repo' ? (\n <EmptyState compact title=\"Not a git repository\"\n body={`${rootName(root)} is not tracked by git, so there is nothing to review. Run git init in the terminal to start tracking it.`} />\n ) : list.state === 'error' ? (\n <EmptyState compact tone=\"error\" title=\"Could not read the changes\" body={list.message}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={refresh}>Try again</Button>} />\n ) : list.state !== 'ready' ? (\n <div className={styles.skeleton} aria-hidden=\"true\">\n <SkeletonLine />\n <SkeletonLine />\n <SkeletonLine />\n </div>\n ) : entries.length === 0 ? (\n // The summary line above states the fact; this says where to look next.\n <p className={styles.patchNotice}>{emptyNextStep(scope)}</p>\n ) : (\n <div className={styles.body}>\n <nav className={styles.files} aria-label=\"Changed files\">\n <ul\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label=\"Changed files\"\n className={styles.fileList}\n tabIndex={0}\n aria-activedescendant={file ? `${listId}-${encodeURIComponent(file)}` : undefined}\n onKeyDown={onListKey}\n >\n {groups.map((group) => (\n <li key={group.dir || '.'} role=\"presentation\" className={styles.group}>\n {/* RTL truncation keeps the tail of a long path visible; the LRM keeps\n the trailing slash from being reordered to the front. */}\n {group.dir ? <span className={styles.dir} role=\"presentation\" title={`${group.dir}/`}>{group.dir}/{'\\u200E'}</span> : null}\n <ul role=\"presentation\" className={styles.groupFiles}>\n {group.files.map((f) => {\n const settled = entries.find((e) => e.file.path === f.path)?.settled ?? false;\n const selected = f.path === file;\n const count = comments.filter((c) => c.path === f.path).length;\n return (\n <li\n key={f.path}\n id={`${listId}-${encodeURIComponent(f.path)}`}\n data-path={f.path}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={settled || undefined}\n className={styles.file}\n data-status={f.status}\n onClick={() => { if (!settled) setFile(f.path); }}\n title={f.oldPath ? `${f.oldPath} → ${f.path}` : f.path}\n >\n <span className={styles.fileStatus} aria-label={FILE_STATUS_WORD[f.status]}>{f.status}</span>\n <span className={styles.fileName}>{f.name}</span>\n {count > 0 ? <span className={styles.fileComments} aria-label={`${count} ${count === 1 ? 'comment' : 'comments'}`}>{count}</span> : null}\n {settled ? (\n <span className={styles.fileSettled}>committed</span>\n ) : f.binary ? (\n <span className={styles.fileCounts}>binary</span>\n ) : (\n <span className={styles.fileCounts}>\n <span className={styles.add}>+{formatCount(f.additions)}</span> <span className={styles.del}>{'−'}{formatCount(f.deletions)}</span>\n </span>\n )}\n </li>\n );\n })}\n </ul>\n </li>\n ))}\n </ul>\n </nav>\n\n <section className={styles.patchArea} aria-label={file ? `Patch for ${file}` : 'Patch'}>\n {file === null ? (\n <p className={styles.patchNotice}>Choose a file in the list to see its changes.</p>\n ) : patch.state === 'loading' || patch.state === 'idle' ? (\n <div className={styles.skeleton} aria-hidden=\"true\">\n <SkeletonLine />\n <SkeletonLine />\n </div>\n ) : patch.state === 'error' ? (\n <div className={styles.patchError} role=\"alert\">\n <p>{patch.message}</p>\n <Button size=\"sm\" variant=\"subtle\" onClick={refresh}>Try again</Button>\n </div>\n ) : (\n <>\n <h3 className={styles.patchPath} title={file}>{file}</h3>\n {selectable.find((e) => e.file.path === file)?.file.binary ? (\n <p className={styles.patchNotice}>Binary file — no lines to show.</p>\n ) : (\n <PatchView\n path={file}\n text={patch.text}\n truncated={patch.truncated}\n totalBytes={patch.totalBytes}\n layout={effectiveLayout}\n comments={fileComments}\n onAddComment={addComment}\n onRemoveComment={removeComment}\n />\n )}\n </>\n )}\n </section>\n </div>\n )}\n\n {comments.length > 0 ? (\n <footer className={styles.foot}>\n <span className={styles.footCount}>\n {comments.length} {comments.length === 1 ? 'comment' : 'comments'}\n {new Set(comments.map((c) => c.path)).size > 1 ? ` in ${new Set(comments.map((c) => c.path)).size} files` : ''}\n </span>\n <button type=\"button\" className={styles.linkButton} onClick={() => { setComments([]); setAnnounce('Comments discarded.'); }}>\n Discard\n </button>\n <button type=\"button\" className={styles.saveButton} onClick={sendComments}>\n Add to message\n </button>\n </footer>\n ) : null}\n <p className={styles.visuallyHidden} role=\"status\" aria-live=\"polite\">{announce}</p>\n </div>\n );\n}\n\n/** What to do about an empty scope: the next place to look, never a dead end. */\nfunction emptyNextStep(scope: VerseReviewScope): string {\n if (scope === 'turn') return 'Switch to Uncommitted or Branch to see the rest of the changes.';\n if (scope === 'working') return 'Edits the chat makes show up here as they land. Branch shows what is already committed.';\n return 'Commits on this branch show up here. Uncommitted shows edits that are not committed yet.';\n}\n\nfunction emptySentence(scope: VerseReviewScope, base: string | null): string {\n if (scope === 'turn') return 'The latest turn changed no files here.';\n if (scope === 'working') return 'No uncommitted changes.';\n return base ? `This branch has no changes against ${base}.` : 'No changes on this branch.';\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,c as t,n}from"./index-
|
|
2
|
-
//# sourceMappingURL=DiffViewer-
|
|
1
|
+
import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{i as r,n as i,r as a,t as o}from"./highlight-CMCZK9jW.js";var s=t(e(),1),c={viewer:`_viewer_gf84p_1`,malformedNotice:`_malformedNotice_gf84p_9`,empty:`_empty_gf84p_18`,tree:`_tree_gf84p_27`,treeItem:`_treeItem_gf84p_40`,treeItemActive:`_treeItemActive_gf84p_59`,statusDot:`_statusDot_gf84p_64`,status_added:`_status_added_gf84p_70`,status_deleted:`_status_deleted_gf84p_71`,status_modified:`_status_modified_gf84p_72`,status_renamed:`_status_renamed_gf84p_73`,treePath:`_treePath_gf84p_75`,treeStats:`_treeStats_gf84p_83`,add:`_add_gf84p_89`,del:`_del_gf84p_90`,body:`_body_gf84p_92`,fileHeader:`_fileHeader_gf84p_99`,filePath:`_filePath_gf84p_109`,modeToggle:`_modeToggle_gf84p_118`,modeActive:`_modeActive_gf84p_132`,notice:`_notice_gf84p_138`,emptyFile:`_emptyFile_gf84p_149`,hunkTable:`_hunkTable_gf84p_155`,hunkCaption:`_hunkCaption_gf84p_163`,lineNo:`_lineNo_gf84p_173`,lineMarker:`_lineMarker_gf84p_184`,lineText:`_lineText_gf84p_192`,hunkTableSplit:`_hunkTableSplit_gf84p_199`,rowBlank:`_rowBlank_gf84p_203`,row_add:`_row_add_gf84p_207`,row_del:`_row_del_gf84p_210`,row_context:`_row_context_gf84p_213`,code:`_code_gf84p_217`,tok_plain:`_tok_plain_gf84p_221`,tok_comment:`_tok_comment_gf84p_222`,tok_string:`_tok_string_gf84p_223`,tok_number:`_tok_number_gf84p_224`,tok_keyword:`_tok_keyword_gf84p_225`},l=n();function u({diff:e,proposalKind:t}){let n=(0,s.useMemo)(()=>a(e),[e]),[r,i]=(0,s.useState)(n.files[0]?.id??null),[o,u]=(0,s.useState)(`unified`);if((0,s.useEffect)(()=>{i(n.files[0]?.id??null)},[e]),n.files.length===0)return(0,l.jsxs)(`div`,{className:c.empty,children:[`No diff attached to this proposal (kind: `,t,`).`]});let f=n.files.find(e=>e.id===r)??n.files[0];function p(e){let t=n.files.findIndex(e=>e.id===f.id);e.key===`ArrowDown`?(e.preventDefault(),i(n.files[Math.min(t+1,n.files.length-1)].id)):e.key===`ArrowUp`&&(e.preventDefault(),i(n.files[Math.max(t-1,0)].id))}return(0,l.jsxs)(`div`,{className:c.viewer,children:[n.malformed?(0,l.jsx)(`p`,{className:c.malformedNotice,children:`Could not parse this as a unified diff — showing raw content.`}):null,(0,l.jsx)(`div`,{className:c.tree,role:`tree`,"aria-label":`Changed files`,onKeyDown:p,children:n.files.map(e=>(0,l.jsxs)(`button`,{type:`button`,role:`treeitem`,"aria-selected":e.id===f.id,tabIndex:e.id===f.id?0:-1,className:`${c.treeItem} ${e.id===f.id?c.treeItemActive:``}`,onClick:()=>i(e.id),children:[(0,l.jsx)(`span`,{className:`${c.statusDot} ${c[`status_${e.status}`]}`,"aria-hidden":`true`}),(0,l.jsx)(`span`,{className:c.treePath,title:e.displayPath,children:e.displayPath}),(0,l.jsxs)(`span`,{className:c.treeStats,children:[e.additions>0?(0,l.jsxs)(`span`,{className:c.add,children:[`+`,e.additions]}):null,e.deletions>0?(0,l.jsxs)(`span`,{className:c.del,children:[`-`,e.deletions]}):null]})]},e.id))}),(0,l.jsxs)(`div`,{className:c.body,children:[(0,l.jsxs)(`div`,{className:c.fileHeader,children:[(0,l.jsx)(`span`,{className:c.filePath,children:f.displayPath}),(0,l.jsxs)(`div`,{className:c.modeToggle,role:`group`,"aria-label":`Diff view mode`,children:[(0,l.jsx)(`button`,{type:`button`,"aria-pressed":o===`unified`,className:o===`unified`?c.modeActive:``,onClick:()=>u(`unified`),children:`Unified`}),(0,l.jsx)(`button`,{type:`button`,"aria-pressed":o===`split`,className:o===`split`?c.modeActive:``,onClick:()=>u(`split`),children:`Split`})]})]}),f.unparsedNotice?(0,l.jsx)(`pre`,{className:c.notice,children:f.unparsedNotice}):null,f.hunks.length===0&&!f.unparsedNotice?(0,l.jsx)(`p`,{className:c.emptyFile,children:`No line-level changes captured for this file.`}):f.hunks.map((e,t)=>(0,l.jsx)(d,{hunk:e,mode:o,path:f.displayPath},t))]})]})}function d({hunk:e,mode:t,path:n}){let i=o(n);if(t===`split`){let t=r(e.lines);return(0,l.jsxs)(`table`,{className:`${c.hunkTable} ${c.hunkTableSplit}`,children:[(0,l.jsx)(`caption`,{className:c.hunkCaption,children:e.header}),(0,l.jsx)(`tbody`,{children:t.map((e,t)=>(0,l.jsxs)(`tr`,{children:[(0,l.jsx)(`td`,{className:c.lineNo,children:e.left?.oldLineNo??``}),(0,l.jsx)(`td`,{className:`${c.lineText} ${e.left?c[`row_${e.left.kind}`]:c.rowBlank}`,children:e.left?(0,l.jsx)(f,{text:e.left.text,lang:i}):null}),(0,l.jsx)(`td`,{className:c.lineNo,children:e.right?.newLineNo??``}),(0,l.jsx)(`td`,{className:`${c.lineText} ${e.right?c[`row_${e.right.kind}`]:c.rowBlank}`,children:e.right?(0,l.jsx)(f,{text:e.right.text,lang:i}):null})]},t))})]})}return(0,l.jsxs)(`table`,{className:c.hunkTable,children:[(0,l.jsx)(`caption`,{className:c.hunkCaption,children:e.header}),(0,l.jsx)(`tbody`,{children:e.lines.map((e,t)=>(0,l.jsxs)(`tr`,{className:c[`row_${e.kind}`],children:[(0,l.jsx)(`td`,{className:c.lineNo,children:e.oldLineNo??``}),(0,l.jsx)(`td`,{className:c.lineNo,children:e.newLineNo??``}),(0,l.jsx)(`td`,{className:c.lineMarker,"aria-hidden":`true`,children:e.kind===`add`?`+`:e.kind===`del`?`-`:``}),(0,l.jsx)(`td`,{className:c.lineText,children:(0,l.jsx)(f,{text:e.text,lang:i})})]},t))})]})}function f({text:e,lang:t}){let n=i(e,t);return(0,l.jsx)(`code`,{className:c.code,children:n.map((e,t)=>(0,l.jsx)(`span`,{className:c[`tok_${e.kind}`],children:e.text},t))})}export{u as t};
|
|
2
|
+
//# sourceMappingURL=DiffViewer-C4WKsCIe.js.map
|
package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js.map → DiffViewer-C4WKsCIe.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiffViewer-CNwd0W3Q.js","names":[],"sources":["../../../../../../src/web-ui/routes/inbox/DiffViewer.module.css","../../../../../../src/web-ui/routes/inbox/DiffViewer.tsx"],"sourcesContent":[".viewer {\n display: grid;\n grid-template-columns: minmax(180px, 260px) 1fr;\n gap: var(--space-4);\n align-items: start;\n min-height: 0;\n}\n\n.malformedNotice {\n grid-column: 1 / -1;\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-sm);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n}\n\n.empty {\n padding: var(--space-6);\n text-align: center;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n border: 1px dashed var(--border-default);\n border-radius: var(--radius-md);\n}\n\n.tree {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n padding: var(--space-2);\n max-height: 480px;\n overflow-y: auto;\n position: sticky;\n top: 0;\n}\n\n.treeItem {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-sm);\n background: transparent;\n border: none;\n text-align: left;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n cursor: pointer;\n}\n\n.treeItem:hover {\n background: var(--bg-hover);\n}\n\n.treeItemActive {\n background: var(--bg-selected);\n color: var(--text-primary);\n}\n\n.statusDot {\n flex: 0 0 auto;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n}\n.status_added { background: var(--status-success-solid); }\n.status_deleted { background: var(--status-danger-solid); }\n.status_modified { background: var(--status-info-solid); }\n.status_renamed { background: var(--status-warning-solid); }\n\n.treePath {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n}\n\n.treeStats {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n font-variant-numeric: tabular-nums;\n}\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n\n.body {\n min-width: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.fileHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-canvas);\n}\n\n.filePath {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.modeToggle {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n}\n.modeToggle button {\n padding: var(--space-1) var(--space-2);\n font-size: var(--text-xs-size);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-default);\n background: var(--bg-surface);\n color: var(--text-secondary);\n cursor: pointer;\n}\n.modeActive {\n background: var(--accent-50);\n border-color: var(--accent-500) !important;\n color: var(--accent-600) !important;\n}\n\n.notice {\n margin: var(--space-3);\n padding: var(--space-2);\n background: var(--bg-code);\n border-radius: var(--radius-sm);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.emptyFile {\n padding: var(--space-4);\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n}\n\n.hunkTable {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n table-layout: fixed;\n}\n\n.hunkCaption {\n caption-side: top;\n text-align: left;\n padding: var(--space-1) var(--space-3);\n color: var(--text-tertiary);\n background: var(--bg-canvas);\n border-bottom: 1px solid var(--border-subtle);\n border-top: 1px solid var(--border-subtle);\n}\n\n.lineNo {\n width: 44px;\n min-width: 44px;\n padding: 0 var(--space-2);\n text-align: right;\n color: var(--text-disabled);\n user-select: none;\n vertical-align: top;\n font-variant-numeric: tabular-nums;\n}\n\n.lineMarker {\n width: 16px;\n min-width: 16px;\n text-align: center;\n user-select: none;\n vertical-align: top;\n}\n\n.lineText {\n padding: 0 var(--space-2);\n white-space: pre-wrap;\n word-break: break-word;\n vertical-align: top;\n}\n\n.hunkTableSplit .lineText {\n width: 50%;\n}\n\n.rowBlank {\n background: var(--bg-canvas);\n}\n\n.row_add {\n background: var(--status-success-bg);\n}\n.row_del {\n background: var(--status-danger-bg);\n}\n.row_context {\n background: transparent;\n}\n\n.code {\n font-family: inherit;\n}\n\n.tok_plain { color: var(--text-primary); }\n.tok_comment { color: var(--text-tertiary); font-style: italic; }\n.tok_string { color: var(--status-success-fg); }\n.tok_number { color: var(--status-warning-fg); }\n.tok_keyword { color: var(--accent-600); font-weight: var(--font-weight-medium); }\n","/**\n * routes/inbox/DiffViewer.tsx — the core review interaction (operator-\n * console brief item 2). A multi-file unified diff gets a file tree plus a\n * syntax-highlighted, split/unified-toggleable hunk view instead of one\n * escaped <pre> block (the old UI's approach). No diff/highlighting\n * dependency: diff-parser.ts and highlight.ts are both hand-rolled per the\n * foundation's \"keep new runtime deps minimal\" constraint — checked\n * package.json first; nothing suitable was already a dependency.\n */\nimport { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport { parseUnifiedDiff, toSplitRows, type DiffHunk } from './diff-parser.js';\nimport { languageForPath, tokenizeLine, type LangFamily } from './highlight.js';\nimport styles from './DiffViewer.module.css';\n\ntype ViewMode = 'unified' | 'split';\n\nexport function DiffViewer({ diff, proposalKind }: { diff: string | undefined; proposalKind: string }) {\n const parsed = useMemo(() => parseUnifiedDiff(diff), [diff]);\n const [selectedId, setSelectedId] = useState<string | null>(parsed.files[0]?.id ?? null);\n const [mode, setMode] = useState<ViewMode>('unified');\n\n // Diff identity changed (a different proposal is now shown) — reset the\n // selected file rather than holding on to a stale id from the last one.\n useEffect(() => {\n setSelectedId(parsed.files[0]?.id ?? null);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- reset on diff content change only\n }, [diff]);\n\n if (parsed.files.length === 0) {\n return (\n <div className={styles.empty}>No diff attached to this proposal (kind: {proposalKind}).</div>\n );\n }\n\n const selected = parsed.files.find((f) => f.id === selectedId) ?? parsed.files[0]!;\n\n function onTreeKeyDown(e: React.KeyboardEvent) {\n const idx = parsed.files.findIndex((f) => f.id === selected.id);\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.min(idx + 1, parsed.files.length - 1)]!.id);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.max(idx - 1, 0)]!.id);\n }\n }\n\n return (\n <div className={styles.viewer}>\n {parsed.malformed ? (\n <p className={styles.malformedNotice}>Could not parse this as a unified diff — showing raw content.</p>\n ) : null}\n <div className={styles.tree} role=\"tree\" aria-label=\"Changed files\" onKeyDown={onTreeKeyDown}>\n {parsed.files.map((f) => (\n <button\n key={f.id}\n type=\"button\"\n role=\"treeitem\"\n aria-selected={f.id === selected.id}\n tabIndex={f.id === selected.id ? 0 : -1}\n className={`${styles.treeItem} ${f.id === selected.id ? styles.treeItemActive : ''}`}\n onClick={() => setSelectedId(f.id)}\n >\n <span className={`${styles.statusDot} ${styles[`status_${f.status}`]}`} aria-hidden=\"true\" />\n <span className={styles.treePath} title={f.displayPath}>\n {f.displayPath}\n </span>\n <span className={styles.treeStats}>\n {f.additions > 0 ? <span className={styles.add}>+{f.additions}</span> : null}\n {f.deletions > 0 ? <span className={styles.del}>-{f.deletions}</span> : null}\n </span>\n </button>\n ))}\n </div>\n\n <div className={styles.body}>\n <div className={styles.fileHeader}>\n <span className={styles.filePath}>{selected.displayPath}</span>\n <div className={styles.modeToggle} role=\"group\" aria-label=\"Diff view mode\">\n <button\n type=\"button\"\n aria-pressed={mode === 'unified'}\n className={mode === 'unified' ? styles.modeActive : ''}\n onClick={() => setMode('unified')}\n >\n Unified\n </button>\n <button\n type=\"button\"\n aria-pressed={mode === 'split'}\n className={mode === 'split' ? styles.modeActive : ''}\n onClick={() => setMode('split')}\n >\n Split\n </button>\n </div>\n </div>\n {selected.unparsedNotice ? <pre className={styles.notice}>{selected.unparsedNotice}</pre> : null}\n {selected.hunks.length === 0 && !selected.unparsedNotice ? (\n <p className={styles.emptyFile}>No line-level changes captured for this file.</p>\n ) : (\n selected.hunks.map((hunk, i) => <Hunk key={i} hunk={hunk} mode={mode} path={selected.displayPath} />)\n )}\n </div>\n </div>\n );\n}\n\nfunction Hunk({ hunk, mode, path }: { hunk: DiffHunk; mode: ViewMode; path: string }) {\n const lang = languageForPath(path);\n if (mode === 'split') {\n const rows = toSplitRows(hunk.lines);\n return (\n <table className={`${styles.hunkTable} ${styles.hunkTableSplit}`}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {rows.map((row, i) => (\n <tr key={i}>\n <td className={styles.lineNo}>{row.left?.oldLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.left ? styles[`row_${row.left.kind}`] : styles.rowBlank}`}>\n {row.left ? <CodeLine text={row.left.text} lang={lang} /> : null}\n </td>\n <td className={styles.lineNo}>{row.right?.newLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.right ? styles[`row_${row.right.kind}`] : styles.rowBlank}`}>\n {row.right ? <CodeLine text={row.right.text} lang={lang} /> : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n return (\n <table className={styles.hunkTable}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {hunk.lines.map((line, i) => (\n <tr key={i} className={styles[`row_${line.kind}`]}>\n <td className={styles.lineNo}>{line.oldLineNo ?? ''}</td>\n <td className={styles.lineNo}>{line.newLineNo ?? ''}</td>\n <td className={styles.lineMarker} aria-hidden=\"true\">\n {line.kind === 'add' ? '+' : line.kind === 'del' ? '-' : ''}\n </td>\n <td className={styles.lineText}>\n <CodeLine text={line.text} lang={lang} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction CodeLine({ text, lang }: { text: string; lang: LangFamily }): ReactNode {\n const tokens = tokenizeLine(text, lang);\n return (\n <code className={styles.code}>\n {tokens.map((t, i) => (\n <span key={i} className={styles[`tok_${t.kind}`]}>\n {t.text}\n </span>\n ))}\n </code>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DiffViewer-C4WKsCIe.js","names":[],"sources":["../../../../../../src/web-ui/routes/inbox/DiffViewer.module.css","../../../../../../src/web-ui/routes/inbox/DiffViewer.tsx"],"sourcesContent":[".viewer {\n display: grid;\n grid-template-columns: minmax(180px, 260px) 1fr;\n gap: var(--space-4);\n align-items: start;\n min-height: 0;\n}\n\n.malformedNotice {\n grid-column: 1 / -1;\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-sm);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n}\n\n.empty {\n padding: var(--space-6);\n text-align: center;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n border: 1px dashed var(--border-default);\n border-radius: var(--radius-md);\n}\n\n.tree {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n padding: var(--space-2);\n max-height: 480px;\n overflow-y: auto;\n position: sticky;\n top: 0;\n}\n\n.treeItem {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-sm);\n background: transparent;\n border: none;\n text-align: left;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n cursor: pointer;\n}\n\n.treeItem:hover {\n background: var(--bg-hover);\n}\n\n.treeItemActive {\n background: var(--bg-selected);\n color: var(--text-primary);\n}\n\n.statusDot {\n flex: 0 0 auto;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n}\n.status_added { background: var(--status-success-solid); }\n.status_deleted { background: var(--status-danger-solid); }\n.status_modified { background: var(--status-info-solid); }\n.status_renamed { background: var(--status-warning-solid); }\n\n.treePath {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n}\n\n.treeStats {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n font-variant-numeric: tabular-nums;\n}\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n\n.body {\n min-width: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.fileHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-canvas);\n}\n\n.filePath {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.modeToggle {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n}\n.modeToggle button {\n padding: var(--space-1) var(--space-2);\n font-size: var(--text-xs-size);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-default);\n background: var(--bg-surface);\n color: var(--text-secondary);\n cursor: pointer;\n}\n.modeActive {\n background: var(--accent-50);\n border-color: var(--accent-500) !important;\n color: var(--accent-600) !important;\n}\n\n.notice {\n margin: var(--space-3);\n padding: var(--space-2);\n background: var(--bg-code);\n border-radius: var(--radius-sm);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.emptyFile {\n padding: var(--space-4);\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n}\n\n.hunkTable {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n table-layout: fixed;\n}\n\n.hunkCaption {\n caption-side: top;\n text-align: left;\n padding: var(--space-1) var(--space-3);\n color: var(--text-tertiary);\n background: var(--bg-canvas);\n border-bottom: 1px solid var(--border-subtle);\n border-top: 1px solid var(--border-subtle);\n}\n\n.lineNo {\n width: 44px;\n min-width: 44px;\n padding: 0 var(--space-2);\n text-align: right;\n color: var(--text-disabled);\n user-select: none;\n vertical-align: top;\n font-variant-numeric: tabular-nums;\n}\n\n.lineMarker {\n width: 16px;\n min-width: 16px;\n text-align: center;\n user-select: none;\n vertical-align: top;\n}\n\n.lineText {\n padding: 0 var(--space-2);\n white-space: pre-wrap;\n word-break: break-word;\n vertical-align: top;\n}\n\n.hunkTableSplit .lineText {\n width: 50%;\n}\n\n.rowBlank {\n background: var(--bg-canvas);\n}\n\n.row_add {\n background: var(--status-success-bg);\n}\n.row_del {\n background: var(--status-danger-bg);\n}\n.row_context {\n background: transparent;\n}\n\n.code {\n font-family: inherit;\n}\n\n.tok_plain { color: var(--text-primary); }\n.tok_comment { color: var(--text-tertiary); font-style: italic; }\n.tok_string { color: var(--status-success-fg); }\n.tok_number { color: var(--status-warning-fg); }\n.tok_keyword { color: var(--accent-600); font-weight: var(--font-weight-medium); }\n","/**\n * routes/inbox/DiffViewer.tsx — the core review interaction (operator-\n * console brief item 2). A multi-file unified diff gets a file tree plus a\n * syntax-highlighted, split/unified-toggleable hunk view instead of one\n * escaped <pre> block (the old UI's approach). No diff/highlighting\n * dependency: diff-parser.ts and highlight.ts are both hand-rolled per the\n * foundation's \"keep new runtime deps minimal\" constraint — checked\n * package.json first; nothing suitable was already a dependency.\n */\nimport { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport { parseUnifiedDiff, toSplitRows, type DiffHunk } from './diff-parser.js';\nimport { languageForPath, tokenizeLine, type LangFamily } from './highlight.js';\nimport styles from './DiffViewer.module.css';\n\ntype ViewMode = 'unified' | 'split';\n\nexport function DiffViewer({ diff, proposalKind }: { diff: string | undefined; proposalKind: string }) {\n const parsed = useMemo(() => parseUnifiedDiff(diff), [diff]);\n const [selectedId, setSelectedId] = useState<string | null>(parsed.files[0]?.id ?? null);\n const [mode, setMode] = useState<ViewMode>('unified');\n\n // Diff identity changed (a different proposal is now shown) — reset the\n // selected file rather than holding on to a stale id from the last one.\n useEffect(() => {\n setSelectedId(parsed.files[0]?.id ?? null);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- reset on diff content change only\n }, [diff]);\n\n if (parsed.files.length === 0) {\n return (\n <div className={styles.empty}>No diff attached to this proposal (kind: {proposalKind}).</div>\n );\n }\n\n const selected = parsed.files.find((f) => f.id === selectedId) ?? parsed.files[0]!;\n\n function onTreeKeyDown(e: React.KeyboardEvent) {\n const idx = parsed.files.findIndex((f) => f.id === selected.id);\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.min(idx + 1, parsed.files.length - 1)]!.id);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.max(idx - 1, 0)]!.id);\n }\n }\n\n return (\n <div className={styles.viewer}>\n {parsed.malformed ? (\n <p className={styles.malformedNotice}>Could not parse this as a unified diff — showing raw content.</p>\n ) : null}\n <div className={styles.tree} role=\"tree\" aria-label=\"Changed files\" onKeyDown={onTreeKeyDown}>\n {parsed.files.map((f) => (\n <button\n key={f.id}\n type=\"button\"\n role=\"treeitem\"\n aria-selected={f.id === selected.id}\n tabIndex={f.id === selected.id ? 0 : -1}\n className={`${styles.treeItem} ${f.id === selected.id ? styles.treeItemActive : ''}`}\n onClick={() => setSelectedId(f.id)}\n >\n <span className={`${styles.statusDot} ${styles[`status_${f.status}`]}`} aria-hidden=\"true\" />\n <span className={styles.treePath} title={f.displayPath}>\n {f.displayPath}\n </span>\n <span className={styles.treeStats}>\n {f.additions > 0 ? <span className={styles.add}>+{f.additions}</span> : null}\n {f.deletions > 0 ? <span className={styles.del}>-{f.deletions}</span> : null}\n </span>\n </button>\n ))}\n </div>\n\n <div className={styles.body}>\n <div className={styles.fileHeader}>\n <span className={styles.filePath}>{selected.displayPath}</span>\n <div className={styles.modeToggle} role=\"group\" aria-label=\"Diff view mode\">\n <button\n type=\"button\"\n aria-pressed={mode === 'unified'}\n className={mode === 'unified' ? styles.modeActive : ''}\n onClick={() => setMode('unified')}\n >\n Unified\n </button>\n <button\n type=\"button\"\n aria-pressed={mode === 'split'}\n className={mode === 'split' ? styles.modeActive : ''}\n onClick={() => setMode('split')}\n >\n Split\n </button>\n </div>\n </div>\n {selected.unparsedNotice ? <pre className={styles.notice}>{selected.unparsedNotice}</pre> : null}\n {selected.hunks.length === 0 && !selected.unparsedNotice ? (\n <p className={styles.emptyFile}>No line-level changes captured for this file.</p>\n ) : (\n selected.hunks.map((hunk, i) => <Hunk key={i} hunk={hunk} mode={mode} path={selected.displayPath} />)\n )}\n </div>\n </div>\n );\n}\n\nfunction Hunk({ hunk, mode, path }: { hunk: DiffHunk; mode: ViewMode; path: string }) {\n const lang = languageForPath(path);\n if (mode === 'split') {\n const rows = toSplitRows(hunk.lines);\n return (\n <table className={`${styles.hunkTable} ${styles.hunkTableSplit}`}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {rows.map((row, i) => (\n <tr key={i}>\n <td className={styles.lineNo}>{row.left?.oldLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.left ? styles[`row_${row.left.kind}`] : styles.rowBlank}`}>\n {row.left ? <CodeLine text={row.left.text} lang={lang} /> : null}\n </td>\n <td className={styles.lineNo}>{row.right?.newLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.right ? styles[`row_${row.right.kind}`] : styles.rowBlank}`}>\n {row.right ? <CodeLine text={row.right.text} lang={lang} /> : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n return (\n <table className={styles.hunkTable}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {hunk.lines.map((line, i) => (\n <tr key={i} className={styles[`row_${line.kind}`]}>\n <td className={styles.lineNo}>{line.oldLineNo ?? ''}</td>\n <td className={styles.lineNo}>{line.newLineNo ?? ''}</td>\n <td className={styles.lineMarker} aria-hidden=\"true\">\n {line.kind === 'add' ? '+' : line.kind === 'del' ? '-' : ''}\n </td>\n <td className={styles.lineText}>\n <CodeLine text={line.text} lang={lang} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction CodeLine({ text, lang }: { text: string; lang: LangFamily }): ReactNode {\n const tokens = tokenizeLine(text, lang);\n return (\n <code className={styles.code}>\n {tokens.map((t, i) => (\n <span key={i} className={styles[`tok_${t.kind}`]}>\n {t.text}\n </span>\n ))}\n </code>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{_ as r,h as i,i as a,o}from"./global-CMNW_dqn.js";import{t as s}from"./MutationTokenDialog-DbnO8aYi.js";import{t as c}from"./ProviderLogo-Cq-CYIwT.js";import{Dt as l,Et as u,Tt as d,_n as f,bt as p,ht as m,mt as h,pt as g,vt as _,wt as v,xt as y,yt as b}from"./VerseConsoleApp-CWU6R3By.js";import{D as x,O as S,c as C,k as w,l as T,s as E,v as ee}from"./verse-model-DAVevkNe.js";import{p as D}from"./format-CH4g_sl1.js";import{a as te,c as O,d as k,l as ne,u as re}from"./context-queries-eL3caKVG.js";import{T as A,f as j,t as ie,v as M,w as N}from"./context-model-Br8t9jgG.js";import{_ as ae,a as oe,i as se,k as ce,l as P,m as le,n as ue,r as de,v as F,w as fe,x as pe}from"./context-model-CokrgEUq.js";import{d as I,p as L,u as R}from"./workspace-model-dji5-Al3.js";import{n as z,t as B}from"./ActionMenu-CIiX2X8w.js";import{s as me}from"./tool-semantics-GX8ScuSH.js";import{d as V,h as he,i as H,l as ge,n as U}from"./dock-icons-BJ6ZqB2t.js";import{a as W}from"./command-catalog-BIntSa9l.js";import{currentTurnTasks as _e}from"./tasks-model-O8yR5YXp.js";import{n as ve,t as G}from"./use-token-gate-CbXVYQYI.js";import{t as ye}from"./EmptyState-D2IRy3Cg.js";import{a as be,n as xe,r as Se}from"./slots-C-qBeu-8.js";import{i as Ce,r as K,t as we}from"./useVerseTranscript-DgbigUlV.js";import{t as Te}from"./Switch-9NtO_6Lj.js";import{t as q}from"./context.module-BijAfoJw.js";import{s as Ee}from"./ChatSection-DlT4QU6a.js";var J=t(e(),1),Y={usage:`_usage_1xfeo_5`,muted:`_muted_1xfeo_21`,subTitle:`_subTitle_1xfeo_23`,idleWarn:`_idleWarn_1xfeo_35`},X=n();function De({session:e,seats:t,events:n,now:r}){let i=e.usage,a=N(e,t),o=A(n??[]),s=i.inputTokens+i.cacheReadTokens+i.cacheCreationTokens,c=M(i),l=e.compactionCount??o.compactions,u=j(e,a.tokens,r,w(n??[])),d=a.exact?``:`≤`,f=o.exact?``:`≤`;return(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`dl`,{className:Y.usage,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Input`}),(0,X.jsx)(`dd`,{children:S(i.inputTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Output`}),(0,X.jsx)(`dd`,{children:S(i.outputTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache read`}),(0,X.jsx)(`dd`,{children:S(i.cacheReadTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache write`}),(0,X.jsx)(`dd`,{children:S(i.cacheCreationTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Turns`}),(0,X.jsx)(`dd`,{children:e.turnCount})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Context`}),(0,X.jsxs)(`dd`,{title:a.exact?void 0:`An upper bound: the CLI reported only the turn total, which sums every call.`,children:[d,S(a.tokens),a.window===null?``:` / ${E(a.window)}`]})]})]}),(0,X.jsx)(`h4`,{className:Y.subTitle,children:`Efficiency`}),(0,X.jsxs)(`dl`,{className:Y.usage,"aria-label":`Context efficiency`,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache hit`}),(0,X.jsx)(`dd`,{title:`Share of prompt tokens served from the provider's cache: cache read ÷ (input + cache read + cache write).`,children:c===null?s>0?`none reported`:`—`:D(c)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Compactions`}),(0,X.jsx)(`dd`,{children:l})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Avg context / turn`}),(0,X.jsx)(`dd`,{children:o.average===null?`—`:`${f}${S(o.average)}`})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Peak context`}),(0,X.jsx)(`dd`,{children:o.peak===null?`—`:`${f}${S(o.peak)}`})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Mode`}),(0,X.jsx)(`dd`,{children:ie[a.mode]})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Compacts at`}),(0,X.jsx)(`dd`,{children:a.autoCompactAt===null?`—`:`≈${S(a.autoCompactAt)}`})]})]}),(0,X.jsxs)(`p`,{className:Y.muted,children:[a.source===null?a.window===null?`Window unknown for this chat.`:`Window as stored when this chat was created; how it was known was not recorded.`:`Window ${x(a.source,e.engine)}.`,o.turns>0&&!o.exact?` Figures marked ≤ are upper bounds: the CLI reported only turn totals.`:``]}),(0,X.jsx)(`p`,{className:Y.muted,children:e.memoryEnabled===!0?e.engine===`local`?`Shared project memory was given to this chat’s agent when it started.`:`Shared project memory was given to this chat’s agent when it started: a block of up to ${ue/1024} KB in its system prompt, re-sent every turn (cached after the first), plus the agent’s own reads and updates of MEMORY.md — a little of this seat’s usage.`:`This chat started without shared project memory.`}),u===null?null:(0,X.jsx)(`p`,{role:`status`,className:Y.idleWarn,children:u.local?`Idle for ${T(u.idleMs)}: the local model has likely dropped this chat from its cache, so the next turn re-processes ~${S(u.tokens)} tokens before it replies — time, not spend.`:`Idle for ${T(u.idleMs)}, past the ~1 h prompt-cache lifetime: the next turn likely re-reads ~${S(u.tokens)} tokens uncached, at full price.`})]})}function Oe({projectPath:e,refreshKey:t}){let n=(0,J.useId)();return e?(0,X.jsx)(Ne,{projectPath:e,refreshKey:t},e):(0,X.jsxs)(`section`,{className:q.memory,"aria-labelledby":n,children:[(0,X.jsx)(`h3`,{id:n,className:q.memoryHead,children:`Project memory`}),(0,X.jsx)(`p`,{className:q.hint,children:`Open a chat to see the memory its project shares across seats.`})]})}var ke=`Saving writes MEMORY.md for this project. Every seat on it reads this file.`,Ae=`Clearing empties MEMORY.md for every chat on this project.`,je=`This changes whether new chats on this project are given shared memory.`,Me=`This changes whether new chats on ANY project are given shared memory.`;function Ne({projectPath:e,refreshKey:t}){let n=(0,J.useId)(),c=(0,J.useId)(),l=(0,J.useId)(),u=(0,J.useMemo)(()=>re(e),[e]),d=i(u),f=r(u),p=i(ne),m=ve(),h=ee(e),[g,_]=(0,J.useState)(`view`),[v,y]=(0,J.useState)(``),[b,x]=(0,J.useState)(``),[S,C]=(0,J.useState)(!1),[w,T]=(0,J.useState)(null),[E,D]=(0,J.useState)(null),[A,j]=(0,J.useState)(null),[ie,M]=(0,J.useState)(null),N=(0,J.useRef)(null),ue=(0,J.useRef)(t);(0,J.useEffect)(()=>{t!==ue.current&&(ue.current=t,f())},[t,f]),(0,J.useEffect)(()=>{let e=N.current;g===`edit`&&e&&(e.focus(),e.setSelectionRange(e.value.length,e.value.length))},[g]);let[I,L]=(0,J.useState)(null);(0,J.useEffect)(()=>{I!==null&&d.status===`success`&&L(null)},[I,d.status]);let R=I!==null&&d.status!==`success`?I:d.data,z=d.error instanceof o&&d.error.status===404,B=p.data?!p.data.memory.enabled:!1,me=(0,J.useMemo)(()=>fe(v),[v]),V=me>ce,he=(0,J.useMemo)(()=>le({projectPath:e,content:v}),[e,v]),H=!V&&he>de,ge=g===`edit`?pe(v):null,U=g===`edit`&&S?ae(v):0;function W(e,t){y(e),x(e),C(t),T(null),j(null),M(null),_(`edit`)}async function _e(t=!1){if(!E){D(`saving`),j(null);try{let n=await te(e);if(!t&&n.content!==b){T(n);return}let r=await m.run(ke,()=>k(e,v));if(r===null)return;L(r),T(null),_(`view`),M(r.content.length===0?`Saved — MEMORY.md is now empty.`:`Saved.`)}catch(e){j(G(e))}finally{D(null)}}}async function ye(){if(!E){D(`clearing`),j(null);try{let t=await m.run(Ae,()=>k(e,``));if(t===null)return;L(t),_(`view`),M(`Cleared. Agents start MEMORY.md afresh on their next write.`)}catch(e){j(G(e))}finally{D(null)}}}async function be(t){if(!E){D(`toggling`),j(null),M(null);try{await m.run(je,()=>O({projectPath:e,memoryEnabled:t}))!==null&&M(t?`New chats on ${h} will get shared memory. Chats already open keep what they started with.`:`New chats on ${h} will start without shared memory. The file is kept.`)}catch(e){j(G(e))}finally{D(null)}}}async function xe(e){if(!E){D(`toggling`),j(null),M(null);try{await m.run(Me,()=>O({memoryEnabled:e}))}catch(e){j(G(e))}finally{D(null)}}}let Se=R?B?`off everywhere`:R.enabled?`on`:`off`:null;return(0,X.jsxs)(`section`,{className:q.memory,"aria-labelledby":n,"data-project":e,children:[(0,X.jsxs)(`h3`,{id:n,className:q.memoryHead,children:[(0,X.jsx)(`span`,{children:`Project memory`}),Se?(0,X.jsx)(`span`,{className:q.memoryState,children:Se}):null,z?null:(0,X.jsx)(`button`,{type:`button`,className:q.memoryHeadAction,onClick:f,"aria-label":`Refresh project memory`,children:`Refresh`})]}),(0,X.jsxs)(`p`,{className:q.hint,children:[`One `,(0,X.jsx)(`code`,{children:`MEMORY.md`}),` shared by every chat on `,(0,X.jsx)(`strong`,{title:e,children:h}),`, whichever seat runs it. Agents keep it current — decisions and why, conventions, gotchas, plan status.`]}),z?(0,X.jsxs)(`p`,{className:q.hint,children:[`This server has no project memory yet — update Ashlr and restart `,(0,X.jsx)(`code`,{children:`ashlr verse`}),`.`]}):d.status===`loading`||d.status===`idle`&&!R?(0,X.jsxs)(`div`,{"aria-busy":`true`,children:[(0,X.jsx)(a,{width:`80%`}),(0,X.jsx)(a,{width:`60%`}),(0,X.jsx)(a,{width:`70%`})]}):R?(0,X.jsxs)(X.Fragment,{children:[B?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`Shared memory is off for every project, so new chats start without it.`}),(0,X.jsx)(`div`,{className:q.memoryActions,children:(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,disabled:E!==null,onClick:()=>void xe(!0),children:`Turn memory on`})})]}):(0,X.jsx)(Te,{checked:R.enabled,disabled:E!==null||!p.data,onChange:e=>void be(e),label:`Give new chats on ${h} this memory`}),g===`edit`?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`label`,{className:q.label,htmlFor:c,children:`Edit MEMORY.md`}),(0,X.jsx)(`textarea`,{id:c,ref:N,className:q.textarea,value:v,rows:12,spellCheck:!1,"aria-describedby":l,"aria-invalid":V||H?!0:void 0,onChange:e=>y(e.target.value)}),(0,X.jsxs)(`p`,{id:l,className:`${q.hint} ${q.counter} ${V||H?q.counterOver:``}`,children:[P(me),` of `,P(ce),V?` — over the limit; trim it to save.`:``,H?` — ${P(he)} once line breaks and quotes are encoded for sending, over the ${P(de)} request limit; trim it to save.`:``]}),ge?(0,X.jsxs)(`p`,{className:q.warn,role:`alert`,children:[`This looks like it contains `,ge,`. MEMORY.md is sent to every seat’s model — remove it before saving.`]}):null,U>0?(0,X.jsxs)(`p`,{className:q.warn,role:`alert`,children:[U===1?`One`:U,` `,(0,X.jsx)(`code`,{children:oe}),` placeholder`,U===1?` stands`:`s stand`,` in for secret-looking text that is still in MEMORY.md. Saving `,U===1?`it`:`them`,` would replace the real value`,U===1?``:`s`,`, so Save stays off until `,U===1?`it is`:`they are`,` gone. Deleting a placeholder drops that value from the file; to keep it, edit MEMORY.md directly under `,(0,X.jsx)(`code`,{children:`~/.ashlr/verse/memory`}),`.`]}):S?(0,X.jsxs)(`p`,{className:q.hint,children:[`This copy was sanitized for the browser, so a home-folder path appears as `,(0,X.jsx)(`code`,{children:`~`}),`. Saving writes the text as shown; `,(0,X.jsx)(`code`,{children:`~`}),` names the same folder for every reader.`]}):null,w?(0,X.jsxs)(`div`,{className:q.warn,role:`alert`,children:[(0,X.jsxs)(`p`,{className:q.hint,children:[`An agent changed MEMORY.md while you were editing`,F(w.updatedAt)?` (${F(w.updatedAt)})`:``,`.`]}),(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,disabled:E!==null||U>0,onClick:()=>void _e(!0),children:`Overwrite with mine`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,disabled:E!==null,onClick:()=>W(w.content,w.contentSanitized===!0),children:`Start over from theirs`})]})]}):null,(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.primary} ${q.small}`,disabled:E!==null||V||H||v===b||w!==null||U>0,onClick:()=>void _e(!1),children:E===`saving`?`Saving…`:`Save`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,disabled:E===`saving`,onClick:()=>{_(`view`),T(null),j(null)},children:`Cancel`})]})]}):R.content.length===0?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`MEMORY.md is empty. Agents add to it as they work, or write the first entries yourself.`}),(0,X.jsx)(`div`,{className:q.memoryActions,children:(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:()=>W(``,!1),children:`Write it`})})]}):(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`pre`,{className:q.memoryBody,tabIndex:0,"aria-label":`MEMORY.md for ${h}`,children:R.content}),(0,X.jsxs)(`p`,{className:`${q.hint} ${q.memoryMeta}`,children:[(0,X.jsx)(`span`,{children:P(R.bytes)}),F(R.updatedAt)?(0,X.jsxs)(`span`,{children:[`updated `,F(R.updatedAt)]}):null]}),R.contentSanitized?(0,X.jsxs)(`p`,{className:q.hint,children:[`Shown sanitized for the browser: a home-folder path appears as `,(0,X.jsx)(`code`,{children:`~`}),` and secret-looking text as`,` `,(0,X.jsx)(`code`,{children:oe}),`.`,ae(R.content)>0?` The real values are still in the file.`:``]}):null,g===`confirm-clear`?(0,X.jsxs)(`div`,{className:q.warn,role:`alert`,children:[(0,X.jsxs)(`p`,{className:q.hint,children:[`Clear MEMORY.md for `,h,`? Every chat on this project loses what it says. Other files in the folder stay.`]}),(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small} ${q.danger}`,disabled:E!==null,onClick:()=>void ye(),children:E===`clearing`?`Clearing…`:`Clear it`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,onClick:()=>_(`view`),children:`Keep`})]})]}):(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:()=>W(R.content,R.contentSanitized===!0),children:`Edit`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,onClick:()=>{M(null),_(`confirm-clear`)},children:`Clear…`})]})]}),R.files.length>0?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`span`,{className:q.label,children:`Also in this folder`}),(0,X.jsx)(`ul`,{className:q.memoryFiles,children:R.files.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsx)(`code`,{children:e})},e))})]}):null,ie?(0,X.jsx)(`p`,{className:q.hint,role:`status`,children:ie}):null,A?(0,X.jsx)(`p`,{className:q.error,role:`alert`,children:A}):null,(0,X.jsxs)(`details`,{children:[(0,X.jsx)(`summary`,{className:q.hint,children:`How project memory works`}),(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`Claude, Codex and local seats can read and edit the file. Grok’s CLI can reach only its working folder, so a Grok seat is given the text and can only read it.`}),(0,X.jsx)(`p`,{className:q.hint,children:`A chat copies the memory into its instructions when it starts, so every turn re-sends the same prefix and the provider’s prompt cache keeps working. Chats already open see your edits when they next read the file; the switch above applies to new chats.`}),(0,X.jsxs)(`p`,{className:q.hint,children:[`It lives on this machine under `,(0,X.jsx)(`code`,{children:`~/.ashlr/verse/memory`}),`, readable only by you. It is sent to every seat’s model, so never put secrets in it.`]}),(0,X.jsx)(`p`,{className:q.hint,children:se}),B?null:(0,X.jsxs)(`p`,{className:q.hint,children:[`Memory is on for every project unless switched off per project.`,` `,(0,X.jsx)(`button`,{type:`button`,className:q.link,disabled:E!==null,onClick:()=>void xe(!1),children:`Turn it off for every project`})]})]})]})]}):(0,X.jsxs)(`div`,{className:q.searchError,role:`alert`,children:[(0,X.jsxs)(`span`,{children:[`Could not read this project’s memory: `,G(d.error)]}),(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:f,children:`Retry`})]}),(0,X.jsx)(s,{open:m.dialog.open,reason:m.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:m.dialog.onClose,onUnlocked:m.dialog.onUnlocked})]})}var Z={roots:`_roots_afeac_8`,title:`_title_afeac_10`,count:`_count_afeac_22`,workspace:`_workspace_afeac_30`,list:`_list_afeac_36`,root:`_root_afeac_8`,rootHead:`_rootHead_afeac_57`,name:`_name_afeac_64`,badge:`_badge_afeac_72`,path:`_path_afeac_84`,git:`_git_afeac_97`,remote:`_remote_afeac_98`,caveat:`_caveat_afeac_99`,note:`_note_afeac_116`,error:`_error_afeac_117`};function Pe({session:e,data:t,error:n=null}){return!e||t!==null&&t.roots.length<=1&&t.workspaceId===null?null:(0,X.jsxs)(`section`,{className:Z.roots,"aria-labelledby":`verse-res-roots`,children:[(0,X.jsxs)(`h3`,{id:`verse-res-roots`,className:Z.title,children:[`Folders`,t?(0,X.jsx)(`span`,{className:Z.count,children:t.roots.length}):null]}),t?.workspaceName?(0,X.jsxs)(`p`,{className:Z.workspace,children:[`Workspace `,(0,X.jsx)(`strong`,{children:t.workspaceName})]}):null,n?(0,X.jsx)(`p`,{role:`alert`,className:Z.error,children:n}):null,(0,X.jsx)(`ul`,{className:Z.list,children:(t?.roots??[]).map(e=>{let t=I(e),n=R(e);return(0,X.jsxs)(`li`,{className:Z.root,"data-tone":L(e),children:[(0,X.jsxs)(`div`,{className:Z.rootHead,children:[(0,X.jsx)(`span`,{className:Z.name,children:e.name}),(0,X.jsx)(`span`,{className:Z.badge,children:e.primary?`primary`:`added`})]}),(0,X.jsx)(`p`,{className:Z.path,title:e.path,children:he(e.path)}),(0,X.jsx)(`p`,{className:Z.git,children:t??`not a git repo`}),e.git?.remote?(0,X.jsx)(`p`,{className:Z.remote,children:e.git.remote}):null,n?(0,X.jsx)(`p`,{className:Z.caveat,children:n}):null]},e.path)})}),(t?.notes??[]).map(e=>(0,X.jsx)(`p`,{className:Z.note,children:e},e))]})}var Q={pane:`_pane_1f7em_6`,section:`_section_1f7em_13`,sectionTitle:`_sectionTitle_1f7em_19`,count:`_count_1f7em_31`,muted:`_muted_1f7em_37`,action:`_action_1f7em_43`,hint:`_hint_1f7em_46`,reserve:`_reserve_1f7em_54`,link:`_link_1f7em_73`,task:`_task_1f7em_74`,taskList:`_taskList_1f7em_88`,taskMark:`_taskMark_1f7em_113`,"pane-pulse":`_pane-pulse_1f7em_1`,taskName:`_taskName_1f7em_125`,taskDetail:`_taskDetail_1f7em_134`,taskTime:`_taskTime_1f7em_142`,engineTick:`_engineTick_1f7em_152`},Fe=3e4;function Ie(e){let[t,n]=(0,J.useState)(()=>Date.now());return(0,J.useEffect)(()=>{if(!e)return;n(Date.now());let t=setInterval(()=>n(Date.now()),Fe);return()=>clearInterval(t)},[e]),t}function Le({session:e,seats:t,events:n,roots:r,rootsError:i,onHandoff:a,handoffDisabledReason:o=null,onOpenAccounts:s,visible:c}){let l=Ie(c&&e!==null);return(0,X.jsxs)(`div`,{className:Q.pane,"aria-label":`Context`,children:[(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-context-chat`,children:[(0,X.jsx)(`h3`,{id:`dock-context-chat`,className:Q.sectionTitle,children:`This chat`}),e?(0,X.jsx)(De,{session:e,seats:t,events:n,now:l}):(0,X.jsx)(`p`,{className:Q.muted,children:`Open a chat to see its usage and context.`})]}),e?(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(Pe,{session:e,data:r,error:i})}):null,e&&a?(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-context-handoff`,children:[(0,X.jsx)(`h3`,{id:`dock-context-handoff`,className:Q.sectionTitle,children:`Handoff`}),(0,X.jsx)(`p`,{className:Q.muted,children:`Verse drafts a note from this chat's log — free — and opens a fresh chat with it in the message box. Nothing is sent until you press Send.`}),(0,X.jsx)(`button`,{type:`button`,className:Q.action,onClick:a,disabled:o!==null,title:o??void 0,children:`Continue in a fresh chat…`}),(0,X.jsx)(`p`,{className:`${Q.muted} ${Q.reserve}`,children:o??``})]}):null,(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(Oe,{projectPath:e?.projectPath??null,refreshKey:e?.turnCount??0})}),(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(`button`,{type:`button`,className:Q.link,onClick:s,children:`Accounts & capacity →`})})]})}var $={dock:`_dock_10ssf_8`,sheetLayer:`_sheetLayer_10ssf_25`,scrim:`_scrim_10ssf_37`,"dock-fade":`_dock-fade_10ssf_1`,"dock-in-right":`_dock-in-right_10ssf_1`,"dock-in-up":`_dock-in-up_10ssf_1`,grabber:`_grabber_10ssf_64`,head:`_head_10ssf_75`,tabs:`_tabs_10ssf_86`,tabWrap:`_tabWrap_10ssf_97`,tab:`_tab_10ssf_86`,tabClose:`_tabClose_10ssf_135`,headActions:`_headActions_10ssf_156`,iconButton:`_iconButton_10ssf_162`,plus:`_plus_10ssf_179`,body:`_body_10ssf_185`,pane:`_pane_10ssf_191`,splitHandle:`_splitHandle_10ssf_200`,widthHandle:`_widthHandle_10ssf_220`};function Re(e){let t=W(e)?.keys[0];return t?f(t):null}var ze=16,Be=64,Ve=.05;function He(e){let{presentation:t,windowWidth:n,columnWidth:r}=e,{state:i,requests:a}=v(),o=(0,J.useRef)(null),s=(0,J.useRef)(new Map),c=(0,J.useId)(),[f,p]=(0,J.useState)(null),[_,b]=(0,J.useState)(()=>new Set(i.open&&i.active?[i.active]:[])),x=i.tabs.filter(Ce),S=i.active!==null&&x.includes(i.active)?i.active:x[0]??null,C=i.splitWith!==null&&x.includes(i.splitWith)&&i.splitWith!==S?i.splitWith:null,w=i.open&&S!==null,T=t!==`column`;(0,J.useEffect)(()=>{w&&b(e=>{let t=[S,C].filter(e=>e!==null),n=new Set([...e].filter(e=>x.includes(e)));for(let e of t)n.add(e);return n.size===e.size&&[...n].every(t=>e.has(t))?e:n})},[w,S,C,x.join(`|`)]),(0,J.useEffect)(()=>{if(!w||!T)return;let e=document.activeElement;return o.current?.focus({preventScroll:!0}),()=>{e&&document.contains(e)&&e.focus({preventScroll:!0})}},[w,T]);let E=(0,J.useCallback)(e=>{if(!T)return;let t=e.target instanceof Element&&e.target.closest(`[data-dock-pane="terminal"]`)!==null;if(e.key===`Escape`&&!t&&!e.defaultPrevented){e.preventDefault(),g();return}if(e.key!==`Tab`||t)return;let n=o.current;if(!n)return;let r=Array.from(n.querySelectorAll(`button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex="-1"])`)).filter(e=>!e.closest(`[hidden]`));if(r.length===0)return;let i=r[0],a=r[r.length-1];e.shiftKey&&document.activeElement===i?(e.preventDefault(),a.focus()):!e.shiftKey&&document.activeElement===a&&(e.preventDefault(),i.focus())},[T]);if(!w)return null;function ee(e,t){let n=x.indexOf(t),r;if(e.key===`ArrowRight`)r=x[(n+1)%x.length];else if(e.key===`ArrowLeft`)r=x[(n-1+x.length)%x.length];else if(e.key===`Home`)r=x[0];else if(e.key===`End`)r=x[x.length-1];else if((e.key===`Delete`||e.key===`Backspace`)&&x.length>0){e.preventDefault(),h(t);return}r&&(e.preventDefault(),m(r),s.current.get(r)?.focus())}let D=u.map(e=>e.id).filter(e=>Ce(e)&&!x.includes(e)),te=D.map(e=>({id:e,label:K[e],icon:H[e]({}),onSelect:()=>m(e)})),O=[...u.map(e=>e.id).filter(e=>Ce(e)&&e!==S).map(e=>({id:e,label:`${K[e]} below`,icon:H[e]({}),onSelect:()=>y(e)})),...C?[{id:`unsplit`,label:`One pane`,separated:!0,onSelect:()=>y(null)}]:[]],k=Re(`dock.toggle`),ne=t===`column`?r:l(i.width,n),re=`Dock: ${K[S]}${C?` over ${K[C]}`:``}`,A=(0,X.jsxs)(`aside`,{ref:o,className:$.dock,"data-presentation":t,"data-split":C?`true`:void 0,"aria-label":re,role:T?`dialog`:`complementary`,"aria-modal":T?!0:void 0,tabIndex:-1,style:t===`bottom-sheet`?{height:`${d.bottomSheetHeightVh}vh`}:{width:ne},onKeyDown:E,children:[t===`column`?(0,X.jsx)(We,{width:ne,windowWidth:n}):null,t===`bottom-sheet`?(0,X.jsx)(`span`,{className:$.grabber,"aria-hidden":`true`}):null,(0,X.jsxs)(`div`,{className:$.head,children:[(0,X.jsx)(`div`,{className:$.tabs,role:`tablist`,"aria-label":`Dock panes`,children:x.map(e=>{let t=H[e],n=e===S,r=e===C;return(0,X.jsxs)(`div`,{className:$.tabWrap,"data-selected":n||void 0,"data-below":r||void 0,children:[(0,X.jsxs)(`button`,{ref:t=>{t?s.current.set(e,t):s.current.delete(e)},type:`button`,role:`tab`,id:`${c}-tab-${e}`,"aria-selected":n,"aria-controls":`${c}-pane-${e}`,tabIndex:n?0:-1,className:$.tab,onClick:()=>m(e),onKeyDown:t=>ee(t,e),title:r?`${K[e]} (lower pane)`:void 0,children:[(0,X.jsx)(t,{size:14}),(0,X.jsx)(`span`,{className:$.tabLabel,children:K[e]})]}),(0,X.jsx)(`button`,{type:`button`,className:$.tabClose,"aria-label":`Close ${K[e]}`,title:`Close ${K[e]}`,tabIndex:-1,onClick:()=>h(e),children:(0,X.jsx)(U,{size:12})})]},e)})}),(0,X.jsxs)(`div`,{className:$.headActions,children:[(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":`Add a pane`,title:D.length>0?`Add a pane`:`Every pane is already open`,"aria-haspopup":`menu`,"aria-expanded":f?.kind===`add`,disabled:D.length===0,onClick:e=>p({kind:`add`,anchor:z(e.currentTarget),from:e.currentTarget}),children:(0,X.jsx)(`span`,{className:$.plus,"aria-hidden":`true`,children:`+`})}),t!==`bottom-sheet`&&O.length>0?(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":C?`Split: change or undo`:`Split the dock`,title:C?`Change the split`:`Split: show a second pane below`,"aria-haspopup":`menu`,"aria-expanded":f?.kind===`split`,"aria-pressed":C!==null,onClick:e=>p({kind:`split`,anchor:z(e.currentTarget),from:e.currentTarget}),children:(0,X.jsx)(ge,{size:14})}):null,(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":`Close the dock`,title:`Close the dock${k?` (${k})`:``}`,onClick:g,children:(0,X.jsx)(U,{size:14})})]})]}),(0,X.jsxs)(`div`,{className:$.body,children:[x.filter(e=>_.has(e)||e===S||e===C).map(n=>{let r=n===S||n===C&&t!==`bottom-sheet`,o=n===S?`top`:n===C?`bottom`:`hidden`;return(0,X.jsx)(`div`,{id:`${c}-pane-${n}`,role:`tabpanel`,"aria-labelledby":`${c}-tab-${n}`,className:$.pane,"data-dock-pane":n,"data-position":r?o:`hidden`,hidden:!r,inert:!r,style:r&&C&&t!==`bottom-sheet`?{flexBasis:`${(o===`top`?i.splitRatio:1-i.splitRatio)*100}%`,order:o===`top`?0:2}:void 0,children:(0,X.jsx)(Ue,{pane:n,visible:r,...e,requests:a})},n)}),C&&t!==`bottom-sheet`?(0,X.jsx)(Ge,{ratio:i.splitRatio,lower:K[C]}):null]}),f?(0,X.jsx)(B,{label:f.kind===`add`?`Add a pane`:`Split the dock`,items:f.kind===`add`?te:O,anchor:f.anchor,returnFocus:f.from,onClose:()=>p(null)}):null]});return T?(0,X.jsxs)(`div`,{className:$.sheetLayer,"data-presentation":t,children:[(0,X.jsx)(`button`,{type:`button`,className:$.scrim,"aria-label":`Close the dock`,tabIndex:-1,onClick:g}),A]}):A}function Ue({pane:e,visible:t,sessionId:n,roots:r,turnFiles:i,onSendToChat:a,onAddToMessage:o,renderTasks:s,renderContext:c,requests:l}){if(e===`tasks`)return(0,X.jsx)(X.Fragment,{children:s(t)});if(e===`context`)return(0,X.jsx)(X.Fragment,{children:c(t)});if(n===null){let t=Re(`chat.new`);return(0,X.jsx)(ye,{compact:!0,title:`Open a chat to use ${K[e]}`,body:`Pick a chat in the sidebar${t?` or start one with ${t}`:``}. ${K[e]} works in that chat's folders.`})}switch(e){case`terminal`:return(0,X.jsx)(be,{sessionId:n,roots:r,request:l.terminal,onSendToChat:a,visible:t});case`preview`:return(0,X.jsx)(Se,{sessionId:n,roots:r,request:l.preview,visible:t,onOpenTerminal:_});case`diff`:return(0,X.jsx)(xe,{sessionId:n,roots:r,request:l.diff,turnFiles:i,onAddToMessage:o,visible:t});default:return null}}function We({width:e,windowWidth:t}){let n=Math.max(d.minWidth,Math.floor(t*d.maxWidthFraction)),r=(0,J.useRef)(null),[i,a]=(0,J.useState)(!1);function o(t){t.button===0&&(t.preventDefault(),r.current={startX:t.clientX,startWidth:e},t.currentTarget.setPointerCapture?.(t.pointerId),a(!0),document.body.setAttribute(`data-verse-resizing`,`true`))}function s(e){let n=r.current;n&&p(l(n.startWidth+(n.startX-e.clientX),t))}function c(){r.current=null,a(!1),document.body.removeAttribute(`data-verse-resizing`)}(0,J.useEffect)(()=>()=>document.body.removeAttribute(`data-verse-resizing`),[]);function u(r){let i=r.shiftKey?Be:ze,a=null;r.key===`ArrowLeft`?a=e+i:r.key===`ArrowRight`?a=e-i:r.key===`Home`?a=d.minWidth:r.key===`End`&&(a=n),a!==null&&(r.preventDefault(),p(l(a,t)))}return(0,X.jsx)(`div`,{className:$.widthHandle,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize the dock`,"aria-valuemin":d.minWidth,"aria-valuemax":n,"aria-valuenow":Math.round(e),tabIndex:0,"data-dragging":i||void 0,onPointerDown:o,onPointerMove:s,onPointerUp:c,onPointerCancel:c,onLostPointerCapture:c,onDoubleClick:()=>p(d.defaultWidth),onKeyDown:u})}function Ge({ratio:e,lower:t}){let n=(0,J.useRef)(null),r=(0,J.useRef)(null);function i(e){if(e.button!==0)return;let t=n.current?.parentElement;if(!t)return;e.preventDefault();let i=t.getBoundingClientRect();r.current={top:i.top,height:i.height},e.currentTarget.setPointerCapture?.(e.pointerId)}function a(e){let t=r.current;!t||t.height<=0||b((e.clientY-t.top)/t.height)}function o(t){t.key===`ArrowUp`?(t.preventDefault(),b(e-Ve)):t.key===`ArrowDown`&&(t.preventDefault(),b(e+Ve))}return(0,X.jsx)(`div`,{ref:n,className:$.splitHandle,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`Resize: ${t} below`,"aria-valuemin":Math.round(d.splitRatio.min*100),"aria-valuemax":Math.round(d.splitRatio.max*100),"aria-valuenow":Math.round(e*100),tabIndex:0,style:{order:1},onPointerDown:i,onPointerMove:a,onPointerUp:()=>{r.current=null},onPointerCancel:()=>{r.current=null},onDoubleClick:()=>b(d.splitRatio.default),onKeyDown:o})}var Ke=20,qe={running:`running`,done:`done`,failed:`failed`};function Je({turnTasks:e,otherChats:t,hasSession:n,onOpenSession:r}){let i=W(`chat.new`)?.keys[0],a=i?f(i):null,o=e.filter(e=>e.status===`running`),s=e.filter(e=>e.status!==`running`).slice(0,Ke);return(0,X.jsxs)(`div`,{className:Q.pane,"aria-label":`Tasks`,children:[(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-tasks-turn`,children:[(0,X.jsxs)(`h3`,{id:`dock-tasks-turn`,className:Q.sectionTitle,children:[`This chat `,(0,X.jsx)(`span`,{className:Q.count,children:o.length>0?`${o.length} running`:``})]}),n?e.length===0?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`p`,{className:Q.muted,children:`No tool calls in the latest turn.`}),(0,X.jsx)(`p`,{className:Q.hint,children:`Send a message: each tool the agent runs shows up here, and a click jumps to it in the chat.`})]}):(0,X.jsx)(`ul`,{className:Q.taskList,children:[...o,...s].map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,className:Q.task,"data-status":e.status,onClick:()=>{Ee(me(e.toolUseId))},"aria-label":`${e.kind===`subagent`?`Subagent`:e.name}: ${e.detail}, ${qe[e.status]}. Jump to it in the chat.`,children:[(0,X.jsx)(`span`,{className:Q.taskMark,"data-status":e.status,"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:Q.taskName,title:e.kind===`subagent`?`Subagent`:e.name,children:e.kind===`subagent`?`Subagent`:e.name}),(0,X.jsx)(`span`,{className:Q.taskDetail,title:e.detail,children:e.detail}),(0,X.jsx)(`span`,{className:Q.taskTime,children:e.status===`running`?(0,X.jsx)(V,{since:e.startedAt}):e.status===`failed`?`failed`:e.durationMs!==null&&e.durationMs>0?C(e.durationMs):`done`})]})},e.toolUseId))}):(0,X.jsx)(`p`,{className:Q.muted,children:`Open a chat to see its tool calls here.`})]}),(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-tasks-chats`,children:[(0,X.jsxs)(`h3`,{id:`dock-tasks-chats`,className:Q.sectionTitle,children:[`Other chats `,(0,X.jsx)(`span`,{className:Q.count,children:t.length>0?`${t.length} running`:``})]}),t.length===0?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`p`,{className:Q.muted,children:`No other chat is running.`}),(0,X.jsxs)(`p`,{className:Q.hint,children:[a?`Start another with ${a}`:`Start another chat`,` and it shows here while it works, one click away.`]})]}):(0,X.jsx)(`ul`,{className:Q.taskList,children:t.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,className:Q.task,"data-status":`running`,onClick:()=>r(e.sessionId),"aria-label":`${e.title||`Untitled chat`}, running${e.live?`: ${e.live}`:``}. Open this chat.`,children:[(0,X.jsx)(Ye,{engine:e.engine}),(0,X.jsx)(`span`,{className:Q.taskName,title:e.title||`Untitled chat`,children:e.title||`Untitled chat`}),(0,X.jsx)(`span`,{className:Q.taskDetail,title:e.live??void 0,children:e.live??``}),(0,X.jsx)(`span`,{className:Q.taskTime,children:e.startedAt?(0,X.jsx)(V,{since:e.startedAt}):`running`})]})},e.sessionId))})]})]})}function Ye({engine:e}){return(0,X.jsx)(`span`,{className:Q.engineTick,"data-engine":e,"aria-hidden":`true`,children:(0,X.jsx)(c,{engine:e,size:12})})}function Xe(e){let{session:t,seats:n,events:r,rootsData:i,rootsError:a,otherRunning:o,dispatchEnabled:s,onOpenSession:c,onHandoff:l,onOpenAccounts:u}=e,d=s?t?.status===`running`?`Available when the current turn finishes.`:null:`Sending is disabled on this server.`;return(0,X.jsx)(He,{presentation:e.presentation,windowWidth:e.windowWidth,columnWidth:e.columnWidth,sessionId:t?.id??null,roots:e.roots,turnFiles:e.turnFiles,onSendToChat:e.onSendToChat,onAddToMessage:e.onAddToMessage,renderTasks:()=>(0,X.jsx)(Ze,{sessionId:t?.id??null,otherChats:o,onOpenSession:c}),renderContext:e=>(0,X.jsx)(Le,{session:t,seats:n,events:r,roots:i,rootsError:a,visible:e,onHandoff:t?()=>l(t.id):void 0,handoffDisabledReason:d,onOpenAccounts:u})})}function Ze({sessionId:e,otherChats:t,onOpenSession:n}){let r=we(e),i=(0,J.useMemo)(()=>_e(r.items),[r.items]);return(0,X.jsx)(Je,{turnTasks:i,otherChats:t,hasSession:e!==null,onOpenSession:n})}export{Xe as DockHost};
|
|
2
|
+
//# sourceMappingURL=DockHost-aWP7liri.js.map
|