Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ submodule.
## [Unreleased]

### Changed
- **Plan mode starts only through /plan.** Ordinary requests run directly, including multi-step tasks and prose outlines. Desktop no longer automatically proposes structured plans based on task complexity or model tool calls. Existing plan review, editing, execution, and recovery remain available. Settings now explain the explicit command instead of offering automatic planning.
- **Update the bundled engine for explicit planning.** Pin the shared engine to 6915e36, including the CLI Git review feature and the opt-in host policy used by Desktop.
- **Update the bundled engine to the RazorConsole 0.6 migration alpha (0.16.0-alpha), based on CLI v0.15.2.** The CLI gains a component-based terminal conversation, persistent prompt, completion popups, and model recovery. Desktop retains its WinUI conversation layout; full CLI migration notes are in `MandoCode/docs/CHANGELOG.md`.

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion MandoCode
Submodule MandoCode updated 99 files
+64 −0 docs/CHANGELOG.md
+106 −0 docs/cli-agent-panes.md
+150 −0 src/MandoCode/Components/AgentFileExplorer.razor
+295 −0 src/MandoCode/Components/AgentGitChanges.razor
+25 −0 src/MandoCode/Components/AgentGridRow.razor
+24 −0 src/MandoCode/Components/AgentGridSlot.razor
+85 −0 src/MandoCode/Components/AgentNavigationBar.razor
+93 −0 src/MandoCode/Components/AgentPaneContent.razor
+6 −5 src/MandoCode/Components/AgentStatus.razor
+54 −0 src/MandoCode/Components/AgentWorkspaceView.razor
+520 −256 src/MandoCode/Components/App.razor
+39 −1 src/MandoCode/Components/ApprovalSelect.razor
+10 −0 src/MandoCode/Components/AsciiArt.razor
+2 −1 src/MandoCode/Components/AutocompletePopup.razor
+10 −88 src/MandoCode/Components/Banner.razor
+138 −12 src/MandoCode/Components/ChatShell.razor
+17 −6 src/MandoCode/Components/CommandSuggestionRow.razor
+20 −6 src/MandoCode/Components/ContextMeterLine.razor
+7 −0 src/MandoCode/Components/ConversationEntry.razor
+19 −4 src/MandoCode/Components/ConversationView.razor
+112 −0 src/MandoCode/Components/DirectoryBrowser.razor
+5 −4 src/MandoCode/Components/FileSuggestionRow.razor
+22 −33 src/MandoCode/Components/HelpDisplay.razor
+7 −6 src/MandoCode/Components/HistoryView.razor
+14 −14 src/MandoCode/Components/HomeView.razor
+4 −3 src/MandoCode/Components/ModelPickerPopup.razor
+94 −0 src/MandoCode/Components/PlanStepEditor.razor
+76 −8 src/MandoCode/Components/PromptInput.razor
+4 −1 src/MandoCode/Components/RenderableContent.razor
+133 −0 src/MandoCode/Components/TerminalWorkspaceView.razor
+7 −4 src/MandoCode/Components/UserPrompt.razor
+28 −0 src/MandoCode/Components/WorkspaceButton.razor
+83 −0 src/MandoCode/Components/WorkspacePicker.razor
+13 −0 src/MandoCode/Components/WorkspaceSurface.razor
+24 −0 src/MandoCode/Components/WorkspaceTab.razor
+21 −0 src/MandoCode/Models/ConfigKeySetter.cs
+46 −0 src/MandoCode/Models/Keybindings.cs
+7 −0 src/MandoCode/Models/MandoCodeConfig.cs
+27 −0 src/MandoCode/Models/SlashCommands.cs
+138 −119 src/MandoCode/Program.cs
+30 −1 src/MandoCode/Services/Ai/AIService.cs
+22 −5 src/MandoCode/Services/Ai/AgentFunctionMiddleware.cs
+28 −1 src/MandoCode/Services/Ai/PlanHandoff.cs
+0 −0 src/MandoCode/Services/Ai/TokenTrackingService.cs
+2 −1 src/MandoCode/Services/Input/CommandAutocomplete.cs
+23 −0 src/MandoCode/Services/Input/FileReferenceToken.cs
+7 −4 src/MandoCode/Services/Input/InputStateMachine.cs
+8 −1 src/MandoCode/Services/Input/InstructionPromptCoordinator.cs
+15 −0 src/MandoCode/Services/Input/PromptComposerState.cs
+62 −0 src/MandoCode/Services/Onboarding/ConfigurationPrompts.cs
+56 −121 src/MandoCode/Services/Onboarding/ConfigurationWizard.cs
+12 −1 src/MandoCode/Services/Onboarding/OnboardingFlow.cs
+147 −0 src/MandoCode/Services/Project/GitChangesService.cs
+0 −0 src/MandoCode/Services/Project/ProjectRootAccessor.cs
+133 −0 src/MandoCode/Services/Rendering/AgentCallsigns.cs
+44 −0 src/MandoCode/Services/Rendering/AgentFileTree.cs
+21 −0 src/MandoCode/Services/Rendering/AgentNaming.cs
+213 −0 src/MandoCode/Services/Rendering/AgentWorkspace.cs
+46 −0 src/MandoCode/Services/Rendering/AsciiArtRenderable.cs
+2 −2 src/MandoCode/Services/Rendering/ContextMeter.cs
+38 −0 src/MandoCode/Services/Rendering/DirectoryPathCaption.cs
+36 −0 src/MandoCode/Services/Rendering/ExplorerFocusScope.cs
+96 −0 src/MandoCode/Services/Rendering/GitPaneStatus.cs
+43 −0 src/MandoCode/Services/Rendering/PaneColors.cs
+5 −4 src/MandoCode/Services/Rendering/SpinnerService.cs
+138 −0 src/MandoCode/Services/Rendering/TerminalPaletteService.cs
+11 −131 src/MandoCode/Services/Rendering/TerminalThemeService.cs
+33 −6 src/MandoCode/Services/Rendering/TuiConsole.cs
+18 −7 src/MandoCode/Services/Rendering/TuiSession.cs
+144 −0 src/MandoCode/Services/Rendering/WorkspaceRegistry.cs
+49 −0 src/MandoCode/Services/Rendering/WorkspaceTabWindow.cs
+0 −0 src/MandoCode/Services/Sessions/SessionResumeStore.cs
+0 −0 src/MandoCode/Services/Shell/ICommandOutputSink.cs
+13 −15 src/MandoCode/Services/Shell/ShellCommandHandler.cs
+0 −0 src/MandoCode/Services/Updates/UpdateCheckService.cs
+0 −0 src/MandoCode/Services/Updates/VersionLabel.cs
+4 −2 src/MandoCode/Translators/TranscriptEntryTranslator.cs
+20 −0 src/MandoCode/Translators/WorkspaceVisibilityTranslator.cs
+51 −0 tests/MandoCode.Tests/AgentFileTreeTests.cs
+361 −0 tests/MandoCode.Tests/AgentWorkspaceTests.cs
+83 −0 tests/MandoCode.Tests/ApprovalSelectTests.cs
+57 −0 tests/MandoCode.Tests/ClipboardCommandTests.cs
+72 −0 tests/MandoCode.Tests/ConfigMenuHistoryTests.cs
+136 −0 tests/MandoCode.Tests/ConfigurationWizardPromptTests.cs
+2 −2 tests/MandoCode.Tests/ContextMeterTests.cs
+87 −0 tests/MandoCode.Tests/DirectoryBrowserTests.cs
+42 −0 tests/MandoCode.Tests/ExplicitPlanningTests.cs
+43 −0 tests/MandoCode.Tests/ExplorerFileReferenceTests.cs
+41 −0 tests/MandoCode.Tests/ExplorerFocusScopeTests.cs
+61 −0 tests/MandoCode.Tests/ExplorerPromptLayoutTests.cs
+24 −0 tests/MandoCode.Tests/GitChangesConfirmationTests.cs
+152 −0 tests/MandoCode.Tests/GitChangesKeyboardTests.cs
+79 −0 tests/MandoCode.Tests/GitChangesServiceTests.cs
+98 −0 tests/MandoCode.Tests/MultiAgentExplorerTests.cs
+112 −0 tests/MandoCode.Tests/PlanChoiceTests.cs
+79 −0 tests/MandoCode.Tests/PlanRedirectionTests.cs
+98 −0 tests/MandoCode.Tests/PlanStepEditorTests.cs
+164 −0 tests/MandoCode.Tests/SetupPromptTests.cs
+776 −0 tests/MandoCode.Tests/WorkspaceRegistryTests.cs
5 changes: 2 additions & 3 deletions src/MandoCode.Desktop/Controls/SettingsForm.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -180,9 +180,8 @@
<ToggleSwitch x:Name="S_AgentCallsigns" Header="Callsign names for new agents"
Toggled="AgentCallsigns_Toggled"
ToolTipService.ToolTip="On (default): each new agent draws a random callsign — Morphy, Kernel, Cloud — from a 500-name deck that does not repeat until it runs dry. Off: new agents are Agent 1, Agent 2, … Renaming a tab always works either way."/>
<ToggleSwitch x:Name="S_TaskPlanning" Header="Task planning (propose_plan for multi-step requests)"
Tag="taskPlanning" Toggled="Setting_Toggled"
ToolTipService.ToolTip="For multi-step requests the model first proposes a numbered plan you approve before any work starts. More predictable on big tasks; an extra step on small ones."/>
<TextBlock Text="Use /plan to create and review a plan before execution."
TextWrapping="Wrap" />
<ToggleSwitch x:Name="S_DiffApprovals" Header="Diff approvals (review writes, deletes, and commands)"
Tag="diffApprovals" Toggled="Setting_Toggled"
ToolTipService.ToolTip="The AI must show you a diff and get your approval before writing files, deleting, or running commands. Off = changes apply instantly with no review — only for full trust."/>
Expand Down
2 changes: 0 additions & 2 deletions src/MandoCode.Desktop/Controls/SettingsForm.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,6 @@ private void ReloadControls()
S_MaxTokens.Value = cfg.MaxTokens;
S_Streaming.SelectedItem = cfg.ResponseStreaming;
S_AgentCallsigns.IsOn = _draftCallsigns;
S_TaskPlanning.IsOn = cfg.EnableTaskPlanning;
S_DiffApprovals.IsOn = cfg.EnableDiffApprovals;
S_AutoContinue.IsOn = cfg.EnableAutoContinuation;
S_MaxContinuations.Value = cfg.MaxAutoContinuations;
Expand Down Expand Up @@ -447,7 +446,6 @@ private void ResetFactory_Click(object sender, RoutedEventArgs e)
if (s == Tab_Behavior)
{
tabName = "Behavior";
resets.Add(("taskPlanning", Bool(d.EnableTaskPlanning)));
resets.Add(("diffApprovals", Bool(d.EnableDiffApprovals)));
resets.Add(("autoContinue", Bool(d.EnableAutoContinuation)));
resets.Add(("maxContinuations", Num(d.MaxAutoContinuations)));
Expand Down
3 changes: 2 additions & 1 deletion src/MandoCode.Desktop/Services/AgentSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ public AgentSession(
Agents = globals.GetRequiredService<AgentDirectory>();
CommandLog = new AgentCommandLog();
Ai = new AIService(ProjectRoot, Config, Tokens, PlanHandoff, Skills, mcpManager, McpGate, spinner, CommandLog);
Ai.UseExplicitPlanningOnly();
PreviewTools = new DesktopPreviewTools(ProjectRoot) { RequireTabId = true, ImageSink = new AgentImageSink(new AiServiceAdapter(Ai)) };
// Cross-agent observation. Registered alongside the browser tools because both are host
// knowledge the engine cannot have: the engine sees one project root, the host sees the
Expand Down Expand Up @@ -216,7 +217,7 @@ public AgentSession(
Shell = new ShellRunner(ProjectRoot, Transcript, html);

Controller = new ChatController(
new AiServiceAdapter(Ai), Config, Tokens, PlanHandoff, Planner, PlanRunners,
new AiServiceAdapter(Ai), Config, Tokens, PlanHandoff, PlanRunners,
mcpManager, McpGate, Skills, FileProvider, ProjectRoot,
music, updateCheck, Approvals, Transcript, html, Busy, Shell, PromptGate,
configs, mcp, Snapshots,
Expand Down
17 changes: 2 additions & 15 deletions src/MandoCode.Desktop/ViewModels/ChatController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,7 @@ public sealed partial class ChatController
private readonly TokenTrackingService _tokenTracker;
private readonly PlanHandoff _planHandoff;
private readonly DeferredPlanCompletion _deferredPlans;
private readonly TaskPlannerService _taskPlanner;
// Which engine runs a plan is re-read per plan, so `planner` can be flipped
// mid-session. _taskPlanner is still needed for RequiresPlanning, which is a
// planning-trigger heuristic rather than part of IPlanRunner.
// Which engine runs an explicitly requested plan is re-read per plan.
private readonly PlanRunnerSelector _planRunners;
private readonly McpClientManager _mcpManager;
private readonly McpApprovalGate _mcpGate;
Expand Down Expand Up @@ -269,7 +266,6 @@ public ChatController(
MandoCodeConfig config,
TokenTrackingService tokenTracker,
PlanHandoff planHandoff,
TaskPlannerService taskPlanner,
PlanRunnerSelector planRunners,
McpClientManager mcpManager,
McpApprovalGate mcpGate,
Expand Down Expand Up @@ -300,7 +296,6 @@ public ChatController(
_tokenTracker = tokenTracker;
_planHandoff = planHandoff;
_deferredPlans = new DeferredPlanCompletion(_planHandoff);
_taskPlanner = taskPlanner;
_planRunners = planRunners;
_mcpManager = mcpManager;
_mcpGate = mcpGate;
Expand Down Expand Up @@ -640,8 +635,6 @@ public async Task SubmitAsync(string input, string? browserContext = null)

ConversationLogger?.Invoke("u", input);

// Plan heuristic BEFORE @file expansion so attachments don't inflate it.
var planning = _taskPlanner.GetPlanningDecision(input);
var processedInput = ProcessFileReferences(input);

// Fold the invisible ride-alongs (imported recaps, emoji reactions, external workspace
Expand All @@ -668,13 +661,7 @@ public async Task SubmitAsync(string input, string? browserContext = null)
_pendingReactions.Clear();
_pendingWorkspaceNotes.Clear();

if (planning.Required)
{
_transcript.Append(_html.Dim($"Planning automatically: {planning.Reason}."));
await ForcePlanAsync(processedInput, input);
}
else
await ProcessDirectRequestAsync(processedInput, input);
await ProcessDirectRequestAsync(processedInput, input);
}
finally
{
Expand Down