From c60b7247af706da90d25ef997e3e72f124907a6f Mon Sep 17 00:00:00 2001 From: Twest2 Date: Wed, 24 Jun 2026 11:22:27 -0500 Subject: [PATCH] generate all text fields with AI now fills every step, not just current MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously the menu action only ran AI generation on the selected step. Now it loops through all steps sequentially, showing progress ("AI: filling step N of M…"), then reloads the visible step when done. Partial failures are reported in the final toast. Co-Authored-By: Claude Sonnet 4.6 --- app/renderer/editor.js | 44 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/app/renderer/editor.js b/app/renderer/editor.js index fd3e4a8..0f0e28b 100644 --- a/app/renderer/editor.js +++ b/app/renderer/editor.js @@ -219,7 +219,49 @@ class GuideEditor { } async generateAllTextFieldsWithAi(button = null) { - return this.runAiGeneration('all', { button }); + if (!this.steps.length) { + this.onToast('No steps to generate.', { error: true }); + return; + } + if (!this.isAiEnabled()) { + this.onToast('Enable AI in Settings first.', { error: true }); + return; + } + if (this.pendingSave) await this.flushStep(); + if (button) setButtonLoading(button, true, 'Generating…'); + let done = 0; + let failed = 0; + const total = this.steps.length; + try { + for (const step of this.steps) { + this.onToast(`AI: filling step ${done + 1} of ${total}…`); + try { + const result = await api.ai.fillStep({ + guideId: this.guideId, + stepId: step.stepId, + target: 'all', + }); + if (result?.ok) { + done++; + // Keep the in-memory steps list fresh so subsequent steps see updated guide context. + const idx = this.steps.findIndex((s) => s.stepId === step.stepId); + if (idx >= 0) this.steps[idx] = result.step; + } else { + failed++; + } + } catch { + failed++; + } + } + // Reload the currently-visible step so the editor reflects its new text. + if (this.selectedStepId) await this.reload(this.selectedStepId); + const msg = failed + ? `AI filled ${done} step${done === 1 ? '' : 's'} (${failed} failed).` + : `AI filled all ${done} step${done === 1 ? '' : 's'}.`; + this.onToast(msg, failed ? { error: true } : undefined); + } finally { + if (button) setButtonLoading(button, false); + } } async generateBlockWithAi(kind, block, button = null) {