-
-
-
-
-
-
-
-
+
+
+
diff --git a/apps/ui/js/i18n.js b/apps/ui/js/i18n.js
index 02b07aa..48552d3 100644
--- a/apps/ui/js/i18n.js
+++ b/apps/ui/js/i18n.js
@@ -598,11 +598,6 @@ var TRANSLATIONS = {
'wizard.approval.subtitle': 'Enable this for actions that must not run without an explicit user decision.',
'wizard.approval.required_label': 'Require confirmation before execution',
'wizard.approval.required_desc': 'The MCP client receives a pending request, and the action runs only after confirmation through a separate approval endpoint.',
- 'wizard.approval.risk_level': 'Risk level',
- 'wizard.approval.risk.normal': 'Normal action',
- 'wizard.approval.risk.dangerous': 'Dangerous action',
- 'wizard.approval.risk.financial': 'Financial action',
- 'wizard.approval.risk.irreversible': 'Irreversible action',
'wizard.approval.ttl': 'How long to wait for confirmation',
'wizard.approval.confirmation_title': 'Confirmation title',
'wizard.approval.confirmation_title_hint': 'This text will be shown by the external confirmation interface.',
@@ -1465,11 +1460,6 @@ var TRANSLATIONS = {
'wizard.approval.subtitle': 'Включайте для действий, которые нельзя выполнять без явного решения пользователя.',
'wizard.approval.required_label': 'Требовать подтверждение перед выполнением',
'wizard.approval.required_desc': 'MCP клиент получит ожидающий запрос, а действие выполнится только после подтверждения через отдельный эндпоинт подтверждения.',
- 'wizard.approval.risk_level': 'Уровень риска',
- 'wizard.approval.risk.normal': 'Обычное действие',
- 'wizard.approval.risk.dangerous': 'Опасное действие',
- 'wizard.approval.risk.financial': 'Финансовое действие',
- 'wizard.approval.risk.irreversible': 'Необратимое действие',
'wizard.approval.ttl': 'Сколько ждать подтверждение',
'wizard.approval.confirmation_title': 'Заголовок подтверждения',
'wizard.approval.confirmation_title_hint': 'Этот текст увидит внешний интерфейс подтверждения.',
diff --git a/apps/ui/js/wizard-live.js b/apps/ui/js/wizard-live.js
index 8904ec7..f8b7270 100644
--- a/apps/ui/js/wizard-live.js
+++ b/apps/ui/js/wizard-live.js
@@ -46,7 +46,7 @@ function buildApprovalPolicy() {
return {
required: true,
- risk_level: textValue('approval-risk-level') || 'normal',
+ risk_level: 'normal',
confirmation_title: title,
confirmation_body_template: body,
ttl_seconds: normalizeApprovalTtlSeconds(textValue('approval-ttl-seconds')),
@@ -191,7 +191,6 @@ function setApprovalPolicyEditor(policy) {
var enabled = !!(policy && policy.required);
var required = document.getElementById('approval-required');
if (required) required.checked = enabled;
- setValue('approval-risk-level', policy && policy.risk_level ? policy.risk_level : 'normal');
setValue('approval-ttl-seconds', policy && policy.ttl_seconds ? String(policy.ttl_seconds) : '300');
setValue('approval-title', policy && policy.confirmation_title ? policy.confirmation_title : tKey('wizard.approval.default_title'));
setValue('approval-body', policy && policy.confirmation_body_template ? policy.confirmation_body_template : tKey('wizard.approval.default_body'));
@@ -219,7 +218,6 @@ function updateApprovalPolicyUi() {
function bindApprovalPolicyControls() {
[
'approval-required',
- 'approval-risk-level',
'approval-ttl-seconds',
'approval-title',
'approval-body',
diff --git a/apps/ui/js/wizard-mapping.js b/apps/ui/js/wizard-mapping.js
index 84cb26c..dadadb0 100644
--- a/apps/ui/js/wizard-mapping.js
+++ b/apps/ui/js/wizard-mapping.js
@@ -346,6 +346,25 @@
return button;
}
+ function wrapMappingControl(labelText, control) {
+ var wrapper = document.createElement('label');
+ wrapper.className = 'mapping-field';
+ var label = document.createElement('span');
+ label.className = 'mapping-field-label';
+ label.textContent = labelText;
+ wrapper.appendChild(label);
+ wrapper.appendChild(control);
+ return wrapper;
+ }
+
+ function makeMappingArrow() {
+ var arrow = document.createElement('span');
+ arrow.className = 'mapping-arrow';
+ arrow.setAttribute('aria-hidden', 'true');
+ arrow.textContent = '→';
+ return arrow;
+ }
+
function renderRequestRows(rows) {
var root = field('wizard-request-mapping-rows');
if (!root) return;
@@ -364,7 +383,10 @@
var input = makeInput(row.input, 'form-input input-mono mapping-source', 'base');
input.dataset.role = 'input';
- item.appendChild(input);
+ input.title = 'Поле, которое MCP клиент передает инструменту';
+ item.appendChild(wrapMappingControl('Из инструмента', input));
+
+ item.appendChild(makeMappingArrow());
var select = document.createElement('select');
select.className = 'form-select mapping-target';
@@ -378,16 +400,17 @@
select.appendChild(makeOption(entry[0], entry[1], entry[0] === row.target));
});
select.addEventListener('change', syncVisualMappingsToYaml);
- item.appendChild(select);
+ item.appendChild(wrapMappingControl('Куда в API', select));
var apiName = makeInput(row.apiName || row.input, 'form-input input-mono mapping-api-name', 'base');
apiName.dataset.role = 'apiName';
- item.appendChild(apiName);
+ apiName.title = 'Имя path, query, header или body-поля в API-запросе';
+ item.appendChild(wrapMappingControl('Имя в API', apiName));
- var defaultValue = makeInput(row.defaultValue, 'form-input input-mono mapping-default-value', 'по умолчанию');
+ var defaultValue = makeInput(row.defaultValue, 'form-input input-mono mapping-default-value', 'если не передано');
defaultValue.dataset.role = 'defaultValue';
- defaultValue.title = 'Значение по умолчанию, если поле не передано';
- item.appendChild(defaultValue);
+ defaultValue.title = 'Необязательно. Это значение уйдет в API, если агент не передал поле инструмента.';
+ item.appendChild(wrapMappingControl('Если пусто', defaultValue));
var transform = document.createElement('select');
transform.className = 'form-select mapping-transform';
@@ -398,7 +421,7 @@
});
transform.title = 'Простое преобразование перед отправкой в API';
transform.addEventListener('change', syncVisualMappingsToYaml);
- item.appendChild(transform);
+ item.appendChild(wrapMappingControl('Преобразование', transform));
item.appendChild(makeRemoveButton(item));
return item;
@@ -422,11 +445,15 @@
var responsePath = makeInput(row.responsePath, 'form-input input-mono mapping-response-path', 'rates.EUR');
responsePath.dataset.role = 'responsePath';
- item.appendChild(responsePath);
+ responsePath.title = 'Поле из ответа API';
+ item.appendChild(wrapMappingControl('Из ответа API', responsePath));
+
+ item.appendChild(makeMappingArrow());
var output = makeInput(row.output, 'form-input input-mono mapping-output-field', 'rate');
output.dataset.role = 'output';
- item.appendChild(output);
+ output.title = 'Поле результата, которое получит MCP клиент';
+ item.appendChild(wrapMappingControl('В результат инструмента', output));
item.appendChild(makeRemoveButton(item));
return item;
}
diff --git a/apps/ui/tests/e2e/wizard.spec.js b/apps/ui/tests/e2e/wizard.spec.js
index 38d9fd7..52f3b0e 100644
--- a/apps/ui/tests/e2e/wizard.spec.js
+++ b/apps/ui/tests/e2e/wizard.spec.js
@@ -831,7 +831,7 @@ test('wizard edit mode preserves explicit request mapping targets on save', asyn
await page.evaluate(() => window.CrankWizardShell.doGoToStep(3));
await expect(page.locator('#approval-required')).toBeChecked();
await expect(page.locator('#approval-config-fields')).toBeVisible();
- await expect(page.locator('#approval-risk-level')).toHaveValue('financial');
+ await expect(page.locator('#approval-risk-level')).toHaveCount(0);
await expect(page.locator('#approval-ttl-seconds')).toHaveValue('180');
await expect(page.locator('#approval-title')).toHaveValue('Подтвердите обмен валюты');
await expect(page.locator('#approval-body')).toHaveValue('Проверьте валюты и подтвердите выполнение операции.');
@@ -863,7 +863,7 @@ test('wizard edit mode preserves explicit request mapping targets on save', asyn
streaming: null,
approval_policy: {
required: true,
- risk_level: 'financial',
+ risk_level: 'normal',
confirmation_title: 'Подтвердите обмен валюты',
confirmation_body_template: 'Проверьте валюты и подтвердите выполнение операции.',
ttl_seconds: 180,