ai smart auto-documentation and text rewrite
- Store captureMetadata (OCR text, window/app/element info) with each step at capture time so AI always has the original rich context. - Add buildCaptureContext() to TextIntelService; capture.js uses it instead of buildCaptureTitle() so both title and metadata come from one pass. - generateStepPatch() prefers stored captureMetadata over re-running OCR, giving the AI the best possible context when the user clicks an AI button later. - Add autoDoc setting: when enabled every capture (shoot, region, and session hotkey/click) is automatically documented by AI. Manual captures await AI before returning; session captures fire-and-forget and push a step:updated event so the renderer reloads seamlessly. - Add ai:rewriteText IPC and rewriteText() method for plain-text polishing via a separate callOllamaText() that skips JSON mode. - Add "AI Rewrite" section in the editor right panel: textarea + AI button that rewrites whatever the user types in place. - Improve buildAiPrompt() rules: action-focused title instructions, explicit anti-junk rules (no "Capture the screen / OCR" blocks), and a context-quality gate that suppresses blocks when context is thin. - Add autoDoc checkbox to AI settings dialog. - Renderer handles step:updated to reload the selected step after background auto-doc finishes. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This commit is contained in:
+50
-2
@@ -521,18 +521,49 @@ function setupIpc() {
|
||||
if (result.ok) reindex(guideId);
|
||||
return result;
|
||||
});
|
||||
h('ai:rewriteText', async ({ text, guideTitle = '', stepTitle = '' } = {}) => {
|
||||
return textIntel.rewriteText({ text, guideTitle, stepTitle });
|
||||
});
|
||||
h('placeholders:globals:get', () => settings.getGlobalPlaceholders());
|
||||
h('placeholders:globals:set', (values) => settings.setGlobalPlaceholders(values));
|
||||
|
||||
// capture
|
||||
h('capture:shoot', async ({ guideId, mode, delayMs }) => {
|
||||
const result = await capture.shoot({ guideId, mode, delayMs });
|
||||
if (result.ok) reindex(guideId);
|
||||
if (result.ok) {
|
||||
reindex(guideId);
|
||||
const aiConf = settings.get('ai') || {};
|
||||
if (aiConf.enabled && aiConf.autoDoc && result.step) {
|
||||
const aiResult = await textIntel.generateStepPatch({
|
||||
guideId,
|
||||
stepId: result.step.stepId,
|
||||
target: 'all',
|
||||
}).catch(() => null);
|
||||
if (aiResult?.ok) {
|
||||
reindex(guideId);
|
||||
result.step = aiResult.step;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
});
|
||||
h('capture:region', async ({ guideId }) => {
|
||||
const result = await capture.regionCapture(guideId);
|
||||
if (result.ok) reindex(guideId);
|
||||
if (result.ok) {
|
||||
reindex(guideId);
|
||||
const aiConf = settings.get('ai') || {};
|
||||
if (aiConf.enabled && aiConf.autoDoc && result.step) {
|
||||
const aiResult = await textIntel.generateStepPatch({
|
||||
guideId,
|
||||
stepId: result.step.stepId,
|
||||
target: 'all',
|
||||
}).catch(() => null);
|
||||
if (aiResult?.ok) {
|
||||
reindex(guideId);
|
||||
result.step = aiResult.step;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
});
|
||||
let capturePowerBlocker = -1;
|
||||
@@ -777,6 +808,23 @@ if (!gotLock) {
|
||||
try { keepProcessesResponsive(app.getAppMetrics().map((m) => m.pid)); } catch { /* best effort */ }
|
||||
}
|
||||
}
|
||||
// Auto-document session captures in the background when autoDoc is enabled.
|
||||
// Single-shot captures (capture:shoot) are handled synchronously in the IPC handler.
|
||||
if (channel === 'capture:added' && payload?.step && payload?.guideId) {
|
||||
const aiConf = settings.get('ai') || {};
|
||||
if (aiConf.enabled && aiConf.autoDoc) {
|
||||
textIntel.generateStepPatch({
|
||||
guideId: payload.guideId,
|
||||
stepId: payload.step.stepId,
|
||||
target: 'all',
|
||||
}).then((result) => {
|
||||
if (result.ok) {
|
||||
reindex(payload.guideId);
|
||||
sendToRenderer('step:updated', { guideId: payload.guideId, step: result.step });
|
||||
}
|
||||
}).catch(() => {});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
capture = new CaptureService({
|
||||
|
||||
Reference in New Issue
Block a user