Files
Maven/cmd/mavweb/history.html
T
kami a02e10fd11 ipc+mavweb: add revert/undo endpoint to void latest fact for a key
- New store.VoidLatestFact() method finds latest non-voided fact for
  a key and writes a void-marker row pointing at it (transactional).
- New IPC method MethodRevertFact with CoreAPI.RevertFact interface,
  storeAPI adapter, server dispatch, and client proxy.
- New HTTP endpoint POST /api/revert?key=<key> in mavweb.
- History page adds a 'revert' button per non-voided fact row with
  JS confirmation and optimistic UI (marks row voided on success).
- All existing store, IPC, and mavweb tests pass.
2026-07-05 02:18:39 +04:00

58 lines
2.3 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang=en>
<meta charset=utf-8>
<meta name=viewport content="width=device-width,initial-scale=1">
<title>maven · history</title>
<style>
body{font:14px system-ui;margin:1.5rem;max-width:70rem}
h1{font-size:1.3rem;margin-bottom:.3rem}
nav a{margin-right:1rem}
table{border-collapse:collapse;width:100%;margin-top:.5rem}
th,td{border:1px solid #ccc;padding:.3rem .5rem;text-align:left;vertical-align:top}
th{background:#f6f6f6}
.voided{opacity:.45;text-decoration:line-through}
.void-badge{color:#999;font-size:.8rem;margin-left:.3rem}
.key{font-family:monospace;white-space:nowrap}
.val{font-family:monospace;word-break:break-all;max-width:20rem}
.src{font-size:.85rem;color:#666}
.count{color:#888;font-size:.85rem;margin-top:.3rem}
.revert-btn{font-size:.8rem;padding:.15rem .4rem;cursor:pointer}
.revert-btn:disabled{opacity:.4;cursor:not-allowed}
#msg{margin-top:.5rem;padding:.4rem;border-radius:.3rem;display:none}
.msg-ok{background:#e6ffed;display:block!important}
.msg-err{background:#ffe6e6;display:block!important}
</style>
<h1>maven · command history</h1>
<nav><a href=/dash>dash</a> <a href=/tools>tools</a> <a href=/auth/passkey>passkey</a></nav>
<p class=count>{{len .Facts}} facts shown (newest first)</p>
<div id=msg></div>
<table>
<tr><th>when<th>kind<th>key<th>value<th>source<th>conf<th></tr>
{{range .Facts}}<tr{{if .VoidsID}} class=voided{{end}}>
<td>{{if .VoidsID}}<span class=void-badge> voided</span>{{end}}{{.Ts.Format "2006-01-02 15:04"}}</td>
<td>{{.Kind}}</td>
<td class=key>{{.Key}}</td>
<td class=val>{{.Value}}</td>
<td class=src>{{.Source}}</td>
<td>{{printf "%.2f" .Confidence}}</td>
<td>{{if not .VoidsID}}<button class=revert-btn onclick="revert('{{.Key}}',this)">revert</button>{{end}}</td>
</tr>{{end}}
</table>
<script>
const msg=document.getElementById('msg');
function revert(key,btn){
btn.disabled=true;
fetch('/api/revert',{method:'POST',headers:{'content-type':'application/x-www-form-urlencoded'},body:'key='+encodeURIComponent(key)})
.then(r=>r.json().then(d=>({ok:r.ok,data:d})))
.then(({ok,data})=>{
msg.className=ok?'msg-ok':'msg-err';
msg.textContent=ok?'reverted ✓':(data.error||'revert failed');
if(ok) btn.closest('tr').className='voided';
}).catch(e=>{
msg.className='msg-err';
msg.textContent='error: '+e;
btn.disabled=false;
});
}
</script>