loki-mode 9.73.0 → 9.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/autonomy/council-v2.sh +60 -13
  4. package/autonomy/lib/done-recognition.sh +73 -21
  5. package/autonomy/lib/proof-generator.py +7 -0
  6. package/autonomy/loki +18 -7
  7. package/autonomy/run.sh +14 -1
  8. package/dashboard/__init__.py +1 -1
  9. package/dashboard/server.py +22 -13
  10. package/dashboard/static/index.html +5 -5
  11. package/docs/INSTALLATION.md +1 -1
  12. package/docs/R3-COST-OBSERVABILITY-DESIGN.md +7 -1
  13. package/docs/exit-codes.md +21 -0
  14. package/docs/v10/ARCHITECT-CUTS.md +386 -317
  15. package/docs/v10/BOARD.md +64 -24
  16. package/docs/v10/GUARDS.md +13 -7
  17. package/loki-ts/dist/loki.js +251 -250
  18. package/mcp/__init__.py +1 -1
  19. package/package.json +1 -1
  20. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  21. package/web-app/dist/assets/{AdminPage-B11jqriL.js → AdminPage-CMGkmNnt.js} +1 -1
  22. package/web-app/dist/assets/{Avatar-vmIEiL2U.js → Avatar-9mn8sJ-2.js} +1 -1
  23. package/web-app/dist/assets/{Badge-DxtrDGcl.js → Badge-mSFLvvRX.js} +1 -1
  24. package/web-app/dist/assets/{Button-BiPlRkkg.js → Button-B1v4CSkD.js} +1 -1
  25. package/web-app/dist/assets/CockpitPage-BW0hYuzC.js +47 -0
  26. package/web-app/dist/assets/{ComparePage-B4ddvt9J.js → ComparePage-C1BXuolM.js} +1 -1
  27. package/web-app/dist/assets/{ErrorBoundary-BIJy59N_.js → ErrorBoundary-C2sJyBhb.js} +1 -1
  28. package/web-app/dist/assets/{EvidenceReceiptPanel-C4-Phh1f.js → EvidenceReceiptPanel-a1irlBPD.js} +1 -1
  29. package/web-app/dist/assets/GitHubIssuesPanel-zM-WRxYB.js +7 -0
  30. package/web-app/dist/assets/{GitHubPRsPanel-B_VHTB-t.js → GitHubPRsPanel-DvRa5Rxq.js} +1 -1
  31. package/web-app/dist/assets/{HomePage-cxONjTSm.js → HomePage-CNwRexp5.js} +2 -2
  32. package/web-app/dist/assets/{LoginPage-D49p6aVy.js → LoginPage-HKogNiEX.js} +1 -1
  33. package/web-app/dist/assets/{MagicPage-C5GUEIuM.js → MagicPage-u1mvdkUd.js} +1 -1
  34. package/web-app/dist/assets/{MetricsPage-I-OXi9kG.js → MetricsPage-CThdMJb5.js} +1 -1
  35. package/web-app/dist/assets/{NotFoundPage-Do19cbOP.js → NotFoundPage-B1v3lELS.js} +1 -1
  36. package/web-app/dist/assets/{ProjectPage-TRyzTIFH.js → ProjectPage-hDvSsdLF.js} +63 -63
  37. package/web-app/dist/assets/{ProjectsPage-BLSDhtVb.js → ProjectsPage-CRAegSM6.js} +1 -1
  38. package/web-app/dist/assets/{SettingsPage-BvixtAw7.js → SettingsPage-Dt90bFxo.js} +1 -1
  39. package/web-app/dist/assets/{ShowcasePage-By96BMJz.js → ShowcasePage-C5a9l8u_.js} +1 -1
  40. package/web-app/dist/assets/{SystemSettingsPage-AvVujpIo.js → SystemSettingsPage-DtqsDXbx.js} +1 -1
  41. package/web-app/dist/assets/{TeamsPage-BiT3N4px.js → TeamsPage-CooeoWxR.js} +1 -1
  42. package/web-app/dist/assets/{TemplatesPage-Y_m-dzfd.js → TemplatesPage-CJhTxWrw.js} +1 -1
  43. package/web-app/dist/assets/{TerminalOutput-oPTCcEGy.js → TerminalOutput-DvjfbDxb.js} +1 -1
  44. package/web-app/dist/assets/{activity-DCa9Pi7k.js → activity-DK6KBQKA.js} +1 -1
  45. package/web-app/dist/assets/{bell-Br7Xsjam.js → bell-Cd8tQpN6.js} +1 -1
  46. package/web-app/dist/assets/{bot-BsQKlSP5.js → bot-Y30w8rML.js} +1 -1
  47. package/web-app/dist/assets/{check-Cb49hCzQ.js → check-B5eUl1j9.js} +1 -1
  48. package/web-app/dist/assets/{chevron-left-Cs63FOmY.js → chevron-left-qyvpFqze.js} +1 -1
  49. package/web-app/dist/assets/{circle-alert-C8A636Wl.js → circle-alert-DXtjVPDB.js} +1 -1
  50. package/web-app/dist/assets/{clock-DhlnHjQI.js → clock-dqQis2Q6.js} +1 -1
  51. package/web-app/dist/assets/{cloud-uOYQxGRY.js → cloud-CzTURYO9.js} +1 -1
  52. package/web-app/dist/assets/{code-xml-9O9XlVo9.js → code-xml-DLbw1HTk.js} +1 -1
  53. package/web-app/dist/assets/{database-D9Oek2JS.js → database-BIj38v85.js} +1 -1
  54. package/web-app/dist/assets/{dollar-sign-CHetUBPR.js → dollar-sign-9bVcHIkD.js} +1 -1
  55. package/web-app/dist/assets/{file-code-corner-oTJV_ce4.js → file-code-corner-D57x6xD1.js} +1 -1
  56. package/web-app/dist/assets/{file-plus-vuloOqQB.js → file-plus-BXOrz3T5.js} +1 -1
  57. package/web-app/dist/assets/{globe-DMVdf8bk.js → globe-Cnq8h4Gt.js} +1 -1
  58. package/web-app/dist/assets/{hammer-15WRQJ1o.js → hammer-iiLGlF28.js} +1 -1
  59. package/web-app/dist/assets/{index-SRKz3Imw.js → index-uGGZ1Ij3.js} +2 -2
  60. package/web-app/dist/assets/{layers-C-QQQP9K.js → layers-gcGxxNEN.js} +1 -1
  61. package/web-app/dist/assets/{loader-circle-DqoJevCK.js → loader-circle-B4Ad11xq.js} +1 -1
  62. package/web-app/dist/assets/{lock-B68yfqau.js → lock-DvQNG5RI.js} +1 -1
  63. package/web-app/dist/assets/{package-DAxTtm-S.js → package-BtQBNbq2.js} +1 -1
  64. package/web-app/dist/assets/{plus-BSbdI5QI.js → plus-DKLiMXBZ.js} +1 -1
  65. package/web-app/dist/assets/{refresh-cw-DlvFuI3J.js → refresh-cw-B4Gu8e2m.js} +1 -1
  66. package/web-app/dist/assets/{rotate-ccw-BF03pKE0.js → rotate-ccw-DATSPLYS.js} +1 -1
  67. package/web-app/dist/assets/{scroll-text-QFZ1JdTD.js → scroll-text-GA8EtlY4.js} +1 -1
  68. package/web-app/dist/assets/{server-tyIvmSke.js → server-DT_3kM4V.js} +1 -1
  69. package/web-app/dist/assets/{shield-alert-DHeqbtBK.js → shield-alert-BEaqZEhO.js} +1 -1
  70. package/web-app/dist/assets/{thumbs-up-CRag1Tn5.js → thumbs-up-DVvA-Fas.js} +1 -1
  71. package/web-app/dist/assets/{trash-2-B0n4x-Ds.js → trash-2-BCyT5A9N.js} +1 -1
  72. package/web-app/dist/assets/{trending-down-DC4Aqzso.js → trending-down-BLcNt39o.js} +1 -1
  73. package/web-app/dist/assets/{trending-up-DFG157ke.js → trending-up-BqfBp13A.js} +1 -1
  74. package/web-app/dist/assets/{upload-BdWQ4cWx.js → upload-BxH0rjQU.js} +1 -1
  75. package/web-app/dist/assets/{usePolling-DMgD-dJ5.js → usePolling-CokbBZIQ.js} +1 -1
  76. package/web-app/dist/assets/{user-DXaZeAe4.js → user-C_u9mNZM.js} +1 -1
  77. package/web-app/dist/index.html +1 -1
  78. package/web-app/dist/assets/CockpitPage-DXKAc0jc.js +0 -47
  79. package/web-app/dist/assets/GitHubIssuesPanel-CVIG0uwi.js +0 -7
@@ -5406,7 +5406,7 @@ var LokiDashboard=(()=>{var Le=Object.defineProperty;var kt=Object.getOwnPropert
5406
5406
  ${t}
5407
5407
  </div>
5408
5408
  </div>
5409
- `,this._attachEventListeners()}_attachEventListeners(){let e=this.shadowRoot.querySelectorAll(".tab");e.forEach((n,l)=>{n.addEventListener("click",()=>this._setTab(n.dataset.tab)),n.addEventListener("keydown",c=>{if(c.key==="ArrowRight"||c.key==="ArrowLeft"){c.preventDefault();let p=Array.from(e),u=c.key==="ArrowRight"?(l+1)%p.length:(l-1+p.length)%p.length;p[u].focus(),this._setTab(p[u].dataset.tab)}})}),this.shadowRoot.querySelectorAll(".item-card").forEach(n=>{n.addEventListener("click",()=>this._handleItemClick(n)),n.addEventListener("keydown",l=>{l.key==="Enter"||l.key===" "?(l.preventDefault(),this._handleItemClick(n)):(l.key==="ArrowDown"||l.key==="ArrowUp")&&(l.preventDefault(),this._navigateItemCards(n,l.key==="ArrowDown"?"next":"prev"))})});let t=this.shadowRoot.getElementById("close-detail");t&&t.addEventListener("click",()=>this._closeDetail());let i=this.shadowRoot.getElementById("consolidate-btn");i&&i.addEventListener("click",()=>this._triggerConsolidation());let a=this.shadowRoot.getElementById("refresh-btn");a&&a.addEventListener("click",()=>this._loadData());let s=this.shadowRoot.getElementById("memory-search-input"),r=this.shadowRoot.getElementById("search-btn"),o=this.shadowRoot.getElementById("memory-search-collection");s&&(s.addEventListener("keydown",n=>{n.key==="Enter"&&(n.preventDefault(),this._searchQuery=s.value,this._executeSearch())}),s.addEventListener("input",n=>{this._searchQuery=n.target.value})),r&&r.addEventListener("click",()=>{let n=this.shadowRoot.getElementById("memory-search-input");n&&(this._searchQuery=n.value),this._executeSearch()}),o&&o.addEventListener("change",n=>{this._searchCollection=n.target.value})}_handleItemClick(e){let t=e.dataset.id;switch(e.dataset.type){case"episode":this._selectEpisode(t);break;case"pattern":this._selectPattern(t);break;case"skill":this._selectSkill(t);break}}_navigateItemCards(e,t){let i=Array.from(this.shadowRoot.querySelectorAll(".item-card")),a=i.indexOf(e);if(a===-1)return;let s=t==="next"?a+1:a-1;s>=0&&s<i.length&&i[s].focus()}};customElements.get("loki-memory-browser")||customElements.define("loki-memory-browser",te);var Lt=[{id:"1h",label:"1 Hour",hours:1},{id:"24h",label:"24 Hours",hours:24},{id:"7d",label:"7 Days",hours:168},{id:"30d",label:"30 Days",hours:720}],zt=[{id:"all",label:"All Signals"},{id:"user_preference",label:"User Preferences"},{id:"error_pattern",label:"Error Patterns"},{id:"success_pattern",label:"Success Patterns"},{id:"tool_efficiency",label:"Tool Efficiency"},{id:"context_relevance",label:"Context Relevance"}],Ht=[{id:"all",label:"All Sources"},{id:"cli",label:"CLI"},{id:"api",label:"API"},{id:"vscode",label:"VS Code"},{id:"mcp",label:"MCP"},{id:"dashboard",label:"Dashboard"}],ie=class extends v{static get observedAttributes(){return["api-url","theme","time-range","signal-type","source"]}constructor(){super(),this._loading=!1,this._error=null,this._api=null,this._timeRange="7d",this._signalType="all",this._source="all",this._metrics=null,this._trends=null,this._signals=[],this._selectedMetric=null}connectedCallback(){super.connectedCallback(),this._timeRange=this.getAttribute("time-range")||"7d",this._signalType=this.getAttribute("signal-type")||"all",this._source=this.getAttribute("source")||"all",this._setupApi(),this._loadData()}attributeChangedCallback(e,t,i){if(t!==i)switch(e){case"api-url":this._api&&(this._api=g({baseUrl:i}),this._loadData());break;case"theme":this._applyTheme();break;case"time-range":this._timeRange=i,this._loadData();break;case"signal-type":this._signalType=i,this._loadData();break;case"source":this._source=i,this._loadData();break}}_setupApi(){let e=this.getAttribute("api-url")||window.location.origin;this._api=g({baseUrl:e})}async _loadData(){this._loading=!0,this._error=null,this.render();let e=this._api;try{let t={timeRange:this._timeRange,signalType:this._signalType!=="all"?this._signalType:void 0,source:this._source!=="all"?this._source:void 0},[i,a,s]=await Promise.all([e.getLearningMetrics(t).catch(()=>null),e.getLearningTrends(t).catch(()=>null),e.getLearningSignals({...t,limit:50}).catch(()=>null)]);if(e!==this._api)return;this._metrics=i,this._trends=a,this._signals=s}catch(t){if(e!==this._api)return;this._error=t.message||"Failed to load learning data"}this._loading=!1,this.render()}_setFilter(e,t){switch(e){case"timeRange":this._timeRange=t,this.setAttribute("time-range",t);break;case"signalType":this._signalType=t,this.setAttribute("signal-type",t);break;case"source":this._source=t,this.setAttribute("source",t);break}this.dispatchEvent(new CustomEvent("filter-change",{detail:{timeRange:this._timeRange,signalType:this._signalType,source:this._source}})),this._loadData()}_selectMetric(e,t){this._selectedMetric={type:e,item:t},this.dispatchEvent(new CustomEvent("metric-select",{detail:{type:e,item:t}})),this.render()}_closeDetail(){this._selectedMetric=null,this.render()}_num(e){let t=e==null?NaN:Number(e);return Number.isFinite(t)?t:null}_formatNumber(e){let t=this._num(e);return t==null?"--":t>=1e6?(t/1e6).toFixed(1)+"M":t>=1e3?(t/1e3).toFixed(1)+"K":String(t)}_formatPercent(e){let t=this._num(e);return t==null?"--":(t*100).toFixed(1)+"%"}_formatDuration(e){let t=this._num(e);return t==null?"--":t<60?t.toFixed(0)+"s":t<3600?(t/60).toFixed(1)+"m":(t/3600).toFixed(1)+"h"}_escapeHtml(e){return e==null?"":String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}_renderFilters(){return`
5409
+ `,this._attachEventListeners()}_attachEventListeners(){let e=this.shadowRoot.querySelectorAll(".tab");e.forEach((n,l)=>{n.addEventListener("click",()=>this._setTab(n.dataset.tab)),n.addEventListener("keydown",c=>{if(c.key==="ArrowRight"||c.key==="ArrowLeft"){c.preventDefault();let p=Array.from(e),u=c.key==="ArrowRight"?(l+1)%p.length:(l-1+p.length)%p.length;p[u].focus(),this._setTab(p[u].dataset.tab)}})}),this.shadowRoot.querySelectorAll(".item-card").forEach(n=>{n.addEventListener("click",()=>this._handleItemClick(n)),n.addEventListener("keydown",l=>{l.key==="Enter"||l.key===" "?(l.preventDefault(),this._handleItemClick(n)):(l.key==="ArrowDown"||l.key==="ArrowUp")&&(l.preventDefault(),this._navigateItemCards(n,l.key==="ArrowDown"?"next":"prev"))})});let t=this.shadowRoot.getElementById("close-detail");t&&t.addEventListener("click",()=>this._closeDetail());let i=this.shadowRoot.getElementById("consolidate-btn");i&&i.addEventListener("click",()=>this._triggerConsolidation());let a=this.shadowRoot.getElementById("refresh-btn");a&&a.addEventListener("click",()=>this._loadData());let s=this.shadowRoot.getElementById("memory-search-input"),r=this.shadowRoot.getElementById("search-btn"),o=this.shadowRoot.getElementById("memory-search-collection");s&&(s.addEventListener("keydown",n=>{n.key==="Enter"&&(n.preventDefault(),this._searchQuery=s.value,this._executeSearch())}),s.addEventListener("input",n=>{this._searchQuery=n.target.value})),r&&r.addEventListener("click",()=>{let n=this.shadowRoot.getElementById("memory-search-input");n&&(this._searchQuery=n.value),this._executeSearch()}),o&&o.addEventListener("change",n=>{this._searchCollection=n.target.value})}_handleItemClick(e){let t=e.dataset.id;switch(e.dataset.type){case"episode":this._selectEpisode(t);break;case"pattern":this._selectPattern(t);break;case"skill":this._selectSkill(t);break}}_navigateItemCards(e,t){let i=Array.from(this.shadowRoot.querySelectorAll(".item-card")),a=i.indexOf(e);if(a===-1)return;let s=t==="next"?a+1:a-1;s>=0&&s<i.length&&i[s].focus()}};customElements.get("loki-memory-browser")||customElements.define("loki-memory-browser",te);var Lt=[{id:"1h",label:"1 Hour",hours:1},{id:"24h",label:"24 Hours",hours:24},{id:"7d",label:"7 Days",hours:168},{id:"30d",label:"30 Days",hours:720}],zt=[{id:"all",label:"All Signals"},{id:"user_preference",label:"User Preferences"},{id:"error_pattern",label:"Error Patterns"},{id:"success_pattern",label:"Success Patterns"},{id:"tool_efficiency",label:"Tool Efficiency"},{id:"context_relevance",label:"Context Relevance"}],Ht=[{id:"all",label:"All Sources"},{id:"cli",label:"CLI"},{id:"api",label:"API"},{id:"vscode",label:"VS Code"},{id:"mcp",label:"MCP"},{id:"dashboard",label:"Dashboard"}],ie=class extends v{static get observedAttributes(){return["api-url","theme","time-range","signal-type","source"]}constructor(){super(),this._loading=!1,this._error=null,this._api=null,this._timeRange="7d",this._signalType="all",this._source="all",this._metrics=null,this._trends=null,this._signals=[],this._selectedMetric=null}connectedCallback(){super.connectedCallback(),this._timeRange=this.getAttribute("time-range")||"7d",this._signalType=this.getAttribute("signal-type")||"all",this._source=this.getAttribute("source")||"all",this._setupApi(),this._loadData()}attributeChangedCallback(e,t,i){if(t!==i)switch(e){case"api-url":this._api&&(this._api=g({baseUrl:i}),this._loadData());break;case"theme":this._applyTheme();break;case"time-range":this._timeRange=i,this._loadData();break;case"signal-type":this._signalType=i,this._loadData();break;case"source":this._source=i,this._loadData();break}}_setupApi(){let e=this.getAttribute("api-url")||window.location.origin;this._api=g({baseUrl:e})}async _loadData(){this._loading=!0,this._error=null,this.render();let e=this._api;try{let t={timeRange:this._timeRange,signalType:this._signalType!=="all"?this._signalType:void 0,source:this._source!=="all"?this._source:void 0},i=!1,a=!1,[s,r,o]=await Promise.all([e.getLearningMetrics(t).catch(()=>(i=!0,null)),e.getLearningTrends(t).catch(()=>(a=!0,null)),e.getLearningSignals({...t,limit:50}).catch(()=>null)]);if(e!==this._api)return;this._metrics=s,this._trends=r,this._metricsFailed=i,this._trendsFailed=a,this._signals=o}catch(t){if(e!==this._api)return;this._error=t.message||"Failed to load learning data"}this._loading=!1,this.render()}_setFilter(e,t){switch(e){case"timeRange":this._timeRange=t,this.setAttribute("time-range",t);break;case"signalType":this._signalType=t,this.setAttribute("signal-type",t);break;case"source":this._source=t,this.setAttribute("source",t);break}this.dispatchEvent(new CustomEvent("filter-change",{detail:{timeRange:this._timeRange,signalType:this._signalType,source:this._source}})),this._loadData()}_selectMetric(e,t){this._selectedMetric={type:e,item:t},this.dispatchEvent(new CustomEvent("metric-select",{detail:{type:e,item:t}})),this.render()}_closeDetail(){this._selectedMetric=null,this.render()}_num(e){let t=e==null?NaN:Number(e);return Number.isFinite(t)?t:null}_formatNumber(e){let t=this._num(e);return t==null?"--":t>=1e6?(t/1e6).toFixed(1)+"M":t>=1e3?(t/1e3).toFixed(1)+"K":String(t)}_formatPercent(e){let t=this._num(e);return t==null?"--":(t*100).toFixed(1)+"%"}_formatDuration(e){let t=this._num(e);return t==null?"--":t<60?t.toFixed(0)+"s":t<3600?(t/60).toFixed(1)+"m":(t/3600).toFixed(1)+"h"}_escapeHtml(e){return e==null?"":String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}_renderFilters(){return`
5410
5410
  <div class="filters">
5411
5411
  <div class="filter-group">
5412
5412
  <label>Time Range</label>
@@ -5440,7 +5440,7 @@ var LokiDashboard=(()=>{var Le=Object.defineProperty;var kt=Object.getOwnPropert
5440
5440
  Refresh
5441
5441
  </button>
5442
5442
  </div>
5443
- `}_renderSummaryCards(){if(!this._metrics)return'<div class="empty-state">No metrics available</div>';let{totalSignals:e,signalsByType:t,signalsBySource:i,aggregation:a}=this._metrics,s=e>0?this._num(this._metrics.avgConfidence):null;return`
5443
+ `}_renderSummaryCards(){if(this._metricsFailed)return'<div class="empty-state">Could not load metrics</div>';if(!this._metrics)return'<div class="empty-state">No metrics available</div>';let{totalSignals:e,signalsByType:t,signalsBySource:i,aggregation:a}=this._metrics,s=e>0?this._num(this._metrics.avgConfidence):null;return`
5444
5444
  <div class="summary-cards">
5445
5445
  <div class="summary-card">
5446
5446
  <div class="summary-card-header">
@@ -5509,7 +5509,7 @@ var LokiDashboard=(()=>{var Le=Object.defineProperty;var kt=Object.getOwnPropert
5509
5509
  </div>
5510
5510
  </div>
5511
5511
  </div>
5512
- `}_renderTrendChart(){if(!this._trends||!this._trends.dataPoints||this._trends.dataPoints.length===0)return'<div class="chart-empty">No trend data available</div>';let{dataPoints:e,maxValue:t}=this._trends,i=120,a=400,s=20,r=e.map((n,l)=>{let c=s+l/(e.length-1||1)*(a-s*2),p=i-s-n.count/(t||1)*(i-s*2);return`${c},${p}`}).join(" "),o=`${s},${i-s} ${r} ${a-s},${i-s}`;return`
5512
+ `}_renderTrendChart(){if(this._trendsFailed)return'<div class="chart-empty">Could not load trend data</div>';if(!this._trends||!this._trends.dataPoints||this._trends.dataPoints.length===0)return'<div class="chart-empty">No trend data available</div>';let{dataPoints:e,maxValue:t}=this._trends,i=120,a=400,s=20,r=e.map((n,l)=>{let c=s+l/(e.length-1||1)*(a-s*2),p=i-s-n.count/(t||1)*(i-s*2);return`${c},${p}`}).join(" "),o=`${s},${i-s} ${r} ${a-s},${i-s}`;return`
5513
5513
  <div class="trend-chart">
5514
5514
  <div class="chart-header">
5515
5515
  <span class="chart-title">Signal Volume Over Time</span>
@@ -10823,7 +10823,7 @@ var LokiDashboard=(()=>{var Le=Object.defineProperty;var kt=Object.getOwnPropert
10823
10823
  ${t}
10824
10824
  <span class="migration-title">Migration Dashboard</span>
10825
10825
  </div>
10826
- <div class="empty-state">No migration data available</div>
10826
+ <div class="empty-state status-failed">Could not load migrations: ${this._escapeHtml(this._error)}</div>
10827
10827
  </div>
10828
10828
  `;return}if(this._migration){let i=this._migration,a=this._escapeHtml(i.migration_id||i.id||"--"),s=this._escapeHtml(i.source||"--"),r=this._escapeHtml(i.target||"--"),o=i.current_phase||i.phase||"unknown",n=i.completed_phases||[];this.shadowRoot.innerHTML=`
10829
10829
  <style>${e}</style>
@@ -13706,7 +13706,7 @@ var LokiDashboard=(()=>{var Le=Object.defineProperty;var kt=Object.getOwnPropert
13706
13706
  </div>
13707
13707
  </div>
13708
13708
  </div>
13709
- `,this._bindEvents()}};customElements.get("loki-cost-waterfall")||customElements.define("loki-cost-waterfall",we);var vt=50,$e=class extends v{static get observedAttributes(){return["api-url","theme"]}constructor(){super(),this._api=null,this._statusLoading=!1,this._statusError=null,this._status=null,this._eventsLoading=!1,this._eventsError=null,this._events=[],this._eventsSource=null,this._eventsCount=0,this._lookupId="",this._lookupLoading=!1,this._lookupError=null,this._lookupResult=null}connectedCallback(){super.connectedCallback(),this._setupApi(),this._loadStatus()}disconnectedCallback(){super.disconnectedCallback(),this._stopPolling()}attributeChangedCallback(e,t,i){if(t!==i)switch(e){case"api-url":this._api&&(this._api=g({baseUrl:i}),this._loadStatus());break;case"theme":this._applyTheme(),this.render();break}}_setupApi(){let e=this.getAttribute("api-url")||window.location.origin;this._api=g({baseUrl:e})}_stopPolling(){}async _loadStatus(){let e=this._api;this._statusLoading=!0,this._statusError=null,this.render();try{let t=await e.get("/api/managed/status");if(e!==this._api)return;this._status=t}catch(t){if(e!==this._api)return;this._statusError=t&&t.message?t.message:"Failed to load managed status",this._status=null}finally{this._statusLoading=!1}this._status&&this._status.enabled?await this._loadEvents():this.render()}async _loadEvents(e=vt){let t=this._api;this._eventsLoading=!0,this._eventsError=null,this.render();try{let i=await t.get("/api/managed/events?limit="+encodeURIComponent(e));if(t!==this._api)return;Array.isArray(i)?(this._events=i,this._eventsCount=i.length,this._eventsSource=null):i&&typeof i=="object"?(this._events=Array.isArray(i.events)?i.events:[],this._eventsCount=typeof i.count=="number"?i.count:this._events.length,this._eventsSource=i.source||null):(this._events=[],this._eventsCount=0,this._eventsSource=null)}catch(i){if(t!==this._api)return;this._eventsError=i&&i.message?i.message:"Failed to load managed events",this._events=[],this._eventsCount=0,this._eventsSource=null}finally{this._eventsLoading=!1,this.render()}}async _lookupMemoryVersion(){let e=(this._lookupId||"").trim();if(!e){this._lookupError="Enter a memory ID to look up",this._lookupResult=null,this.render();return}let t=this._api;this._lookupLoading=!0,this._lookupError=null,this._lookupResult=null,this.render();try{let i="/api/managed/memory_versions/"+encodeURIComponent(e),a=await t.get(i);if(t!==this._api)return;this._lookupResult=a}catch(i){if(t!==this._api)return;this._lookupError=i&&i.message?i.message:"Failed to load memory versions",this._lookupResult=null}finally{this._lookupLoading=!1,this.render()}}_onLookupInput(e){this._lookupId=e&&e.target?e.target.value:""}_onLookupKeyDown(e){e&&e.key==="Enter"&&(e.preventDefault(),this._lookupMemoryVersion())}_attachEventHandlers(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector("#refresh-status-btn");t&&t.addEventListener("click",()=>this._loadStatus());let i=e.querySelector("#refresh-events-btn");i&&i.addEventListener("click",()=>this._loadEvents());let a=e.querySelector("#lookup-input");a&&(a.addEventListener("input",r=>this._onLookupInput(r)),a.addEventListener("keydown",r=>this._onLookupKeyDown(r)));let s=e.querySelector("#lookup-btn");s&&s.addEventListener("click",()=>this._lookupMemoryVersion())}_escapeHtml(e){return e==null?"":String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}_formatTimestamp(e){if(!e)return"";let t;return typeof e=="number"?t=new Date(e>1e12?e:e*1e3):t=new Date(e),Number.isNaN(t.getTime())?String(e):t.toISOString().replace("T"," ").replace(/\.\d+Z$/,"Z")}_renderStatusSection(){if(this._statusLoading)return'<div class="status-row muted">Loading managed memory status...</div>';if(this._statusError)return`
13709
+ `,this._bindEvents()}};customElements.get("loki-cost-waterfall")||customElements.define("loki-cost-waterfall",we);var vt=50,$e=class extends v{static get observedAttributes(){return["api-url","theme"]}constructor(){super(),this._api=null,this._statusLoading=!1,this._statusError=null,this._status=null,this._eventsLoading=!1,this._eventsError=null,this._events=[],this._eventsSource=null,this._eventsCount=0,this._lookupId="",this._lookupLoading=!1,this._lookupError=null,this._lookupResult=null}connectedCallback(){super.connectedCallback(),this._setupApi(),this._loadStatus()}disconnectedCallback(){super.disconnectedCallback(),this._stopPolling()}attributeChangedCallback(e,t,i){if(t!==i)switch(e){case"api-url":this._api&&(this._api=g({baseUrl:i}),this._loadStatus());break;case"theme":this._applyTheme(),this.render();break}}_setupApi(){let e=this.getAttribute("api-url")||window.location.origin;this._api=g({baseUrl:e})}_stopPolling(){}async _loadStatus(){let e=this._api;this._statusLoading=!0,this._statusError=null,this.render();try{let t=await e.get("/api/managed/status");if(e!==this._api)return;this._status=t}catch(t){if(e!==this._api)return;this._statusError=t&&t.message?t.message:"Failed to load managed status",this._status=null}finally{this._statusLoading=!1}this._status&&this._status.enabled?await this._loadEvents():this.render()}async _loadEvents(e=vt){let t=this._api;this._eventsLoading=!0,this._eventsError=null,this.render();try{let i=await t.get("/api/managed/events?limit="+encodeURIComponent(e));if(t!==this._api)return;Array.isArray(i)?(this._events=i,this._eventsCount=i.length,this._eventsSource=null):i&&typeof i=="object"?(this._events=Array.isArray(i.events)?i.events:[],this._eventsCount=typeof i.count=="number"?i.count:this._events.length,this._eventsSource=i.source||null,i.error&&(this._eventsError=String(i.error))):(this._events=[],this._eventsCount=0,this._eventsSource=null)}catch(i){if(t!==this._api)return;this._eventsError=i&&i.message?i.message:"Failed to load managed events",this._events=[],this._eventsCount=0,this._eventsSource=null}finally{this._eventsLoading=!1,this.render()}}async _lookupMemoryVersion(){let e=(this._lookupId||"").trim();if(!e){this._lookupError="Enter a memory ID to look up",this._lookupResult=null,this.render();return}let t=this._api;this._lookupLoading=!0,this._lookupError=null,this._lookupResult=null,this.render();try{let i="/api/managed/memory_versions/"+encodeURIComponent(e),a=await t.get(i);if(t!==this._api)return;this._lookupResult=a}catch(i){if(t!==this._api)return;this._lookupError=i&&i.message?i.message:"Failed to load memory versions",this._lookupResult=null}finally{this._lookupLoading=!1,this.render()}}_onLookupInput(e){this._lookupId=e&&e.target?e.target.value:""}_onLookupKeyDown(e){e&&e.key==="Enter"&&(e.preventDefault(),this._lookupMemoryVersion())}_attachEventHandlers(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector("#refresh-status-btn");t&&t.addEventListener("click",()=>this._loadStatus());let i=e.querySelector("#refresh-events-btn");i&&i.addEventListener("click",()=>this._loadEvents());let a=e.querySelector("#lookup-input");a&&(a.addEventListener("input",r=>this._onLookupInput(r)),a.addEventListener("keydown",r=>this._onLookupKeyDown(r)));let s=e.querySelector("#lookup-btn");s&&s.addEventListener("click",()=>this._lookupMemoryVersion())}_escapeHtml(e){return e==null?"":String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}_formatTimestamp(e){if(!e)return"";let t;return typeof e=="number"?t=new Date(e>1e12?e:e*1e3):t=new Date(e),Number.isNaN(t.getTime())?String(e):t.toISOString().replace("T"," ").replace(/\.\d+Z$/,"Z")}_renderStatusSection(){if(this._statusLoading)return'<div class="status-row muted">Loading managed memory status...</div>';if(this._statusError)return`
13710
13710
  <div class="error-banner" role="alert">
13711
13711
  <strong>Status error:</strong>
13712
13712
  <span>${this._escapeHtml(this._statusError)}</span>
@@ -2,7 +2,7 @@
2
2
 
3
3
  The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
4
4
 
5
- **Version:** v9.73.0
5
+ **Version:** v9.75.0
6
6
 
7
7
  ---
8
8
 
@@ -60,6 +60,7 @@ Read-only. Returns two honest series plus a budget block:
60
60
  "cost_usd": 1.84, "files_changed": 3, "final_verdict": "APPROVE"}
61
61
  ],
62
62
  "project_total_usd": 1.89,
63
+ "project_total_partial": false,
63
64
  "runs_count": 1,
64
65
  "budget": {
65
66
  "limit": 50.0, "used": 1.89, "remaining": 48.11,
@@ -74,7 +75,12 @@ Read-only. Returns two honest series plus a budget block:
74
75
  prefer `cost_usd`; if null, price from tokens via the EXISTING
75
76
  `_calculate_model_cost` helper (do not add a new pricer).
76
77
  - `runs` from `.loki/proofs/*/proof.json` (reuse `_proofs_dir` + `_safe_json_read`).
77
- - `project_total_usd` = sum of per-run proof costs (the persistent history).
78
+ - `project_total_usd` totals only the runs whose proof recorded a cost
79
+ (the persistent history). It is null when no run recorded a cost, since
80
+ runs that each read "not recorded" do not add up to a $0.00 project; a
81
+ measured $0.00 run still makes it 0.0.
82
+ - `project_total_partial` is true when only some runs recorded a cost. The
83
+ total is then a lower bound, not the project's full spend.
78
84
  - `budget.status`: "ok" (<80%), "warn" (>=80% and <100%), "exceeded" (>=100%).
79
85
  Computed at read time. No budget.json schema change (avoids the
80
86
  byte-identical-JSON parity trap with run.sh heredoc / budget.ts).
@@ -67,6 +67,27 @@ An early draft spec listed `1=BLOCKED, 2=CONCERNS`. That ordering was rejected:
67
67
  it is not used anywhere, it has no consumers, and it inverts the
68
68
  severity-rises-with-the-code rule that every other command follows.
69
69
 
70
+ ### Known gaps until v10.0.0
71
+
72
+ The table above is the target. On the current release, four inputs do not
73
+ return what it implies. Measured on this checkout:
74
+
75
+ | Input | Command | Exit today | Target |
76
+ |---|---|---|---|
77
+ | Empty diff (a git repo with no changes vs base) | `loki verify` | 1 (CONCERNS) | 3 |
78
+ | Not a git directory | `loki verify` | 1 (CONCERNS) | 2 |
79
+ | Unknown flag | `loki verify --no-such-flag` | 3 | 64 |
80
+ | `--fast` with nothing scanned (0 files) | `loki verify --fast <empty-dir> --no-cache` | 0 | nonzero |
81
+
82
+ `loki verify --fast` (`autonomy/lib/fast_verify.py`) also exits 0 for a
83
+ nonexistent root and silently ignores unknown flags. Until v10.0.0, do not
84
+ trust exit 0 from `--fast` alone: check stdout for `INCONCLUSIVE`, which it
85
+ prints when nothing was scanned.
86
+
87
+ Both gaps are tracked as pending moat cases, milestone v10.0.0, in
88
+ `tests/moat/pending.txt`: P2.verify-exit-contract (the first three rows)
89
+ and P2.fast-verify-inconclusive-not-zero (the `--fast` row).
90
+
70
91
  ## `loki proof verify <id>`
71
92
 
72
93
  Re-checks one Evidence Receipt against the repo (tamper and drift). The same