|
7 | 7 | @{ |
8 | 8 | var isCompleted = IsCompleted; |
9 | 9 | var cardClass = Session.IsProcessing ? "processing" : isCompleted ? "completed" : "idle"; |
| 10 | + var isCopilot = Session.Kind == SessionKind.Copilot; |
10 | 11 | } |
11 | 12 | <div class="expanded-card @cardClass" data-session="@Session.Name"> |
12 | 13 | <div class="chat-header"> |
|
16 | 17 | { |
17 | 18 | <span class="processing-dot"></span> |
18 | 19 | } |
19 | | - @if (Session.ReflectionCycle is { IsActive: true, IsPaused: false } rc) |
| 20 | + @if (isCopilot && Session.ReflectionCycle is { IsActive: true, IsPaused: false } rc) |
20 | 21 | { |
21 | 22 | var progress = rc.MaxIterations > 0 ? (double)rc.CurrentIteration / rc.MaxIterations * 100 : 0; |
22 | 23 | var truncGoal = rc.Goal.Length > 25 ? rc.Goal[..22] + "…" : rc.Goal; |
|
25 | 26 | <span class="reflection-pill-text">🔄 @rc.CurrentIteration/@rc.MaxIterations · @truncGoal</span> |
26 | 27 | </button> |
27 | 28 | } |
28 | | - else if (Session.ReflectionCycle is { IsPaused: true } rp) |
| 29 | + else if (isCopilot && Session.ReflectionCycle is { IsPaused: true } rp) |
29 | 30 | { |
30 | 31 | <span class="reflection-pill paused" data-tooltip="@rp.Goal — Paused"> |
31 | 32 | ⏸️ Paused @rp.CurrentIteration/@rp.MaxIterations |
|
48 | 49 | var q = UsageInfo.PremiumQuota; |
49 | 50 | <div class="info-row"><span class="info-label">Premium</span><span class="info-value">@(q.IsUnlimited ? "Unlimited" : $"{q.EntitlementRequests - q.UsedRequests}/{q.EntitlementRequests} remaining")</span></div> |
50 | 51 | } |
51 | | - @if (Session.SessionId != null && PlatformHelper.IsDesktop) |
| 52 | + @if (isCopilot && Session.SessionId != null && PlatformHelper.IsDesktop) |
52 | 53 | { |
53 | 54 | <button class="info-action" @onclick="() => OpenSessionFolder(Session.SessionId)" @onclick:stopPropagation="true">📂 Open session folder</button> |
54 | 55 | } |
55 | 56 | </div> |
56 | 57 | </div> |
57 | | - <button class="icon-badge fiesta-btn @(FiestaActive ? "active" : "")" |
58 | | - data-tooltip="Fiesta workers" |
59 | | - @onclick="ToggleFiestaPicker">🎉</button> |
| 58 | + @if (isCopilot) |
| 59 | + { |
| 60 | + <button class="icon-badge fiesta-btn @(FiestaActive ? "active" : "")" |
| 61 | + data-tooltip="Fiesta workers" |
| 62 | + @onclick="ToggleFiestaPicker">🎉</button> |
| 63 | + } |
60 | 64 | <button class="icon-badge collapse-card-btn" data-tooltip="Back to grid (Esc / ⌘E)" @onclick="OnCollapse">⊟</button> |
61 | 65 | </div> |
62 | 66 | </div> |
63 | 67 |
|
64 | | - @if (_showFiestaPicker) |
| 68 | + @if (isCopilot && _showFiestaPicker) |
65 | 69 | { |
66 | 70 | <div class="fiesta-panel-inline"> |
67 | 71 | <div class="fiesta-row"> |
|
193 | 197 | <div class="input-status-bar"> |
194 | 198 | <div class="mode-switcher"> |
195 | 199 | <button class="mode-btn @(InputMode == "chat" ? "active" : "")" @onclick='() => OnSetInputMode.InvokeAsync("chat")'>Chat</button> |
196 | | - <button class="mode-btn @(InputMode == "plan" ? "active" : "")" @onclick='() => OnSetInputMode.InvokeAsync("plan")'>Plan</button> |
197 | | - <button class="mode-btn @(InputMode == "autopilot" ? "active" : "")" @onclick='() => OnSetInputMode.InvokeAsync("autopilot")'>Autopilot</button> |
| 200 | + @if (isCopilot) |
| 201 | + { |
| 202 | + <button class="mode-btn @(InputMode == "plan" ? "active" : "")" @onclick='() => OnSetInputMode.InvokeAsync("plan")'>Plan</button> |
| 203 | + <button class="mode-btn @(InputMode == "autopilot" ? "active" : "")" @onclick='() => OnSetInputMode.InvokeAsync("autopilot")'>Autopilot</button> |
| 204 | + } |
198 | 205 |
|
199 | 206 | </div> |
200 | | - @if (Session.ReflectionCycle is null || !Session.ReflectionCycle.IsActive) |
| 207 | + @if (isCopilot && (Session.ReflectionCycle is null || !Session.ReflectionCycle.IsActive)) |
201 | 208 | { |
202 | 209 | <button class="mode-btn" style="margin-left:8px;opacity:0.7" title="Start a reflection cycle" @onclick="InsertReflectCommand">Reflect</button> |
203 | 210 | } |
|
216 | 223 | <span class="skills-trigger" @onclick="ShowAgentsPopup">@availableAgents.Count agents</span> |
217 | 224 | } |
218 | 225 | <span class="status-sep">·</span> |
219 | | - <select class="inline-model-select" value="@CurrentModel" @onchange="e => OnSetModel.InvokeAsync(e.Value?.ToString())" disabled="@Session.IsProcessing" title="@(Session.IsProcessing ? "Wait for response to complete" : "Switch model")"> |
220 | | - @if (!AvailableModels.Contains(CurrentModel)) |
221 | | - { |
222 | | - <option value="@CurrentModel">@PrettifyModel(CurrentModel)</option> |
223 | | - } |
224 | | - @foreach (var m in AvailableModels) |
225 | | - { |
226 | | - <option value="@m">@PrettifyModel(m)</option> |
227 | | - } |
228 | | - </select> |
| 226 | + @if (isCopilot) |
| 227 | + { |
| 228 | + <select class="inline-model-select" value="@CurrentModel" @onchange="e => OnSetModel.InvokeAsync(e.Value?.ToString())" disabled="@Session.IsProcessing" title="@(Session.IsProcessing ? "Wait for response to complete" : "Switch model")"> |
| 229 | + @if (!AvailableModels.Contains(CurrentModel)) |
| 230 | + { |
| 231 | + <option value="@CurrentModel">@PrettifyModel(CurrentModel)</option> |
| 232 | + } |
| 233 | + @foreach (var m in AvailableModels) |
| 234 | + { |
| 235 | + <option value="@m">@PrettifyModel(m)</option> |
| 236 | + } |
| 237 | + </select> |
| 238 | + } |
| 239 | + else |
| 240 | + { |
| 241 | + <span class="status-extra" style="opacity:0.6">✨ Local</span> |
| 242 | + } |
229 | 243 | <div class="status-spacer"></div> |
230 | 244 | <span class="status-extra"> |
231 | 245 | @if (UsageInfo != null) |
|
0 commit comments