fix: surface pi rust diagnostics in ui
This commit is contained in:
@@ -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">' +
|
||||
|
||||
Reference in New Issue
Block a user