Improve wizard mapping and quality guidance

This commit is contained in:
github-ops
2026-06-23 21:03:25 +00:00
parent 052b9356ec
commit 04f63e690c
7 changed files with 1228 additions and 24 deletions
+95
View File
@@ -13,10 +13,17 @@ function buildToolDescription() {
}
function buildWizardState() {
var snapshot = wizardCurrentVersion && wizardCurrentVersion.snapshot
? wizardCurrentVersion.snapshot
: wizardCurrentVersion;
var existingState = snapshot && snapshot.wizard_state ? snapshot.wizard_state : {};
return {
input_sample: parseStructuredText(textValue('wizard-input-sample')),
output_sample: parseStructuredText(textValue('wizard-output-sample')),
test_input: parseStructuredText(textValue('wizard-test-input')),
import_findings: Array.isArray(existingState.import_findings)
? existingState.import_findings.slice()
: [],
};
}
@@ -24,6 +31,10 @@ function collectWizardPayload() {
var name = textValue('tool-name');
if (!name) throw new Error(tKey('wizard.error.tool_name'));
if (window.CrankWizardMapping && typeof window.CrankWizardMapping.sync === 'function') {
window.CrankWizardMapping.sync();
}
var inputSchemaValue = parseStructuredText(textValue('tool-input-schema'));
var outputSchemaValue = parseStructuredText(textValue('tool-output-schema'));
var inputMappingValue = parseStructuredText(textValue('tool-input-mapping'));
@@ -69,6 +80,7 @@ async function loadOperationForEdit() {
wizardCurrentVersion = draftVersion;
prefillWizardFromEdit(detail, draftVersion);
renderAgentFacingPreview();
renderImportQualityFindings(draftVersion);
}
function setEditModePresentation() {
@@ -111,6 +123,9 @@ function bindWizardLiveActions() {
var yamlInput = document.getElementById('wizard-import-yaml-file');
if (yamlInput) yamlInput.addEventListener('change', handleImportYamlFileSelection);
if (window.CrankWizardMapping && typeof window.CrankWizardMapping.initialize === 'function') {
window.CrankWizardMapping.initialize();
}
bindAgentFacingPreview();
}
@@ -421,6 +436,50 @@ function severityLabel(severity) {
return tKey('wizard.quality.severity_info');
}
function qualityTargetForFinding(finding) {
var code = String(finding && finding.code || '');
var path = String(finding && finding.field_path || '');
if (code.indexOf('tool_name') >= 0 || code.indexOf('weak_tool_name') >= 0) {
return { step: 4, selector: '#tool-name', label: 'Перейти к имени инструмента' };
}
if (code.indexOf('description') >= 0 || path.indexOf('tool_description') >= 0) {
return { step: 4, selector: '#tool-description', label: 'Перейти к описанию' };
}
if (code.indexOf('input') >= 0 || code.indexOf('parameter') >= 0 || path.indexOf('input_schema') >= 0) {
return { step: 4, selector: '#tool-input-schema', label: 'Перейти к входной схеме' };
}
if (code.indexOf('output') >= 0 || code.indexOf('response_schema') >= 0 || path.indexOf('output_schema') >= 0) {
return { step: 4, selector: '#tool-output-schema', label: 'Перейти к схеме ответа' };
}
if (code.indexOf('response_projection') >= 0 || code.indexOf('mapping') >= 0 || path.indexOf('output_mapping') >= 0) {
return { step: 5, selector: '#tool-output-mapping', label: 'Перейти к маппингу ответа' };
}
return null;
}
function focusWizardQualityTarget(target) {
if (!target || !window.CrankWizardShell) return;
var load = typeof window.CrankWizardShell.loadWizardPanels === 'function'
? window.CrankWizardShell.loadWizardPanels([target.step])
: Promise.resolve();
load.then(function() {
if (typeof window.CrankWizardShell.doGoToStep === 'function') {
window.CrankWizardShell.doGoToStep(target.step);
}
window.setTimeout(function() {
var element = document.querySelector(target.selector);
if (!element) return;
element.scrollIntoView({ behavior: 'smooth', block: 'center' });
if (typeof element.focus === 'function') element.focus();
element.classList.add('quality-focus-target');
window.setTimeout(function() {
element.classList.remove('quality-focus-target');
}, 1600);
}, 80);
});
}
function renderQualityFindings(report) {
var empty = document.getElementById('wizard-quality-empty');
var list = document.getElementById('wizard-quality-findings');
@@ -454,6 +513,19 @@ function renderQualityFindings(report) {
item.appendChild(action);
}
var target = qualityTargetForFinding(finding);
if (target) {
var button = document.createElement('button');
button.type = 'button';
button.className = 'btn-ghost-sm quality-finding-jump';
button.textContent = target.label;
button.addEventListener('click', function(event) {
event.preventDefault();
focusWizardQualityTarget(target);
});
item.appendChild(button);
}
if (finding.field_path) {
var path = document.createElement('div');
path.className = 'quality-finding-path';
@@ -465,6 +537,26 @@ function renderQualityFindings(report) {
});
}
function renderImportQualityFindings(versionDocument) {
var snapshot = versionDocument && versionDocument.snapshot
? versionDocument.snapshot
: versionDocument;
var state = snapshot && snapshot.wizard_state ? snapshot.wizard_state : {};
var findings = Array.isArray(state.import_findings) ? state.import_findings : [];
if (!findings.length) return;
renderQualityFindings({
blocking: findings.some(function(finding) { return finding.severity === 'error'; }),
findings: findings,
});
var empty = document.getElementById('wizard-quality-empty');
if (empty) {
empty.textContent = 'Рекомендации из OpenAPI import. Запустите проверку качества, чтобы пересчитать их по текущему черновику.';
empty.hidden = false;
}
}
async function analyzeWizardQuality() {
if (!wizardWorkspaceId) {
throw new Error(tKey('wizard.error.no_workspace'));
@@ -574,6 +666,9 @@ async function generateDraftFromWizard() {
setValue('tool-output-schema', JSON.stringify(crankSchemaToJsonSchema(generated.output_schema), null, 2));
setValue('tool-input-mapping', mappingSetToEditorValue(generated.input_mapping, 'input', wizardProtocol));
setValue('tool-output-mapping', mappingSetToEditorValue(generated.output_mapping, 'output', wizardProtocol));
if (window.CrankWizardMapping && typeof window.CrankWizardMapping.renderFromEditors === 'function') {
window.CrankWizardMapping.renderFromEditors();
}
renderAgentFacingPreview();
showWizardLiveStatus(tKey('wizard.sample.generated'), tKey('wizard.sample.generated_body'));
}