fix: surface pi rust diagnostics in ui

This commit is contained in:
Agent Board
2026-07-12 07:03:26 +08:00
parent 031a08288b
commit 62959b0c4d
5 changed files with 236 additions and 5 deletions
@@ -1040,6 +1040,12 @@ const AI_ADMIN_SCRIPT: &str = r#"
root.addEventListener('click', function (event) {
var closeTarget = event.target && event.target.closest ? event.target.closest('[data-action="close-user-drawer"], [data-ai-admin-drawer-backdrop]') : null;
if (closeTarget && drawer) drawer.classList.remove('is-open');
var piDiagnosticTarget = event.target && event.target.closest ? event.target.closest('[data-ai-admin-pi-diagnostic-command]') : null;
if (piDiagnosticTarget) {
event.preventDefault();
runPiDiagnostic(piDiagnosticTarget.getAttribute('data-ai-admin-pi-diagnostic-command') || 'doctor');
return;
}
});
function setText(node, value) {
@@ -1081,6 +1087,66 @@ const AI_ADMIN_SCRIPT: &str = r#"
return '<div class="mnote-ai-admin-kv"><span>' + escapeHtml(label) + '</span><strong>' + escapeHtml(value == null || value === '' ? '-' : value) + '</strong></div>';
}
function advancedRuntimeSummary(config) {
config = config || {};
var pairs = [
['extensionPolicy', config.extensionPolicy || config.extension_policy],
['repairPolicy', config.repairPolicy || config.repair_policy],
['sessionDurability', config.sessionDurability || config.session_durability],
['requestTimeoutSecs', config.requestTimeoutSecs || config.request_timeout_secs],
['maxToolIterations', config.maxToolIterations || config.max_tool_iterations],
['hideCwdInPrompt', (config.hideCwdInPrompt === true || config.hide_cwd_in_prompt === true) ? 'true' : 'false'],
].filter(function (item) { return item[1] !== undefined && item[1] !== null && item[1] !== ''; });
return pairs.length ? pairs.map(function (item) { return item[0] + '=' + item[1]; }).join(', ') : 'default';
}
function piDiagnosticParams(command) {
var input = root.querySelector('[data-ai-admin-pi-diagnostic-query]');
var keyword = input ? String(input.value || '').trim() : '';
var params = {};
if (command === 'doctor') params.format = 'json';
if (command === 'context-preview') {
params.format = 'json';
params.query = [keyword || 'MNote Pi Rust diagnostics'];
}
if (command === 'search') {
if (!keyword) throw new Error('请输入 search keyword');
params.query = keyword;
params.limit = 10;
}
if (command === 'info') {
if (!keyword) throw new Error('请输入 info name/id');
params.name = keyword;
}
return params;
}
function setPiDiagnosticOutput(payload) {
var details = root.querySelector('[data-ai-admin-pi-diagnostics-card]');
var output = root.querySelector('[data-ai-admin-pi-diagnostics-output]');
if (details) details.open = true;
if (!output) return;
output.hidden = false;
output.textContent = typeof payload === 'string' ? payload : JSON.stringify(payload || {}, null, 2);
}
async function runPiDiagnostic(command) {
try {
var params = piDiagnosticParams(command);
setPiDiagnosticOutput('Running ' + command + '...');
var payload = await requestJson('/api/page-ai/pi/diagnostics', {
method: 'POST',
body: JSON.stringify({
command: command,
params: params,
}),
});
setPiDiagnosticOutput(payload);
} catch (err) {
setPiDiagnosticOutput({ ok: false, command: command, error: err.message || '诊断失败' });
}
}
function normalizeDirectoryGrants(payload) {
var grants = payload && (payload.grants || (payload.policy && payload.policy.grants) || payload.allowedRoots || payload.allowed_roots || []);
return Array.isArray(grants) ? grants.filter(Boolean) : [];
@@ -1216,6 +1282,7 @@ const AI_ADMIN_SCRIPT: &str = r#"
var piRuntimeBinary = piStatus ? (piStatus.runtimeBinary || piStatus.runtime_binary || '-') : '-';
var piRuntimeAvailable = !piStatus || piStatus.runtimeAvailable !== false;
var piRuntimeError = piStatus && (piStatus.runtimeError || piStatus.runtime_error || piStatus.runtimeInstallHint || piStatus.runtime_install_hint || '');
var advancedRuntime = piStatus && (piStatus.advancedRuntime || piStatus.advanced_runtime) || {};
var piRunning = piStatus && piStatus.running === true;
var piExtensions = piStatus && Array.isArray(piStatus.piExtensionSources)
? piStatus.piExtensionSources
@@ -1242,9 +1309,24 @@ const AI_ADMIN_SCRIPT: &str = r#"
renderKv('Runtime PID', piStatus && piStatus.pid ? String(piStatus.pid) : 'none') +
renderKv('受控 Pi 原生工具', (piStatus && piStatus.managedPiBuiltinTools || ['read','write','edit','bash','grep','find','ls','hashline_edit']).join(', ')) +
renderKv('Pi 扩展包', piExtensions.length ? piExtensions.join(', ') : '待 runtime 启动') +
renderKv('Advanced runtime', advancedRuntimeSummary(advancedRuntime)) +
renderKv('Receipt storage', piStatus && piStatus.receiptStorage ? piStatus.receiptStorage : 'control-plane / provider-neutral adapter') +
renderKv('Session dir policy', piStatus && piStatus.managedPiSessionDirPolicy ? piStatus.managedPiSessionDirPolicy : '<workspace>/.mnote/ai/pi-sessions/<actor>/<session>') +
'</div>' +
'<details data-ai-admin-pi-diagnostics-card style="margin-top:12px;">' +
'<summary style="font-size:12px;color:#8B8782;cursor:pointer;">Pi 官方诊断 / effective runtime</summary>' +
'<div class="mnote-ai-admin-actions-bar" style="margin:10px 0;gap:6px;flex-wrap:wrap;">' +
'<button type="button" class="mnote-ai-admin-btn" data-ai-admin-pi-diagnostic-command="doctor">doctor</button>' +
'<button type="button" class="mnote-ai-admin-btn" data-ai-admin-pi-diagnostic-command="context-preview">context-preview</button>' +
'<button type="button" class="mnote-ai-admin-btn" data-ai-admin-pi-diagnostic-command="list">list</button>' +
'<button type="button" class="mnote-ai-admin-btn" data-ai-admin-pi-diagnostic-command="update-index">update-index</button>' +
'<input type="search" data-ai-admin-pi-diagnostic-query placeholder="search/info keyword" style="height:30px;min-width:160px;border:1px solid #ddd8cf;border-radius:8px;padding:0 10px;">' +
'<button type="button" class="mnote-ai-admin-btn" data-ai-admin-pi-diagnostic-command="search">search</button>' +
'<button type="button" class="mnote-ai-admin-btn" data-ai-admin-pi-diagnostic-command="info">info</button>' +
'</div>' +
'<pre class="mnote-ai-admin-json" data-ai-admin-pi-diagnostics-output hidden></pre>' +
'<pre class="mnote-ai-admin-json" data-ai-admin-pi-advanced-runtime-json>' + escapeHtml(JSON.stringify(advancedRuntime, null, 2)) + '</pre>' +
'</details>' +
'</div>' +
'</div>' +
'<div class="mnote-ai-admin-admin-card">' +