loki-mode 10.3.0 → 10.4.1

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 (71) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/bin/loki +28 -0
  4. package/dashboard/__init__.py +1 -1
  5. package/docs/INSTALLATION.md +1 -1
  6. package/docs/v10/BOARD.md +22 -11
  7. package/docs/v10/GUARDS.md +45 -2
  8. package/docs/v10/GUIDE-MODERNIZE.md +93 -0
  9. package/docs/v10/MEDIUM-ANALYSIS.md +181 -0
  10. package/docs/v10/PROGRESS.md +19 -0
  11. package/loki-ts/dist/loki.js +2 -2
  12. package/mcp/__init__.py +1 -1
  13. package/package.json +1 -1
  14. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  15. package/web-app/dist/assets/{AdminPage-CunIYKsu.js → AdminPage-DXFriVML.js} +1 -1
  16. package/web-app/dist/assets/{Avatar-Dpl2qVf5.js → Avatar-p9ksx_eu.js} +1 -1
  17. package/web-app/dist/assets/{Badge-DDZcQ4uC.js → Badge-LNKA1VAh.js} +1 -1
  18. package/web-app/dist/assets/{Button-Ccuh5Ouj.js → Button-BubeNlVF.js} +1 -1
  19. package/web-app/dist/assets/{CockpitPage-Dgakdozm.js → CockpitPage-Vmnn1kk_.js} +1 -1
  20. package/web-app/dist/assets/{ComparePage-9-Zcu9Gf.js → ComparePage-y4DEGPAX.js} +1 -1
  21. package/web-app/dist/assets/{ErrorBoundary-CI756a2c.js → ErrorBoundary-DiuMh-ej.js} +1 -1
  22. package/web-app/dist/assets/{EvidenceReceiptPanel-BC3TA-vV.js → EvidenceReceiptPanel-BTg9fL9S.js} +1 -1
  23. package/web-app/dist/assets/{GitHubIssuesPanel-BdCsjPq2.js → GitHubIssuesPanel-C4fuMrPb.js} +1 -1
  24. package/web-app/dist/assets/{GitHubPRsPanel-DgXyzC-S.js → GitHubPRsPanel-BdQsKH8b.js} +1 -1
  25. package/web-app/dist/assets/{HomePage-Cijve3Mw.js → HomePage-E0Dp3m6N.js} +2 -2
  26. package/web-app/dist/assets/{LoginPage-3exGWWVo.js → LoginPage-BsbNsjYW.js} +1 -1
  27. package/web-app/dist/assets/{MagicPage-Bjy-pGNt.js → MagicPage-DGrIIo5Z.js} +1 -1
  28. package/web-app/dist/assets/{MetricsPage-CpJIaU8q.js → MetricsPage-DLvKrowx.js} +1 -1
  29. package/web-app/dist/assets/{NotFoundPage-fpgcK9hA.js → NotFoundPage-B6jgGGXs.js} +1 -1
  30. package/web-app/dist/assets/{ProjectPage-O7UQyFey.js → ProjectPage-iu7achd2.js} +3 -3
  31. package/web-app/dist/assets/{ProjectsPage-DdOZUQGM.js → ProjectsPage-zWcn06b3.js} +1 -1
  32. package/web-app/dist/assets/{SettingsPage-D3lNwNFK.js → SettingsPage-_HQ0UqwR.js} +1 -1
  33. package/web-app/dist/assets/{ShowcasePage-DBeFTDWM.js → ShowcasePage-yAsWHQEg.js} +1 -1
  34. package/web-app/dist/assets/{SystemSettingsPage-CJhMBNIO.js → SystemSettingsPage-DtZVxTJ2.js} +1 -1
  35. package/web-app/dist/assets/{TeamsPage-C6mmPl9W.js → TeamsPage-DDpGebPt.js} +1 -1
  36. package/web-app/dist/assets/{TemplatesPage-Brej2rqO.js → TemplatesPage-BlOcIhIE.js} +1 -1
  37. package/web-app/dist/assets/{TerminalOutput-C__6qBqv.js → TerminalOutput-EiD6R33t.js} +1 -1
  38. package/web-app/dist/assets/{activity-CrVuKK_W.js → activity-DbmttG_6.js} +1 -1
  39. package/web-app/dist/assets/{bell-26fqzcLm.js → bell-BVZdHdS9.js} +1 -1
  40. package/web-app/dist/assets/{bot-DmykFcjH.js → bot-CBpm5F9l.js} +1 -1
  41. package/web-app/dist/assets/{check-CzSi5Vci.js → check-NZElkYN9.js} +1 -1
  42. package/web-app/dist/assets/{chevron-left-NsdJXeCD.js → chevron-left-Bsj7g0Lx.js} +1 -1
  43. package/web-app/dist/assets/{circle-alert-BuKEAV8n.js → circle-alert--R-03UOi.js} +1 -1
  44. package/web-app/dist/assets/{clock-DPpOjTHt.js → clock-DxURKFW-.js} +1 -1
  45. package/web-app/dist/assets/{cloud-BPy4rC85.js → cloud-CwgZnGFX.js} +1 -1
  46. package/web-app/dist/assets/{code-xml-CUdET1iT.js → code-xml-DbI4aSEX.js} +1 -1
  47. package/web-app/dist/assets/{database-DS_5uXW_.js → database-DyH1aJKS.js} +1 -1
  48. package/web-app/dist/assets/{dollar-sign-CgSGxJa7.js → dollar-sign-DcirTDYQ.js} +1 -1
  49. package/web-app/dist/assets/{file-code-corner-B7iTiGB-.js → file-code-corner-D25VLaas.js} +1 -1
  50. package/web-app/dist/assets/{file-plus-rxLXNljV.js → file-plus-CXZAUQHR.js} +1 -1
  51. package/web-app/dist/assets/{globe-CVJMaRaH.js → globe-fb7DDJvp.js} +1 -1
  52. package/web-app/dist/assets/{hammer-C9KdE6y9.js → hammer-B0CgWTnB.js} +1 -1
  53. package/web-app/dist/assets/{index-B21YEJCf.js → index-h49hpHj_.js} +2 -2
  54. package/web-app/dist/assets/{layers-DNIDOX7S.js → layers-D7e5s5oV.js} +1 -1
  55. package/web-app/dist/assets/{loader-circle-HrXWSqei.js → loader-circle-CuJseaIc.js} +1 -1
  56. package/web-app/dist/assets/{lock-SfmCbb4w.js → lock-AWuJecY0.js} +1 -1
  57. package/web-app/dist/assets/{package-CwpZESj_.js → package-FOl48t3g.js} +1 -1
  58. package/web-app/dist/assets/{plus-DLh1-x2y.js → plus-B0rvkQ0K.js} +1 -1
  59. package/web-app/dist/assets/{refresh-cw-DxJsH1dQ.js → refresh-cw-9k6QfjLX.js} +1 -1
  60. package/web-app/dist/assets/{rotate-ccw-Dkny920M.js → rotate-ccw-BKfPqp6g.js} +1 -1
  61. package/web-app/dist/assets/{scroll-text-CsPrAnD5.js → scroll-text-VliGSgXD.js} +1 -1
  62. package/web-app/dist/assets/{server-E6pPKQNp.js → server-CDRRtXH3.js} +1 -1
  63. package/web-app/dist/assets/{shield-alert-C0Xh-M1C.js → shield-alert-BudxBT3Y.js} +1 -1
  64. package/web-app/dist/assets/{thumbs-up-oWNeyoZv.js → thumbs-up-DG8YD2t0.js} +1 -1
  65. package/web-app/dist/assets/{trash-2-BMv5WQCZ.js → trash-2-C3OCq0ib.js} +1 -1
  66. package/web-app/dist/assets/{trending-down-CUoz-SBV.js → trending-down-DdhqjRcI.js} +1 -1
  67. package/web-app/dist/assets/{trending-up-CI1-zKRQ.js → trending-up-DeiXF7_i.js} +1 -1
  68. package/web-app/dist/assets/{upload-CBtBD85L.js → upload-TsptvdQm.js} +1 -1
  69. package/web-app/dist/assets/{usePolling-CxtCw8cL.js → usePolling-CtO3JeYc.js} +1 -1
  70. package/web-app/dist/assets/{user-cDtPlp5V.js → user-LzUg4eFF.js} +1 -1
  71. package/web-app/dist/index.html +1 -1
@@ -1,5 +1,24 @@
1
1
  # Progress
2
2
 
3
+ ## 2026-09-28T19:42Z: 19:20 slot shipped (v10.3.1); medium failure explained; 7 builders on the fixes
4
+ - 19:20 slot: v10.3.1 cut 19:22:09Z (d811e5c3: E-99, M-30); Release 36471746478 success, publish-npm 19:30:56Z (cut to publish 8m47s), npm latest 10.3.1 gitHead d811e5c3. GitHub body came out as the placeholder "Release v10.3.1" (2 lines); backfilled from CHANGELOG (9 lines). E-88a (the enforcement) is being rebased onto E-99 now.
5
+ - Release blocker found at the cut: release.sh --bump-only in a fresh worktree deleted 4 tracked dist files when the build failed. Guard E-102 merged (c35d3fa7, test red 3/4 first, then 7/0) and E-103 for the build-ok-but-no-version branch (cd3d3d26, 10/0).
6
+ - EV-15 (medium re-run, durable files in ~/loki-ci-logs/eval/ev15-*): raw 10/14, $0.5085, p50 56s; v10 9/14, at least $0.788 per completed (E-98 correction), p50 128s. No flip.
7
+ - E-98 (docs/v10/MEDIUM-ANALYSIS.md, d496db89): v10's verify stage hard-codes `python`; this host has only `python3`, so 27/27 pytest and 9/9 ruff checks were not_run and no fix round fired in any of 14 runs. The only raw-won/v10-lost task (jinja-1413 x2) broke two existing tests a working verify would have caught. Other causes: spec_conflict skips verify (5/14), empty Python repo map (0 symbols, 9/14 implement runs had no tests to run), Wall killed at 90s (5/14, all 4 null-cost rows).
8
+ - Dispatched 19:40Z (sonnet): E-98a (verify interpreter), E-98b (spec_conflict still verifies), E-98c (append-only tests, impacted-test fallback), E-98d (Python repo map), E-98e (killed-session cost), E-88a rebase, E-91 (pulse id regex: E-98a..e and G-02 were invisible to the building count). E-98f (A/B of Wall and cascade, n=3 per arm) follows as one combined re-run.
9
+ - Merged locally for the 19:40 train: G-01 (governor, opus APPROVE r3 fa279532), M-08 (modernize dispatch, Tech Lead APPROVE r3 766a493b, alias-forwarding 213/0), E-102, E-103, E-101 (durable eval results plus safe prune, used to remove 6 finished worktrees). Fast tier: two failures, both pre-existing on origin/main and env-conditional (E-104 gitleaks allowlists the AWS example key; E-105 heredoc checker false positive at run.sh:5548).
10
+
11
+ ## 2026-09-28T19:04Z: drift audit (turn 528)
12
+ - M-08 (modernize arm in bin/loki) first build would have turned test-engine10-dispatch.sh red (it counted exactly 1 engine10 line). Fixed in-slice (7feff1f8): exactly 2 exec lines, one per named arm, red on a stray third; 35/0 and 13/0. Tech Lead review running.
13
+ - M-30 guide: Tech Lead REJECT, the --resume example id failed MID_RE (exit 2 when copied). Rework adds a MID_RE check over every id in the guide.
14
+ - No drift from D40: 5 building, load 2.9, no eval scaling; EV-15/E-98 still the priority.
15
+
16
+ ## 2026-09-28T19:00Z: 18:40 slot cut; E-99 merged; G-01 r2 rejected; drift audit (turn 522)
17
+ - 18:40 slot: v10.3.0 cut 18:48:32Z (74821b73: E-67, M-07, M-11, E-86, E-94, E-95, E-100, E-89); Release 36467812081 success, publish-npm 18:57:05Z (cut to publish 8m33s), npm latest 10.3.0 gitHead 74821b73, GitHub body 10 lines (the extractor worked; no backfill needed). E-99 train pushed 19:00Z as 367fe73f, pre-push passed without PRE_PUSH_SKIP.
18
+ - E-99 (pre-push scans every pushed commit with the tip's .gitleaksignore) merged locally 5ee5a630; conflict with E-100 case 20 resolved (binary guard kept, E-99 message taken). tests/test-pre-push-gitleaks.sh 43/0 with gitleaks, 19/0 plus 24 skipped without; test-pre-push-hook.sh 13/0. Held until 10.3.0 publish-npm (a push during a release cancels its Tests).
19
+ - G-01 r2 (de8e1f76, pct 100x fix, reset-aligned window, fail-safe, projection to weekly reset, global max-per-message dedup): opus REJECT. The weekly reset is 1h off across DST, and fixes 2 and 4 have no regression test (reverting either still gives 20/0). r3 dispatched to the same engineer.
20
+ - Drift audit: EV-12 umbrella was building for 127 min against D40 (large tier after medium); parked. E-96 duplicated E-101; parked. Headcount held per D40: 5 building (M-08, M-30 dispatched as low-risk modernize work) while EV-15/E-98 decide the medium fix. Load 3.2.
21
+
3
22
  ## 2026-09-28T18:25Z: 14:00 slot shipped; governor numbers corrected
4
23
  - 14:00 slot: v10.2.5 cut 18:06:00Z (b72c4f7e) after Tests went green on 1f955851 at 18:05:17Z; publish-npm 18:14:09Z; npm gitHead b72c4f7e; GitHub body backfilled (5 lines).
5
24
  - Burn accounting settled (three tries): rows sharing a message id are streaming snapshots (output_tokens grows, e.g. 5, 5, 467; cache fields repeat), so the right count is the maximum per message id. Last hour 1.79M output (sonnet 84%, opus 15%), 0.726B cache read; last 5h 6.43M output. G-01 now uses max-per-message (real run: 6.53M output in 5h, 37 active agents, 45.9K output per engineer-hour) and ships usage-statusline-logger.sh: Claude Code gives a statusLine command rate_limits.five_hour and seven_day used_percentage, which is the source of truth once wired. Still uncalibrated: no plan reading yet.
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- var hn=Object.create;var{getPrototypeOf:gn,defineProperty:BG,getOwnPropertyNames:mn}=Object;var un=Object.prototype.hasOwnProperty;function pn($){return this[$]}var dn,cn,ln=($,Z,Q)=>{var X=$!=null&&typeof $==="object";if(X){var J=Z?dn??=new WeakMap:cn??=new WeakMap,K=J.get($);if(K)return K}Q=$!=null?hn(gn($)):{};let Y=Z||!$||!$.__esModule?BG(Q,"default",{value:$,enumerable:!0}):Q;for(let V of mn($))if(!un.call(Y,V))BG(Y,V,{get:pn.bind($,V),enumerable:!0});if(X)J.set($,Y);return Y};var tJ=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var an=($)=>$;function on($,Z){this[$]=an.bind(null,Z)}var w0=($,Z)=>{for(var Q in Z)BG($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:on.bind(Z,Q)})};var v=($,Z)=>()=>($&&(Z=$($=0)),Z);var D7=import.meta.require;var JT={};w0(JT,{lokiDir:()=>F0,homeLokiDir:()=>k4,findRepoRootForVersion:()=>OG,REPO_ROOT:()=>d0});import{resolve as I7,dirname as UG}from"path";import{fileURLToPath as nn}from"url";import{existsSync as eJ}from"fs";import{homedir as sn}from"os";function rn(){let $=XT;for(let Z=0;Z<6;Z++){if(eJ(I7($,"VERSION"))&&eJ(I7($,"autonomy/run.sh")))return $;let Q=UG($);if(Q===$)break;$=Q}return I7(XT,"..","..","..")}function OG($){let Z=$;for(let Q=0;Q<6;Q++){if(eJ(I7(Z,"VERSION"))&&eJ(I7(Z,"autonomy/run.sh")))return Z;let X=UG(Z);if(X===Z)break;Z=X}return I7($,"..","..","..")}function F0(){return process.env.LOKI_DIR??I7(process.cwd(),".loki")}function k4(){return I7(sn(),".loki")}var XT,d0;var Z8=v(()=>{XT=UG(nn(import.meta.url));d0=rn()});import{readFileSync as tn}from"fs";import{resolve as en,dirname as $s}from"path";import{fileURLToPath as Zs}from"url";function R7(){if(x4!==null)return x4;let $="10.3.0";if(typeof $==="string"&&$.length>0)return x4=$,x4;try{let Z=$s(Zs(import.meta.url)),Q=OG(Z);x4=tn(en(Q,"VERSION"),"utf-8").trim()}catch{x4="unknown"}return x4}var x4=null;var I$=v(()=>{Z8()});var GT={};w0(GT,{runOrThrow:()=>Ms,run:()=>T0,readStreamCapped:()=>$K,commandVersion:()=>Ls,commandExists:()=>K9,ShellError:()=>MG,MAX_STDOUT_BYTES:()=>qT});async function $K($,Z=qT){let Q=$.getReader(),X=new TextDecoder,J="",K=0;try{while(K<Z){let{done:Y,value:V}=await Q.read();if(Y)break;if(!V)continue;if(K+=V.byteLength,K>Z){let z=V.byteLength-(K-Z);J+=X.decode(V.subarray(0,z),{stream:!0});break}J+=X.decode(V,{stream:!0})}J+=X.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return J}async function T0($,Z={}){let Q=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:Z.env?{...process.env,...Z.env}:process.env,cwd:Z.cwd}),X,J;if(Z.timeoutMs&&Z.timeoutMs>0)X=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}J=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},Z.timeoutMs);try{let[K,Y,V]=await Promise.all([$K(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:K,stderr:Y,exitCode:V}}finally{if(X)clearTimeout(X);if(J)clearTimeout(J)}}async function Ms($,Z={}){let Q=await T0($,Z);if(Q.exitCode!==0)throw new MG(`command failed (${Q.exitCode}): ${$.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function K9($){let Z=js($),Q=await T0(["sh","-c",`command -v ${Z}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function js($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function Ls($,Z="--version"){if(!await K9($))return null;let X=await T0([$,Z],{timeoutMs:5000});if(X.exitCode!==0)return null;return((X.stdout||X.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var qT=16777216,MG;var s8=v(()=>{MG=class MG extends Error{message;exitCode;stdout;stderr;constructor($,Z,Q,X){super($);this.message=$;this.exitCode=Z;this.stdout=Q;this.stderr=X;this.name="ShellError"}}});function w7($){return As?"":$}var As,k0,P8,c0,U18,J8,L8,Y9,d;var i5=v(()=>{As=(process.env.NO_COLOR??"").length>0;k0=w7("\x1B[0;31m"),P8=w7("\x1B[0;32m"),c0=w7("\x1B[1;33m"),U18=w7("\x1B[0;34m"),J8=w7("\x1B[0;36m"),L8=w7("\x1B[1m"),Y9=w7("\x1B[2m"),d=w7("\x1B[0m")});import{accessSync as ks,constants as xs,existsSync as Ss,statSync as bs}from"fs";async function a5(){if(R$!==void 0)return R$;let $="/opt/homebrew/bin/python3.12";if(Ss($))return R$=$,$;let Z=await K9("python3.12");if(Z)return R$=Z,Z;let Q=await K9("python3");return R$=Q,Q}async function L6($,Z={}){let Q=await a5();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return T0([Q,"-c",$],Z)}async function P7(){let $=(process.env.PATH??"").split(":").filter((Z)=>Z.startsWith("/"));for(let Z of[..._s,...$.map((Q)=>`${Q}/python3`)])try{if(!bs(Z).isFile())continue;if(ks(Z,xs.X_OK),(await T0([Z,"-I","-S","-c",""],{timeoutMs:1e4})).exitCode===0)return Z}catch{}return null}var R$,ys,_s;var X5=v(()=>{s8();ys=["/usr/bin/python3","/bin/python3"],_s=ys});var xT={};w0(xT,{runStatus:()=>Yr});import{existsSync as V9,readFileSync as $2,readdirSync as FT,statSync as DT}from"fs";import{resolve as u8,basename as rs}from"path";import{homedir as ts}from"os";function IT($){let Z=Math.trunc($);if(Z>=1e6)return`${(Math.trunc(Z/1e6*10)/10).toFixed(1)}M`;if(Z>=1000)return`${(Math.trunc(Z/1000*10)/10).toFixed(1)}K`;return String(Z)}function RT($,Z,Q){if(Z===0)return null;let X=Math.trunc($*100/Z),J=Math.trunc($*QK/Z);if(J>QK)J=QK;let K=QK-J,Y=P8;if(X>=80)Y=k0;else if(X>=50)Y=c0;let V="=".repeat(Math.max(0,J))+" ".repeat(Math.max(0,K)),z=IT($),W=IT(Z);return` ${L8}${Q}${d} ${Y}[${V}]${d} ${X}% (${z} / ${W})`}async function $r(){if(await K9("jq"))return!0;return process.stdout.write(`${k0}Error: jq is required but not installed.${d}
2
+ var hn=Object.create;var{getPrototypeOf:gn,defineProperty:BG,getOwnPropertyNames:mn}=Object;var un=Object.prototype.hasOwnProperty;function pn($){return this[$]}var dn,cn,ln=($,Z,Q)=>{var X=$!=null&&typeof $==="object";if(X){var J=Z?dn??=new WeakMap:cn??=new WeakMap,K=J.get($);if(K)return K}Q=$!=null?hn(gn($)):{};let Y=Z||!$||!$.__esModule?BG(Q,"default",{value:$,enumerable:!0}):Q;for(let V of mn($))if(!un.call(Y,V))BG(Y,V,{get:pn.bind($,V),enumerable:!0});if(X)J.set($,Y);return Y};var tJ=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var an=($)=>$;function on($,Z){this[$]=an.bind(null,Z)}var w0=($,Z)=>{for(var Q in Z)BG($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:on.bind(Z,Q)})};var v=($,Z)=>()=>($&&(Z=$($=0)),Z);var D7=import.meta.require;var JT={};w0(JT,{lokiDir:()=>F0,homeLokiDir:()=>k4,findRepoRootForVersion:()=>OG,REPO_ROOT:()=>d0});import{resolve as I7,dirname as UG}from"path";import{fileURLToPath as nn}from"url";import{existsSync as eJ}from"fs";import{homedir as sn}from"os";function rn(){let $=XT;for(let Z=0;Z<6;Z++){if(eJ(I7($,"VERSION"))&&eJ(I7($,"autonomy/run.sh")))return $;let Q=UG($);if(Q===$)break;$=Q}return I7(XT,"..","..","..")}function OG($){let Z=$;for(let Q=0;Q<6;Q++){if(eJ(I7(Z,"VERSION"))&&eJ(I7(Z,"autonomy/run.sh")))return Z;let X=UG(Z);if(X===Z)break;Z=X}return I7($,"..","..","..")}function F0(){return process.env.LOKI_DIR??I7(process.cwd(),".loki")}function k4(){return I7(sn(),".loki")}var XT,d0;var Z8=v(()=>{XT=UG(nn(import.meta.url));d0=rn()});import{readFileSync as tn}from"fs";import{resolve as en,dirname as $s}from"path";import{fileURLToPath as Zs}from"url";function R7(){if(x4!==null)return x4;let $="10.4.1";if(typeof $==="string"&&$.length>0)return x4=$,x4;try{let Z=$s(Zs(import.meta.url)),Q=OG(Z);x4=tn(en(Q,"VERSION"),"utf-8").trim()}catch{x4="unknown"}return x4}var x4=null;var I$=v(()=>{Z8()});var GT={};w0(GT,{runOrThrow:()=>Ms,run:()=>T0,readStreamCapped:()=>$K,commandVersion:()=>Ls,commandExists:()=>K9,ShellError:()=>MG,MAX_STDOUT_BYTES:()=>qT});async function $K($,Z=qT){let Q=$.getReader(),X=new TextDecoder,J="",K=0;try{while(K<Z){let{done:Y,value:V}=await Q.read();if(Y)break;if(!V)continue;if(K+=V.byteLength,K>Z){let z=V.byteLength-(K-Z);J+=X.decode(V.subarray(0,z),{stream:!0});break}J+=X.decode(V,{stream:!0})}J+=X.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return J}async function T0($,Z={}){let Q=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:Z.env?{...process.env,...Z.env}:process.env,cwd:Z.cwd}),X,J;if(Z.timeoutMs&&Z.timeoutMs>0)X=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}J=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},Z.timeoutMs);try{let[K,Y,V]=await Promise.all([$K(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:K,stderr:Y,exitCode:V}}finally{if(X)clearTimeout(X);if(J)clearTimeout(J)}}async function Ms($,Z={}){let Q=await T0($,Z);if(Q.exitCode!==0)throw new MG(`command failed (${Q.exitCode}): ${$.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function K9($){let Z=js($),Q=await T0(["sh","-c",`command -v ${Z}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function js($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function Ls($,Z="--version"){if(!await K9($))return null;let X=await T0([$,Z],{timeoutMs:5000});if(X.exitCode!==0)return null;return((X.stdout||X.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var qT=16777216,MG;var s8=v(()=>{MG=class MG extends Error{message;exitCode;stdout;stderr;constructor($,Z,Q,X){super($);this.message=$;this.exitCode=Z;this.stdout=Q;this.stderr=X;this.name="ShellError"}}});function w7($){return As?"":$}var As,k0,P8,c0,U18,J8,L8,Y9,d;var i5=v(()=>{As=(process.env.NO_COLOR??"").length>0;k0=w7("\x1B[0;31m"),P8=w7("\x1B[0;32m"),c0=w7("\x1B[1;33m"),U18=w7("\x1B[0;34m"),J8=w7("\x1B[0;36m"),L8=w7("\x1B[1m"),Y9=w7("\x1B[2m"),d=w7("\x1B[0m")});import{accessSync as ks,constants as xs,existsSync as Ss,statSync as bs}from"fs";async function a5(){if(R$!==void 0)return R$;let $="/opt/homebrew/bin/python3.12";if(Ss($))return R$=$,$;let Z=await K9("python3.12");if(Z)return R$=Z,Z;let Q=await K9("python3");return R$=Q,Q}async function L6($,Z={}){let Q=await a5();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return T0([Q,"-c",$],Z)}async function P7(){let $=(process.env.PATH??"").split(":").filter((Z)=>Z.startsWith("/"));for(let Z of[..._s,...$.map((Q)=>`${Q}/python3`)])try{if(!bs(Z).isFile())continue;if(ks(Z,xs.X_OK),(await T0([Z,"-I","-S","-c",""],{timeoutMs:1e4})).exitCode===0)return Z}catch{}return null}var R$,ys,_s;var X5=v(()=>{s8();ys=["/usr/bin/python3","/bin/python3"],_s=ys});var xT={};w0(xT,{runStatus:()=>Yr});import{existsSync as V9,readFileSync as $2,readdirSync as FT,statSync as DT}from"fs";import{resolve as u8,basename as rs}from"path";import{homedir as ts}from"os";function IT($){let Z=Math.trunc($);if(Z>=1e6)return`${(Math.trunc(Z/1e6*10)/10).toFixed(1)}M`;if(Z>=1000)return`${(Math.trunc(Z/1000*10)/10).toFixed(1)}K`;return String(Z)}function RT($,Z,Q){if(Z===0)return null;let X=Math.trunc($*100/Z),J=Math.trunc($*QK/Z);if(J>QK)J=QK;let K=QK-J,Y=P8;if(X>=80)Y=k0;else if(X>=50)Y=c0;let V="=".repeat(Math.max(0,J))+" ".repeat(Math.max(0,K)),z=IT($),W=IT(Z);return` ${L8}${Q}${d} ${Y}[${V}]${d} ${X}% (${z} / ${W})`}async function $r(){if(await K9("jq"))return!0;return process.stdout.write(`${k0}Error: jq is required but not installed.${d}
3
3
  `),process.stdout.write(`Install with:
4
4
  `),process.stdout.write(` brew install jq (macOS)
5
5
  `),process.stdout.write(` apt install jq (Debian/Ubuntu)
@@ -1509,4 +1509,4 @@ Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
1509
1509
  `),2}case"start":{let{runStart:X}=await Promise.resolve().then(() => (Hi(),Gi));return X(Q)}case"engine10":{let{runEngine10:X}=await Promise.resolve().then(() => (Oi(),Ui)),{registryLoader:J}=await Promise.resolve().then(() => (wq(),En));return X(Q,J)}default:return process.stderr.write(`Unknown command: ${Z}
1510
1510
  `),process.stderr.write(kn),2}}CT();process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var s28=await n28(Bun.argv.slice(2));process.exit(s28);
1511
1511
 
1512
- //# debugId=93B1362850CB1DE68DD759BC17BA17AA
1512
+ //# debugId=F3DD389212F7F6B8993327E6BC5771DD
package/mcp/__init__.py CHANGED
@@ -75,4 +75,4 @@ try:
75
75
  except ImportError:
76
76
  __all__ = ['mcp']
77
77
 
78
- __version__ = '10.3.0'
78
+ __version__ = '10.4.1'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "loki-mode",
3
3
  "mcpName": "io.github.asklokesh/loki-mode",
4
- "version": "10.3.0",
4
+ "version": "10.4.1",
5
5
  "description": "Loki Mode by Autonomi. Autonomous spec-to-product system: takes a PRD, GitHub issue, OpenAPI/JSON/YAML, or one-line brief to a deployed app via the RARV-C closure loop with 8 quality gates. Provider-agnostic (Claude Code, OpenAI Codex, Cline, Aider, opencode).",
6
6
  "keywords": [
7
7
  "agent",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "loki-mode",
4
4
  "displayName": "Loki Mode",
5
- "version": "10.3.0",
5
+ "version": "10.4.1",
6
6
  "description": "Autonomous spec-to-product build system with a built-in trust layer (RARV-C closure loop, 8 quality gates, completion council). Ships Loki's spec-hardening, drift-detection, and deterministic PR verification commands plus the Loki MCP server.",
7
7
  "author": {
8
8
  "name": "Autonomi",
@@ -1,4 +1,4 @@
1
- import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-B21YEJCf.js";import{B as C}from"./Button-Ccuh5Ouj.js";import{T as $e}from"./trending-up-CI1-zKRQ.js";import{C as z}from"./clock-DPpOjTHt.js";import{A as Be,U as ue,M as De}from"./Avatar-Dpl2qVf5.js";import{A as J}from"./activity-CrVuKK_W.js";import{R as pe}from"./refresh-cw-DxJsH1dQ.js";import{G as ze}from"./globe-CVJMaRaH.js";import{C as Le}from"./chevron-left-NsdJXeCD.js";import{C as je}from"./check-CzSi5Vci.js";import{D as Y}from"./dollar-sign-CgSGxJa7.js";import{U as Te}from"./user-cDtPlp5V.js";import{D as Me}from"./database-DS_5uXW_.js";import{L as Ue}from"./lock-SfmCbb4w.js";import{S as Re}from"./scroll-text-CsPrAnD5.js";import{S as Ie}from"./shield-alert-C0Xh-M1C.js";/**
1
+ import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-h49hpHj_.js";import{B as C}from"./Button-BubeNlVF.js";import{T as $e}from"./trending-up-DeiXF7_i.js";import{C as z}from"./clock-DxURKFW-.js";import{A as Be,U as ue,M as De}from"./Avatar-p9ksx_eu.js";import{A as J}from"./activity-DbmttG_6.js";import{R as pe}from"./refresh-cw-9k6QfjLX.js";import{G as ze}from"./globe-fb7DDJvp.js";import{C as Le}from"./chevron-left-Bsj7g0Lx.js";import{C as je}from"./check-NZElkYN9.js";import{D as Y}from"./dollar-sign-DcirTDYQ.js";import{U as Te}from"./user-LzUg4eFF.js";import{D as Me}from"./database-DyH1aJKS.js";import{L as Ue}from"./lock-AWuJecY0.js";import{S as Re}from"./scroll-text-VliGSgXD.js";import{S as Ie}from"./shield-alert-BudxBT3Y.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as l,j as s}from"./index-B21YEJCf.js";/**
1
+ import{c as l,j as s}from"./index-h49hpHj_.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{j as e}from"./index-B21YEJCf.js";import{C as r}from"./clock-DPpOjTHt.js";import{C as a}from"./circle-alert-BuKEAV8n.js";import{C as l}from"./check-CzSi5Vci.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
1
+ import{j as e}from"./index-h49hpHj_.js";import{C as r}from"./clock-DxURKFW-.js";import{C as a}from"./circle-alert--R-03UOi.js";import{C as l}from"./check-NZElkYN9.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
@@ -1 +1 @@
1
- import{r as p,j as t}from"./index-B21YEJCf.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
1
+ import{r as p,j as t}from"./index-h49hpHj_.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
@@ -1,4 +1,4 @@
1
- import{c as $,r as l,j as e,G as we,Q as Se,F as Ce,h as Re,T as U,Z as Ee,a as S,V as Me,S as $e,Y as Te,X as Pe,P as ie,i as Ae,g as ze,C as Ie,l as Le,N as I,J as _e,K as De,O as Fe,u as Oe}from"./index-B21YEJCf.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-CI756a2c.js";import{C as qe,F as Ge,M as Ue,H as Ke,a as We,G as Ve,T as Qe}from"./thumbs-up-oWNeyoZv.js";import{C as oe}from"./check-CzSi5Vci.js";import{C as Ye}from"./clock-DPpOjTHt.js";import{D as Xe}from"./dollar-sign-CgSGxJa7.js";import{U as Ze}from"./upload-CBtBD85L.js";import{L as V}from"./loader-circle-HrXWSqei.js";/**
1
+ import{c as $,r as l,j as e,G as we,Q as Se,F as Ce,h as Re,T as U,Z as Ee,a as S,V as Me,S as $e,Y as Te,X as Pe,P as ie,i as Ae,g as ze,C as Ie,l as Le,N as I,J as _e,K as De,O as Fe,u as Oe}from"./index-h49hpHj_.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-DiuMh-ej.js";import{C as qe,F as Ge,M as Ue,H as Ke,a as We,G as Ve,T as Qe}from"./thumbs-up-DG8YD2t0.js";import{C as oe}from"./check-NZElkYN9.js";import{C as Ye}from"./clock-DxURKFW-.js";import{D as Xe}from"./dollar-sign-DcirTDYQ.js";import{U as Ze}from"./upload-TsptvdQm.js";import{L as V}from"./loader-circle-CuJseaIc.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as o,j as e}from"./index-B21YEJCf.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
1
+ import{r as o,j as e}from"./index-h49hpHj_.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
@@ -1,4 +1,4 @@
1
- import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-B21YEJCf.js";/**
1
+ import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-h49hpHj_.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as l,a as x,j as e}from"./index-B21YEJCf.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
1
+ import{r as l,a as x,j as e}from"./index-h49hpHj_.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
@@ -1,4 +1,4 @@
1
- import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-B21YEJCf.js";import{B as N}from"./Button-Ccuh5Ouj.js";import{C as y}from"./thumbs-up-oWNeyoZv.js";import{R as S}from"./refresh-cw-DxJsH1dQ.js";import{C as z}from"./circle-alert-BuKEAV8n.js";import{U as D}from"./user-cDtPlp5V.js";import{L as G}from"./loader-circle-HrXWSqei.js";import{R as T}from"./rotate-ccw-Dkny920M.js";/**
1
+ import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-h49hpHj_.js";import{B as N}from"./Button-BubeNlVF.js";import{C as y}from"./thumbs-up-DG8YD2t0.js";import{R as S}from"./refresh-cw-9k6QfjLX.js";import{C as z}from"./circle-alert--R-03UOi.js";import{U as D}from"./user-LzUg4eFF.js";import{L as G}from"./loader-circle-CuJseaIc.js";import{R as T}from"./rotate-ccw-BKfPqp6g.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as I,r as c,a as b,j as e,G as me,A as ue,S as Z,k as ee,m as pe,h as he,p as fe,X as te,M as be}from"./index-B21YEJCf.js";import{B as y}from"./Button-Ccuh5Ouj.js";import{C as ge}from"./chevron-left-NsdJXeCD.js";import{G as P}from"./thumbs-up-oWNeyoZv.js";import{R as $}from"./refresh-cw-DxJsH1dQ.js";import{C as Ne}from"./circle-alert-BuKEAV8n.js";import{L as Q,S as je}from"./ProjectPage-O7UQyFey.js";import{S as se}from"./shield-alert-C0Xh-M1C.js";import{F as ye}from"./file-code-corner-B7iTiGB-.js";import{C as V}from"./clock-DPpOjTHt.js";import{C as re}from"./check-CzSi5Vci.js";import"./ErrorBoundary-CI756a2c.js";import"./TerminalOutput-C__6qBqv.js";import"./lock-SfmCbb4w.js";import"./package-CwpZESj_.js";import"./file-plus-rxLXNljV.js";import"./activity-CrVuKK_W.js";import"./scroll-text-CsPrAnD5.js";import"./bot-DmykFcjH.js";import"./loader-circle-HrXWSqei.js";import"./hammer-C9KdE6y9.js";import"./dollar-sign-CgSGxJa7.js";import"./globe-CVJMaRaH.js";import"./trash-2-BMv5WQCZ.js";import"./upload-CBtBD85L.js";import"./plus-DLh1-x2y.js";import"./rotate-ccw-Dkny920M.js";import"./code-xml-CUdET1iT.js";import"./trending-up-CI1-zKRQ.js";import"./layers-DNIDOX7S.js";import"./trending-down-CUoz-SBV.js";import"./server-E6pPKQNp.js";/**
1
+ import{c as I,r as c,a as b,j as e,G as me,A as ue,S as Z,k as ee,m as pe,h as he,p as fe,X as te,M as be}from"./index-h49hpHj_.js";import{B as y}from"./Button-BubeNlVF.js";import{C as ge}from"./chevron-left-Bsj7g0Lx.js";import{G as P}from"./thumbs-up-DG8YD2t0.js";import{R as $}from"./refresh-cw-9k6QfjLX.js";import{C as Ne}from"./circle-alert--R-03UOi.js";import{L as Q,S as je}from"./ProjectPage-iu7achd2.js";import{S as se}from"./shield-alert-BudxBT3Y.js";import{F as ye}from"./file-code-corner-D25VLaas.js";import{C as V}from"./clock-DxURKFW-.js";import{C as re}from"./check-NZElkYN9.js";import"./ErrorBoundary-DiuMh-ej.js";import"./TerminalOutput-EiD6R33t.js";import"./lock-AWuJecY0.js";import"./package-FOl48t3g.js";import"./file-plus-CXZAUQHR.js";import"./activity-DbmttG_6.js";import"./scroll-text-VliGSgXD.js";import"./bot-CBpm5F9l.js";import"./loader-circle-CuJseaIc.js";import"./hammer-B0CgWTnB.js";import"./dollar-sign-DcirTDYQ.js";import"./globe-fb7DDJvp.js";import"./trash-2-C3OCq0ib.js";import"./upload-TsptvdQm.js";import"./plus-B0rvkQ0K.js";import"./rotate-ccw-BKfPqp6g.js";import"./code-xml-DbI4aSEX.js";import"./trending-up-DeiXF7_i.js";import"./layers-D7e5s5oV.js";import"./trending-down-DdhqjRcI.js";import"./server-CDRRtXH3.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.